Java谜题-有人能解释这种行为吗?
上述程序产生以下输出:Java谜题-有人能解释这种行为吗?,java,abstract-class,puzzle,Java,Abstract Class,Puzzle,上述程序产生以下输出: abstract class AbstractBase { abstract void print(); AbstractBase() { // Note that this call will get mapped to the most derived class's method print(); } } class DerivedClass extends AbstractBase { int v
abstract class AbstractBase {
abstract void print();
AbstractBase() {
// Note that this call will get mapped to the most derived class's method
print();
}
}
class DerivedClass extends AbstractBase {
int value = 1;
@Override
void print() {
System.out.println("Value in DerivedClass: " + value);
}
}
class Derived1 extends DerivedClass {
int value = 10;
@Override
void print() {
System.out.println("Value in Derived1: " + value);
}
}
public class ConstructorCallingAbstract {
public static void main(String[] args) {
Derived1 derived1 = new Derived1();
derived1.print();
}
}
我不明白为什么AbstractBase
构造函数中的print()
总是映射到最派生的类(这里Derived1
)print()
为什么不
DerivedClass
的print()
?有人能帮我理解这一点吗?因为所有非显式super
调用的Java方法调用都被分派到最派生的类,即使在超类构造函数中也是如此。这意味着超类可以从子类行为中获益,但也意味着重写方法理论上可以在该类的构造函数之前被调用。超类构造函数中的虚拟化
看一看John您是否有明确解释此行为的参考资料(在java规范中的某些地方)这是一个很好的难题,但不要在生产代码中这样做。
Value in Derived1: 0
Value in Derived1: 10