0

Aメソッドを定義するクラスがあるとしますbar()。このメソッドbar()は別のメソッドを呼び出しますfoo()。次に、拡張ABてオーバーライドし、オーバーライドfoo()しませんbar()(したがって、継承されます)。これらの2つのケースでどちらfoo()が呼び出されていますか?

A a = new B();
a.bar(); // A or B's foo called?

B b = new B();
b.bar(); // A or B's foo called?
4

4 に答える 4

3

どちらも B の foo() を使用します。B はインスタンスであるため、A a は B のメソッドにアクセスしているだけです。

A a をインスタンスのインターフェースと考えてください。この場合は new B() です。

以下に例を示します (groovy の場合): http://groovyconsole.appspot.com/script/616002

于 2011-12-21T05:15:49.860 に答える
1

A a = new B();と_B b = new B();

abBクラスのインスタンスなので、どちらの場合もb の foo()メソッドが呼び出されます。

メソッドが子クラス (この場合はBクラス) でオーバーライドされた場合、子オブジェクトのインスタンスは、親のクラス (この場合はAクラス) ではなく、それ自身のクラスに存在するメソッドを呼び出すためです。

于 2011-12-21T05:28:59.710 に答える
0

どちらの場合も B の foo メソッドを呼び出します。Java では、すべてのメソッド呼び出しが動的にディスパッチされます。呼び出す参照またはコンテキストは関係ありません。メソッド呼び出しは、オブジェクトのタイプに基づいて行われます。

于 2011-12-21T05:19:10.550 に答える
0

メソッド呼び出しは、メソッドが呼び出されるオブジェクトの型にのみ依存し、呼び出しに使用される参照型には依存しません。

あなたの場合、どちらの場合も、タイプ B のオブジェクトのメソッドが呼び出されるため、どちらも B の foo() を呼び出します。

class C {
    public void foo() {
        System.out.println("foo in C");
    }

    public void bar() {
        System.out.println("calling foo");
        foo();
    }
}


class B extends C {
    public void foo() {
        System.out.println("foo in B");
    }
}


public class A {


    public static void main(final String[] args) {
        C c = new B();
        c.bar(); // C or B's foo called?

        B b = new B();
        b.bar(); // C or B's foo called?

    }

出力は次のとおりです。

calling foo
foo in B
calling foo
foo in B
于 2011-12-21T05:22:20.053 に答える