1

最初の System.out.println が値 10 を出力しないのはなぜですか? 0 を出力します。最初に、親のコンストラクターを呼び出す新しい子オブジェクトが作成されます。親のコンストラクターは、動的バインディングのために子のルックアップを呼び出します。では、なぜ Child のルックアップは 10 ではなく 0 を返すのでしょうか?

public class Main332 {
    public static void main(String args[]) {

        Child child = new Child(); 
        System.out.println("child.value() returns " + child.value());//Prints 0

        Parent parent = new Child();
        System.out.println("parent.value() returns " + parent.value());//Prints 0

        Parent parent2 = new Parent();
        System.out.println("parent2.value() returns " + parent2.value());//Prints 5
    }
}


public class Child extends Parent { 
    private int num = 10; 

    public int lookup() {
        return num;
    }
}


public class Parent {
    private int val;

    public Parent() {
        val = lookup();
    }

    public int value() {
        return val;
    }

    public int lookup() {
        return 5;// Silly
    } 
}
4

1 に答える 1

3

numinのフィールド初期化子は、コンストラクター呼び出し in のChildに実行されます。したがって、0 を返すため、0 に設定されます。Parentlookup()Parent.val

これを観察するには、Child.lookup()これから返そうとしているものを出力するように変更してください。

新しいインスタンスを作成するときの実行順序の詳細については、Java 言語仕様のセクション 12.5 を参照してください。

于 2013-02-15T14:00:53.310 に答える