第五章 初始化和清除
一、用构造器自动初始化
1、构造器的名字与类名相同,可保证这样的一个方法会在初始化期间自动调用。
2、一旦创建了对象new Rock();就会分配相应的存储空间,并调用构造器。
3、构造器也能使用自变量。
4、构造器没有返回值。
二、方法重载
1、就是方法的重载。
2、每个过载的方法都必须采用独一无二的自变量类型列表。
3、主(数据)类型能从一个“较小”的类型自动变成一个“较大”的类型。
若自变量范围比原来的宽,就必须使用括号中的类型名将其转为适当的类型。(“缩小转换”)。
4、不能根据返回值类型来区分过载方法。
5、默认构造器是没有自变量的,他的作用就是构建一个“空对象”。若创建一个没有构造器的类,则编译程序会帮我们自动创建一个默认构造器。
然而,如果已经定义了一个构造器,编译程序就不会帮我们自动合成一个。
6、this关键字:可为已调用了其方法的那个对象生成相应的句柄。注意:假若准备从自己某个类的另一个方法内部调用一个类方法,就不必使用this。只需要简单地调用那个方法即可。当前的this句柄会自动应用于其他方法。
由于increment()通过this关键字返回当前对象的句柄,所以可以方便地对同一个对象执行多项操作。
(1)在构造器里调用构造器,以避免写重复的代码。可以用this关键字。(this指“这个对象”或者“当前对象”)。
(2)static的含义:意味着一个特定的方法没有this。不可以从哪个一个static方法内部发出对非static方法的调用,反过来是可以的。
三、清除:收尾和垃圾收集
1、垃圾收集器只知道释放那些由new分配的内存,不知道如何是否对象的“特殊”内存。
2、一旦垃圾收集器准备好释放对象占用的内存空间,首先调用finalize(),并且只有在下一次垃圾收集过程中,才能真正回收对象的内存。垃圾收集器可能在任何时间运行。
3、finalize():垃圾收集只与内存有关。不必过多地使用finalize()。
4、finalize()最有用处的地方之一:观察垃圾收集的过程。
before:自变量会调用System.gc()方法(强制执行垃圾收集器),同时还会调用System.runFinalization()方法,以便进行收尾工作。
after:调用的runFinalizersOnExit()方法只有Java1.1及以后版本提供了支持。
5、到程序结束,并非所有收尾模块都会得到调用。为强制进行收尾工作,可先调用System.gc(),再调用System。runFinalization()。这样可以清除到目前为止没有使用的所有对象。(官方说首先进行收尾模块,再释放存储空间。(有时候先调用runFinalization(),再调用gc(),收尾模块根本不会执行。))。
6、不管是用哪种方法强制进行垃圾手机,都可能注意到比没有额外收尾工作时较长的时间延迟。
四、成员初始化
1、在一个类的内部定义一个对象句柄,如果不将其初始化成新对象,那个句柄就会获得一个空值。
2、方法初始化与初始化的顺序有关,而不是与程序的编译方式有关。它的限制是类型Measurement的每个对象都会获得相同的初始化值。
3、构造器初始化:不可以妨碍自动初始化的进行,他在构造器进入之前就会发生。
(1)初始化顺序:在一个类里,初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍会在调用任何方法之前得到初始化——甚至在构造器调用之前。
(2)静态数据的初始化:由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。
(3)明确进行的静态初始化:静态块(“static构建从句”)。
(4)非静态实例的初始化:为了支持对“匿名内部类”的初始化。
4、对象的创建过程。考虑一个名为Dog的类:
(1)类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class。
(2)找到Dog.class后,所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
(3)创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4)这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值。
(5)进行字段定义时会发生的所有初始化都会执行。
(6)执行构造器。
五、数组初始化
1、静态初始化:初始化时由程序员显式指定每个数组元素的初始值,有系统决定数组的长度;
(1)arrayName = new type[]{element1,element2,element3...}
示例: int[] intArr;
intArr = new int[]{1,2,3,4,5,9};
(2)简化的静态初始化方式 type[] arrayName = {element1,element2,element3...};
示例:String[] strArr = {"张三","李四","王二麻"};
2、动态初始化:初始化时由程序员指定数组的长度,由系统初始化每个数组元素的默认值。
arrayName = new type[length];
示例:int[] price = new int[4];
注意:不要同时使用静态初始化和动态初始化,也就是说,不要在进行数组初始化时,既指定数组的长度,也为每个数组元素分配初始值。
一旦数组完成初始化,数组在内存中所占的空间将被固定下来,所以数组的长度将不可改变。