在派生类构造函数中调用超类构造函数时,为什么id = 0的值? 创建子对象时,何时在对象的堆中分配内存?基类构造函数运行之后或之前?
class Parent{
int id = 10;
Parent(){
meth();
}
void meth(){
System.out.println("Parent :"+ id);
}
}
class Child extends Parent{
int id = 5;
Child(){
meth();
}
void meth(){
System.out.println("Child :"+ id);
}
}
public class OverRidingEg {
public static void main(String[] args) {
// TODO Auto-generated method stub
Child a= new Child();
}
}
答案 0 :(得分:5)
首先执行超类构造函数。因此,当调用重写方法时,子构造函数尚未执行,因此子类中的id
字段仍具有其默认值。
这就是为什么从构造函数中调用可覆盖的方法是一种不好的做法,由PMD等工具标记:当调用这样的方法时,不满足对象的不变量。