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コンストラクターが常に最も派生したクラスにマップされる理由がわかりません(here Derived1)print()

なぜにしないDerivedClassprint()ですか?誰かがこれを理解するのを手伝ってくれますか?

4

2 に答える 2

9

明示的な呼び出しではないすべての Java メソッド呼び出しはsuper、スーパークラス コンストラクターであっても、最も派生したクラスにディスパッチされるためです。これは、スーパークラスがサブクラスの動作の恩恵を受けることを意味しますが、オーバーライド メソッドが理論的にはそのクラスのコンストラクターの前に呼び出される可能性があることも意味します。

于 2009-10-03T08:02:08.620 に答える
2

スーパー クラス コンストラクターでの仮想化。

スーパー クラス コンストラクターでの仮想化をご覧ください。

于 2009-10-03T09:16:07.517 に答える