2
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();
    }
}

上述程序产生以下输出:

Value in Derived1: 0
Value in Derived1: 10

我不明白为什么print()inAbstractBase构造函数总是被映射到最派生的类(这里Derived1print()

为什么不去DerivedClassprint()?有人可以帮助我理解这一点吗?

4

2 回答 2

9

因为所有不是显式调用的 Java 方法调用都super被分派到最派生的类,即使在超类构造函数中也是如此。这意味着超类获得子类行为的好处,但这也意味着理论上可以在该类中的构造函数之前调用覆盖方法。

于 2009-10-03T08:02:08.620 回答
2

超类构造函数中的虚拟化。

看看Super Class Constructor 中的虚拟化

于 2009-10-03T09:16:07.517 回答