Java에서 메서드 재정의 및 오버로드가 어떻게 작동하는지 기본적인 지식을 가지고 있습니다. 하지만 내 질문은 왜 컴파일러는 인수의 컴파일 유형을 기반으로 가장 구체적인 방법을 검색합니까? 즉, 메소드 오버로드의 경우 객체 유형이 아닌 참조 유형을 기반으로 검색하는 이유는 무엇입니까?Java에서 오버로드 된 메소드에서 다형성이 작동하지 않는 이유는 무엇입니까?
class Base { }
class Derived extends Base { }
class Test {
void foo(Base thing) { System.out.println("foo(Base)"); }
void foo(Derived thing) { System.out.println("foo(Derived)"); }
public static void main(String[] args) {
Test tester = new Test();
Base base = new Base();
tester.foo(base);// 1st call
base = new Derived();
tester.foo(base); // 2nd call
tester.foo(new Derived()); // 3rd call
}
}
실제 출력 아래의 예는
1st call: foo(Base)
2nd call: foo(Base)
3rd call: foo(Derived)
출력 내가 기대했다
점검
1st call: foo(Base)
2nd call: foo(Derived)
3rd call: foo(Derived)
[여기에 삽입하십시오.]가 중복되었습니다. 오버로딩은 변수의 정적 유형, 즉 # 1과 # 2에서 모두 'Base base'를 기반으로하는 컴파일 타임입니다. – zapl
이 경우 다형성과 관련하여 어떤 방법이 있습니까?이 메소드는 단순히 전달 된 내용이나 구체적으로 인쇄되는 객체 유형을 전달합니다. –