第五章 初始化与清理
5.1 用构造器确保初始化
在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。
如何命名构造方法?
- 所取的任何名字都可能与类的某个成员名称相冲突
- 调用构造器是编译器的责任,所以必须让编译器知道应该调用哪个方法
故构造器采用与类相同的名称。
构造器是一种特殊类型的方法,因为它没有返回值。这与返回值为空(void)明显不同(对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西)。构造器则不会返回任何东西(new表达式确实返回了对新建对象的引用,但构造器本身并没有任何返回值)。
5.2 方法重载
Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法。
以返回值区分重载方法是行不通的。
5.4 this关键字
- this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用(return this表示返回当前对象)
- 在构造器中调用构造器
- 在static方法的内部不能调用非静态方法
5.5 清理:终结处理和垃圾回收
特殊内存
- 垃圾回收器只知道由new分配的内存
- GC无法回收非使用new分配的内存
finalize()
- 一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法;
- 在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
说明
- 对象可能不被垃圾回收
- 垃圾回收只与内存有关(使用垃圾回收器的唯一原因是为了回收程序不再使用的内存)
- 不能直接调用finalize()
垃圾回收器
垃圾回收器对于提高对象的创建速度,却具有明显的效果。
- 停止-复制
- 标记-清扫
- 自适应
5.6 成员初始化
强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。
- 变量定义的先后顺序决定了初始化的顺序。
- 变量会在任何方法(包括构造器)被调用之前得到初始化(即使变量定义在方法后)。
静态数据
- 无论创建多少个对象,静态数据都只占用一份存储区域。
- 静态初始化只有在必要时刻才会进行。
- 静态对象只会初始化一次
- 初始化顺序:静态对象 -> 非静态对象
- 构造器可以看成静态方法
5.8 数组初始化
- 自动装箱
- 如果你创建了一个非基本类型的数组,那么你就创建了一个引用数组。
5.9 枚举类型(enum)
- ordinal()方法,用来表示某个特定enum常量的声明顺序
- static values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组
- enum类型可以在switch语句内使用