第五章 - 初始化与清理
5.1 用构造器确保初始化
采用构造器来初始化对象, 与类的名字一致, 没有返回值
5.2 方法重载 - 方法名字一样, 形参不一样
5.3 默认构造器 - 编译器默认创建, 一般有其他的构造函数, 编译器就不在自动创建默认构造器
5.4 This 关键字
- 在方法中使用, 表示对当前方法的对象的引用
- 在构造函数中调用构造函数,必须置于方法起始处,而且只能调用一次
5.5 清理 : 终结处理和垃圾回收
一旦垃圾回收器准备释放对象占用的存储空间,将首先调用finalize方法, 并在下一次垃圾回收动作发生时,在真正的回收对象占用的内存
如何标记对象死亡 ?
1) 引用计数 - 循环依赖的问题解决不了
2) 可达性分析 - 从栈和静态存储区开始遍历引用
垃圾回收的特点 - 自适应、停止复制、标记清除,分代的
虚拟机其他的优化技术 - JIT : 将程序全部或者部分变异成本地机器码
5.6 成员初始化
Java尽力保证所有的变量在使用前都被恰当的初始化; 对于局部变量, 如果没有初始化,会提示编译错误; 对于成员变量,基本类型有默认的初始值, 对于引用类型, 默认值为Null
5.6.1 指定初始化
可以在成员变量定义处为其赋值
5.7 构造初始化
构造函数仍然无法阻止自动初始化的进行, 会在构造函数调用之前进行默认初始化
5.7.1 初始化顺序
在类的内部, 变量定义的顺序决定了变量的初始化顺序
5.7.2 静态数据初始化
无论创建多少个对象,静态数据都只有一份存储区域
对象的创建过程
1)加载class
2)在堆上为对象分配空间,成员变量为默认值
3) 执行出现于字段定义处的初始化
4) 执行构造器
5.7.3 显示的静态初始化
5.7.4 非静态实例初始化
5.8 数组初始化
定义 :类型后面加上一对空括号;编译器不允许指定数组的大小,这里仅仅是定义了数组的引用,而没有给对象本身分配任何空间
在数组的定义处可以用特殊的表达式 int[] a1 = {1,2}
数组有一个固有成员, length
理解数组的初始化
5.8.1 可变参数列表
5.9 枚举类型
JDK 1.5 之后引入