【发布时间】:2011-12-09 18:39:23
【问题描述】:
在以下示例中:
class Base {
int x=10;
Base() {
show();
}
void show() {
System.out.print ("Base Show " +x + " ");
}
}
class Child extends Base {
int x=20;
Child() {
show();
}
void show() {
System.out.print("Child Show " + x +" ") ;
}
public static void main( String s[ ] ) {
Base obj = new Child();
}
}
- 为什么输出如下图所示
Child Show 0 Child Show 20
- 我认为构造函数只有在其超级构造函数完成后才能访问实例成员。
我认为这里发生的事情是超级构造函数正在调用孩子的 show() 方法,因为该方法在 Child 中被覆盖。因为它已经被覆盖了,但是为什么 x 的值是 0,为什么它能够在超级构造函数完成之前访问这个方法?
【问题讨论】:
-
在对象构造过程中是否启用了虚拟处理机制?我怀疑不是。
-
在 C++ 中这可能会导致崩溃。
-
Effective Java 是一个很棒的 Java 资源,它非常详细地介绍了这一点。来自第 17 条:“构造函数不得直接或间接调用可覆盖的方法 (...) 如果覆盖方法依赖于子类构造函数执行的任何初始化,则该方法不会像预期的那样运行。...”如果您手头有这本书,我强烈建议您阅读此项目。
标签: java constructor