Вызов метода зависит только от типа объекта, для которого вызывается метод, а не от ссылочного типа, который используется для вызова.
Поскольку в вашем случае в обоих случаях должен вызываться метод объекта типа 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