2013-08-02 2 views
3

누군가이 결정을 어떻게 내렸는 지 설명해 주셨으면합니다. 나는 오버로드 된 버전이 선언 된 유형에 따라 선택되지만 두 번째 호출에서 런타임 유형에 따라 결정이 내려진 이유는 알고 있습니다. 사전에
오버로드 및 다형성

public class Test { 
     public static void main(String[] args) { 
      Parent polymorphicInstance = new Child(); 

      TestPolymorphicCall tp = new TestPolymorphicCall(); 
      tp.doSomething(polymorphicInstance); 
      // outputs: Parent: doing something... 

      call(polymorphicInstance); 
      // outputs: Child: I'm doing something too 
     } 
     public static void call(Parent parent){ 
      parent.doSomething(); 
     } 
     public static void call(Child child){ 
      child.doSomething(); 
     } 
    } 

    public class Parent { 
     public void doSomething() { 
      System.out.println("Parent: doing something..."); 
     } 
    } 
    public class Child extends Parent{ 
     @Override 
     public void doSomething() { 
      System.out.println("Child: I'm doing something too"); 
     } 
    } 

    public class TestPolymorphicCall { 
     public void doSomething(Parent p) { 
      System.out.println("Parent: doing something..."); 
     } 
     public void doSomething(Child c) { 
      System.out.println("Child: doing something..."); 
     } 
    } 

감사합니다!

답변

4

귀하의 부모 클래스 참조가 아동에 클래스 객체 참조한다 : 당신이 호출 방법의 기준을 통과 할 때

Parent polymorphicInstance = new Child(); 

그래서를, 호출 실제 방법은 부모 매개 변수 유형을 가진 하나입니다 만. 당신이 부모에 참조 방법 doSomething()를 호출 할 때 :

public static void call(Parent parent){ 
    parent.doSomething(); 
} 

을 그것은 당신이 아이 클래스에서 재정의되는 것으로, doSomething() 메소드를 호출합니다.


다형의 전형적인 경우이다. 모양이이고 하위 클래스가 인 서클 인 경우 calculateArea()모양이 클래스로 정의 된 것을 무시합니다.

Shape circle = new Circle(); 
// This will invoke the method in SubClass. 
System.out.println(circle.calculateArea()); 

당신은 하위 클래스에서 슈퍼 클래스 메소드를 오버라이드 (override)

후 호출 실제 방법은 무엇 실물 수퍼 클래스 참조 포인트를 기반으로 런타임에 결정됩니다. 이것은 동적 호출 메서드 호출이라고합니다.

+0

TestPolymorphicCall 클래스 메서드가 인수 참조를 전혀 호출하지 않기 때문에이 까다로운 예제와 혼동스럽게 생각합니다. 하지만 선언 된 타입 **에 기반하여 선택된 ** 메소드의 오버로드 된 버전에 관계없이 당신은 맞습니다. ** 다형 타입을 다룰 때, 호출되는 동작은 서브 타입입니다. –