构造器
程序员文章站
2022-04-18 19:24:24
...
虽然,Java 的构造器非常的简单方便,但还是由我们需要值得注意的地方。
首先当然逃不过对象的初始化顺序。为了能够体现对象的顺序,我写了一个如下一个类,相信已经包含了所有的对象初始化顺序了
class Base {
public Base() {
System.out.println( "B");
}
}
class Inner {
public Inner() {
System.out.println( "D");
}
}
public class InitObject extends Base {
static {
System.out.println( "A");
}
{
System.out.println( "C");
}
private Inner inner = new Inner();
public InitObject() {
System.out.println( "E");
}
public static void main(String[] args) {
new InitObject();
}
}
有了对象的初始化那就要说说对象销毁,虽然说在Java 里面对象的销毁是有垃圾回收器进行自动的处理,但也不能避免我们有时希望程序调用方法对对象进行销毁的操作。在写对象的销毁操作时其实只要仅记一条原则就可以了:与对象的初始化操作正好相反。如果需要具体的说那么可以总结为3 点:1、 首先调用自己的销毁方法。2、属性的销毁。3、基类的销毁。基类的销毁放在最后是由于是导出类的销毁操作可能需要依赖与基类的方法。因此基类的销毁放在最后。
最后要说一个非常有趣的问题:多态。我们都知道Java 通过方法的“动态绑定”实现了多态,那么如果我们在构造器中调用该对象的方法会发生什么情况呢?他还会去调用子类的实现方法吗?我们用事实来证明这一切:
class Base {
public Base() {
test();
}
public void test() {
System.out.println( "Base");
}
}
public class Constructor extends Base {
private int i = 10;
public void test() {
System.out.println( "Constructor: i = " + i);
}
public static void main(String[] args) {
new Constructor();
}
}
运行的结果是:“Constructor: i = 0”。看样子test 方法是执行继承类Constructor 的test 方法,但是i 属性确实0,这是一个代码隐患。因此我们在编写构造器时要遵循这么一条准则:尽可能简单的方法使对象进入正常状态。如果可以的话,避免调用其他的方法。但是我们可以调用那些final 修饰的方法,private和静态方法,这些都是安全的,不会产生多态的行为。因为这些方法无法被继承。
上一篇: System.gc详解