0

興味深いシナリオがあります。

public class Base {

    public void hello(){
        this.say();
        System.out.println("hello-Base");
    }

    protected void say(){
        System.out.println("say-Base");
    }
}



public class Derived extends Base {

    public Derived(){
        super.hello();      
    }

    public static void main(String[] args) {
        Derived d = new Derived();      
    }

    public void say(){
        System.out.println("say-Derived");
    }

}

与えられた出力は次のとおりです。

say-Derived
hello-Base

super.hello() メソッドが呼び出されると、派生クラスの say() メソッドではなく、基本クラスの say() メソッドが呼び出されることを期待していました。

このロジックの背後にある理由は何ですか?

4

3 に答える 3

2

Super.hello() は this.say() を呼び出します。 which(this) は現在のオブジェクト、つまり派生オブジェクトを参照するため、派生クラスの say メソッドを呼び出します。

于 2012-12-04T09:50:15.263 に答える
1

super.hello(); 派生コンストラクター、つまり派生クラスのオブジェクトから発生します。これは、this.say()、つまり、derived.say()を呼び出します。そのため、出力はそうです。

于 2012-12-04T09:58:14.223 に答える
1

-- が --->型のインスタンスをthis 指しているためDerived

Derivedそのため、クラスメソッドをオーバーライドするために呼び出されます。

于 2012-12-04T09:55:42.633 に答える