메서드 호출은 메서드가 호출되는 개체 유형에만 의존하며 호출하는 데 사용되는 참조 형식에는 의존하지 않습니다.
두 경우 모두 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?
}
출력은 : A a = new B();
에서
calling foo
foo in B
calling foo
foo in B
출처
2011-12-21 05:22:20
Nik
이 경우 사실을 말하고 있지만 "모든 메서드 호출이 동적으로 전달됩니다."라고주의해야합니다. Java에는 다중 디스패치가 없습니다. 예를 들어 오버로드 된 메서드가있는 경우 전달되는 인수의 런타임 유형에 따라 호출되지 않는 메서드가 호출됩니다. –
메서드가 호출되는 개체의 형식을 기반으로합니다 인수의. – gkamal