メソッド呼び出しは、メソッドが呼び出されるオブジェクトの型にのみ依存し、呼び出すために使用される参照型には依存しません。
どちらの場合も、タイプ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-21 05:22:20
Nik
この場合、あなたが言っていることは本当ですが、私は "すべてのメソッド呼び出しが動的にディスパッチされます"と注意しています。 Javaには複数のディスパッチがありません。たとえば、オーバーロードされたメソッドがある場合、渡された引数の実行時の型に基づいて、呼び出されるメソッドは動的ではありません。 –
メソッドが呼び出されるオブジェクトの型に基づいています議論の – gkamal