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