第四章 初始化与清理

第四章 初始化与清理

1.  用构造器确保初始化

在Java中,通过提供构造器这种特殊方法,类的设计这可确保每个对象都会得到初始化。当对象被创建,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,所以保证了初始化的进行。

    在考虑到构造器方法命名时,可能会遇到两个问题:第一,所取的名字可能与类的某个成员名称相冲突;第二,调用构造器是编译器的责任,所以必须让编译器直到应该调用哪个方法。Java采用:即构造器采用与类相同的名称进行解决。

2.  方法重载

每个重载的方法都必须有一个独一无二的参数类型列表。对于基本数据类型的重载,基本类型能从一个较小的数据类型自动提升至一个较大的类型;而要从一个较大的数据类型准换成较小的类型则需要进行强制转换(窄化转换),可能会丢失信息。

    如果类中并没有构造器,则编译器会自动创一个缺省的构造器,如果已经定义了一个构造器(无论是否有参数),编译器都不会自动创建缺省构造器。

    在面对创建对象

object a=new object,b=new object;

a.f(1);

b.f(2);

编译器是如何知道由a还是b来调用f()方法的呢,在这里是因为编译器在幕后做了工作,它暗自把“所操作对象的引用”作为第一个参数传递给f(),则是这样object.f(a,1)。

    对于this关键字的使用:this关键字只能在方法内部使用表示对“调用方法的哪个对象”的引用。如果在方法内部调用同一个类的另一个方法时则不必使用this。this关键字还能再构造器中使用,如果在构造器中,为this对象添加了参数列表,这将产生对符合此参数列表的某个构造器的明确调用,这也是从构造器中调用构造器的方法,但是使用this可调用一个构造器,但却不能调用两个,此外,必须将构造器调用置于最起始处,否则编译会出错。

3.     清理:终结处理和垃圾回收

Java垃圾回收器回收那些不需要的对象,但是垃圾回收器只知道释放那些经由new分配的内存,而存在一些特殊的对象则无法进行释放,这时,程序员可利用finalize()方法进行操作:因为垃圾回收器在释放对象时会提前调用finalize()方法,然后在下一次垃圾回收动作发生时才真正回收对象占用的内存,所以可利用此方法,在垃圾回收时做一些清理工作。

       要记住:对象可能不被垃圾回收;垃圾回收并不等于析构;垃圾回收只与内存有关。无论是垃圾回收还是终结,都不保证一定会发生。如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收来恢复内存的。

       垃圾回收依据的思想是:对任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。

4.     成员初始化

       在所有变量在使用前都需要进行恰当的初始化,对于定义在方法内部的局部变量,如果未进行初始化则会出现编译错误。而对于类的数据成员并且是基本类型的情况下,编译器会自动初始化一个默认值。因为正常程序员也有可能在方法中对数据成员进行初始化也是有可能的。

       在运行时刻,可以调用方法或执行某些动作来确定初值,这为编程带来了更大的灵活性。但是要牢记:无法阻止自动初始化的进行,它将在构造器被调用之前发生;在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之前,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。初始化的顺序是先静态对象而后是非静态对象。

原文地址:https://www.cnblogs.com/xiaobaidashu/p/12061811.html