メソッド呼び出しは、メソッドが呼び出されるオブジェクトの型にのみ依存し、呼び出しに使用される参照型には依存しません。
あなたの場合、どちらの場合も、タイプ 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