《Java核心技术》复习笔记 - 第四章 对象与类
1. 基本概念:类,数据域,方法,封装,对象
2. 类之间的关系:依赖(uses-a),聚合(has-a),继承(is-a)。一个类的方法操纵另一个类的对象,我们就说一个类依赖于另一个类。
3. 注意区别对象和对象变量,对象是存储在堆上的,对象变量在栈上分配空间,存储的是堆上对象的地址,对象变量就是对象引用,类似C++中的指针变量(指向对象的指针)。
4. 构造器:构造器与类同名,每个类可以有一个以上的构造器,构造器可以有0个,1个或1个以上的参数,构造器没有返回值,构造器总是伴随着new操作一起调用。
5. 不要编写返回引用可变对象的访问器方法,如返回一个员工的入职日期hireDate,不能直接返回数据域,这样会被外部非法修改。如果需要返回一个可变对象的引用,应该首先对它进行克隆clone。
6. 基于类的访问权限:一个方法可以访问所属类的所有对象的私有数据,C++也有同样的原则。
7. 类似C++中的const成员变量,可以将实例域定义为final,构建对象时必须初始化这样的域。final一般用于修饰基本数据类型域或不可变类(如果一个类中的所有方法都不改变其对象,这种类就是不可变类)的域。final修饰引用变量时,是说该引用变量初始化后不能指向其它对象,类似C++中的常指针,而其引用的对象还是可以被修改的。
8. 静态域又称类域,每个类只有一个这样的域。静态常量 static final也和C++类似。静态方法就是没有this参数的方法。
9. Java中的参数传递总是采用值调用。对象引用进行的也是值传递,传递的是对象的地址。引用类似C++中的对象指针,但是不需要进行解引用操作。
10. 类似C++,java中的方法也是可以重载overloading的,返回类型不是方法签名的一部分。
11. 默认域初始化:如果在构造器中没有显示的给域赋予初值,那么会被默认的赋值为默认值:数值为0,布尔值为false,对象引用为null。
12. 默认构造器:没有参数的构造器。如果编写类时,没有提供构造器,编译器会提供一个默认构造器将所有实例域设置为默认值。
13. 显示的进行域初始化:如private String name = “”;在执行构造器之前,先执行该赋值操作。当一个类的所有构造器都希望相同的值赋予某个特定的实例域时,这种方式特别有用。
14. 在一个构造器中调用(第一行语句)另一个构造器用this(),这样公共的构造器代码部分只需要编写一次即可,而在C++中,必须将抽取出的公共初始化代码编写成一个独立的方法。
15. 初始化块是用{}包围的初始化语句,在构造器主体代码之前运行。
16. 调用构造器的具体处理步骤:
1) 所有数据域被初始化为默认值(0,false或null)。
2) 按照在类声明中的出现次序,依次执行所有域初始化语句和初始化块。
3) 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
4) 执行这个构造器的主体。
17. 在类第一次加载时,将会进行静态域的初始化。与实例域一样,除非将它们显示地设置成指定值,否则默认的初始化值为0,false或null。所有静态初始化语句以及静态初始化块按照类定义中的顺序执行。import java.util.*; /** * This program demonstrates object construction. * @version 1.01 2004-02-19 * @author Cay Horstmann */ public class ConstructorTest { public static void main(String[] args) { // fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry", 40000); staff[1] = new Employee(60000); staff[2] = new Employee(); // print out information about all Employee objects for (Employee e : staff) System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } } class Employee { // three overloaded constructors public Employee(String n, double s) { name = n; salary = s; } public Employee(double s) { // calls the Employee(String, double) constructor this("Employee #" + nextId, s); } // the default constructor public Employee() { // name initialized to ""--see below // salary not explicitly set--initialized to 0 // id initialized in initialization block } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } private static int nextId; private int id; private String name = ""; // instance field initialization private double salary; // static initialization block static { Random generator = new Random(); // set nextId to a random number between 0 and 9999 nextId = generator.nextInt(10000); } // object initialization block { id = nextId; nextId++; } }
18. 一个源文件中只能有一个public类,可以有任意数目的非public类,文件名和public类一致。
19. 静态导入:导入静态方法和静态域。
20. 如果没有在源文件中使用package语句,则源文件置于默认包中,默认包为一个没有名字的包。
21. 包作用域:如果没有指定访问修饰符public,protected,或private,则这个部分(类,方法或变量)可以被同一个包中的所有方法访问。