2014-07-09 5 views
4

다음 코드를 고려 생각 :다형성 자바

public class A{ 
    private int num; 
    public A(int n){ 
     num = n; 
    } 
    public int getNum(){ 
     return num; 
    } 
    public boolean f(A a){ 
     return num == a.num * 2; 
    } 
} 

public class B extends A { 
    public B(int n) { 
     super(n); 
    } 

    public boolean f(B b) { 
     return getNum() == b.getNum(); 
    } 
} 

public class Main 
{ 
    public static void main(String[] args){ 
     A y1 = new B(10); 
     B y2 = new B(10); 
     System.out.println("y1.f(y2) is: "+y1.f(y2)); 
    } 
} 

방법 f 클래스 A에 대한 실행 (거짓 인쇄 이유를 내가 이해하지 못하는 것은)이고 B이 아니고 런타임에 원인이 y1 인 경우 B이고 g o B 클래스의 f 메소드로 이동 하시겠습니까?

+0

'C' 객체 란 무엇입니까? 나는 그것이 A의 또 다른 하위 클래스라고 추측하지만 어디에도 표시되지 않습니다. –

+1

YES 원인이 질문과 관련이 없음 –

+0

@ DanTemple : 'z1'과'z2'는 아무 곳에서도 사용되지 않는다는 점을 감안할 때, 이는 관련이 없으므로 (질문에서 제외해야합니다). –

답변

1

f 함수의 클래스 A & 클래스 A의 매개 변수가 다르기 때문에주의하십시오. 그 이유는 "중력 낮음"이 여기에 존재하지 않고 A.f 함수에 들어가는이 시간입니다.

+0

죄송 합니다만, 저는 이것을 전혀 이해하지 못합니다. "중력 낮음이 여기에 존재하지 않는다"는 것은 무엇을 의미합니까? –

+0

A1 = 새로운 B (10); 그것의 다형성. y1은 f 메서드를 호출 할 때 클래스 A의 메서드로 이동하지만 B 타입이기 때문에 상속에서 "아래로"내려다보고 같은 메서드가 "아래로"있는지 확인합니다. 이번에는 오버로딩이 있으며 클래스 A에서 메소드를 오버라이드하지 않습니다. – Udi

8

원인 런타임에 y1은 B 유형이므로 B 클래스의 f 메서드로 이동해야합니까?

아니오 :

  • B.f()하지 않습니다 재정A.f() 매개 변수 유형이 다르기 때문이다. 그것을 오버로드합니다. 당신이 유형 A보다는 B의 매개 변수를 받아 B.f()을 변경하는 경우
  • 오버로드가없는 실행 시간

에서, 컴파일시에 선택됩니다, 당신은 그것을 실행 얻을 볼 수 있습니다. 호출 시간은 의 실행 시간 유형이 아니라 대상인의 실행 시간 유형에 따라 달라집니다.

이 아닌으로 선택된 메소드 구현은 인수의 실행 시간 유형에 따라 다릅니다.