第五章 初始化与清理
目录
Java中采用了构造器,并额外提供了垃圾回收器
5.1 用构造器确保初始化
Java中,通过提供构造器,类的设计者可以确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行
创建对象时,将会为对象分配存储空间,并调用相应的构造器
不接受任何参数的构造器饺子默认构造器(Java文档中通常使用术语:无参构造器)
在Java中,初始化和创建捆绑在一起,两者不能分离
构造器是一种特殊类型的方法,因为它没有返回值(与返回值为空(void)的方法不同)
5.2 方法重载
5.2.1 区分重载方法
每个重载方法必须有一个独一无二的参数类型列表
5.2.2 涉及基本类型的重载
基本类型能从一个“较小”的类型自动提升到一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆
5.2.3 以返回值区分重载方法
根据方法的返回值来区分重载方法是行不通的
5.3 默认构造器
如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动构建默认构造器
5.4 this关键字
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用
如果在方法内调用同一个类的另一个方法,就不必使用this,直接调用即可
当前方法中的this引用会自动应用于同一类中的其他方法
this关键字对于将当前对象传递给其他方法也很有用
5.4.1 在构造器中调用构造器
可用this关键字做到这点
在构造器中,如果为this添加了参数列表,将产生对符合此参数列表的某个构造器的明确调用;这样,调用其他构造器就有了直接的途径
尽管可以用this调用一个构造器,但却不能调用两个;此外,必须将构造器调用置于最起始处,否则编译器会报错
参数和数据成员名称相同,会产生歧义,用this.s表示数据成员
除构造器外,编译器禁止在其他任何方法中调用构造器
5.4.2 static的含义
static方法就是没有this的方法
在static方法的内部不能调用非静态方法
可以在没有创建任何对象的前提下,仅通过类本身来调用static方法
5.5 清理:终结处理和垃圾回收
特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。
Java运行在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并在下一次垃圾回收动作发生时才会真正回收对象占用的内存
- 对象可能不被垃圾回收
- 垃圾回收并不等于“析构”
- 垃圾回收只与内存有关
5.5.1 finalize()的用途何在
使用垃圾回收器的唯一原因是为了回收程序不再使用的内存
所以,对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),它们必须同内存及其回收有关
特殊情况:使用“本地方法”
本地方法是一种在Java中调用非Java方法的方式
5.5.2 你必须实施清理
垃圾回收器的存在并不能完全代替析构函数(而且绝对不能直接调用finalize())
无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾垃圾回收以恢复内存的
5.5.3 终结条件
对象终结条件的验证:
当某个对象不再感兴趣——也就是它可以被清理了,这个对象应该处于某种状态,使它占用的内存可以被安全地释放
只有对象中存在没有被适当清理的部分,程序就存在很隐晦的缺陷
finalize()可以用来最终发现这种情况——尽管它并不总是会被调用