the*_*ant 4 java inheritance constructor overriding
在派生类构造函数中调用超类构造函数时,为什么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();
}
}
Run Code Online (Sandbox Code Playgroud)
首先执行超类构造函数.因此,当调用重写方法时,子构造函数尚未执行,因此id子类中的字段仍具有其默认值.
这就是为什么从构造函数中调用可覆盖的方法是一种不好的做法,由PMD等工具标记:当调用这样的方法时,不满足对象的不变量.
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |