问:下面程序的运行结果是什么?
public class Base {
public Base() {
test();
}
public void test() {
}
}
public class Child extends Base {
private int a = 123;
public Child() {
}
public void test() {
System.out.println(a);
}
}
public static void main (String[]args ){
Child c = new Child();
c.test();
}
答:输出结果如下。
0
123
原因是 Child 类直接继承于 Base 类,默认构造方法虽然没有显示调用 super 但是也会直接调用父类的默认构造函数,所以上面程序首先调用 Base.java 的 test() 方法,这时 Child 类还没有构造完毕,a 是基本数据类型且还没有被赋值,a 又为成员变量,所以默认值为 0。
在父类的构造方法中调用可被重写的方法会调用子类中重写后的方法。
因此如果在父类构造方法中调用了可被重写的方法则可能会出现意想不到的效果,大家一定要慎重使用,最好在父类构造中只调用 private 方法。