第5章 初始化与清理
1. 用构造器确保初始化
在调用构造器创建对象的时候,就会完成初始化,所以构造方法中并没有对initialize()方法的明确调用,但是初始化和创建时捆绑在一起的,两者不能分离。
2. 方法重载
为了让方法名相同而形参不同的构造器同时存在,必须用到方法重载。同时,尽管方法重载时构造器所必需的,但它亦可应用于其他方法,且用法同样方便
在基本类型传递给重载方法时可能会发生类型提升或者类型窄化
无法以返回值区分重载方法、
3. 默认构造器
默认构造器是没有形式参数的---它的作用是创建一个“默认对象”。如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。但是,如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。
4. this关键字
在类的内部。只有当需要明确指出对当前对象的引用时,才需要使用this关键字。
比如,可以在构造器中通过this调用另一个构造器
static方法就是没有this的方法。在static方法的内部不能调用非静态方法
5. 清理:终结处理和垃圾回收
finalize方法 --- 一旦垃圾回收器准备好释放对象栈用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以如果打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
但是finalize()方法不相当于C++中的析构函数,因为Java里面的对象并非总是被垃圾回收。
如果在你不需要某个对象之前,如果必须执行某些动作,那么你得自己去做。
finalize()的用途何在
(1)finalize()不该作为通用的清理方法。finalize()方法是由Java中的本地方法(C,C++)使用的,用于这一部分方法使用的内存回收。
(2)finalize()还有一个有趣的用法,即进行对象终结条件的验证(因为要进行垃圾回收前一定会调用finalize()方法,所以可以在finalize()方法中做一些对象是否可以进行回收的检查)
Java中的垃圾回收
引用计数法
停止-复制
标记-清理(mark-and-sweep)
6 成员初始化
对于方法的局部变量,Java会要求所有变量都要进行初始化。
如果类的数据成员是基本类型,情况就不同。类的每个基本类型数据成员都会保证有一个初始值。
指定初始化
7 构造器初始化
初始化顺序----在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
静态数据的初始化-----无论创建多少个对象,静态数据都只栈用一份存储区域。static关键字不能应用于局部变量。
初始化的顺序,假设有个Dog类
(1) 当首次创建类型为Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件
(2) 然后载入Dog.class,有关静态初始化地所有动作都会执行。因此,静态初始化只在Class独享首次加载地时候进行一次(类加载)
(3) 当用new Dog()创建对象时,首先将在堆上为Dog对象分配足够地存储空间
(4) 执行所有出现于字段定义处地初始化动作
(5) 执行构造器
显式地静态初始化 --- 静态代码块也是在类加载地时候执行的
8 数组初始化
9. 枚举类型
enum类型比整型常量集更安全,会将自身的取值限制在这个常量集的范围之内。
可以用于switch语句