为什么在派生类构造函数中调用超类构造函数时,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();
}
}
首先执行超类构造函数。所以当调用重写的方法时,子构造函数还没有被执行,所以id
子类中的字段仍然有默认值。
这就是为什么从构造函数调用可重写方法是一种不好的做法,PMD 等工具会标记这种做法:调用此类方法时,不会满足对象的不变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)