2015-02-06 4 views
0

자바를 배우는 중이며이 연습을하고있어 기본 방법이 무엇을 인쇄하는지 말해야합니다. 그 목표는 Java 상속을 더 잘 이해하는 것입니다.기본 자바 상속 연습

X x = new C(); 
B b = new B(); 
(x.m(b)).m(b); // prints C.m() A.m() 

내 주요 방법, 인쇄 "CM() 오전()"의 세 번째 줄은하지만 내가 왜 이해가 안 :

interface X extends Remote{ 
    A m(B bb) throws RemoteException; 
} 

class A implements Serializable{ 
    int a; 
    A m(A aa){ 
     aa.a = 3; 
     System.out.println("A.m"); 
     return aa; 
    } 
} 

class B extends A{ 
    int b; 
    A m(B bb){ 
     bb.b = 7; 
     System.out.println("B.m"); 
     return bb; 
    } 
} 

class C extends A implements X{ 
    public B m(B bb){ 
     if(bb.b == 7) bb.b = 9; else bb.b = 1; 
     System.out.println("C.m"); 
     return bb; 
    } 
} 

지금 내가 전화하는 주요 방법이 Am()을 인쇄합니다. x.m (b)는 정적 유형과 동적 유형이 모두 == B 인 객체를 반환합니다. 이 객체에 대해 호출됩니다. m (b) method; 그래서 그것은 왜 B 클래스의 m() 메소드라고 불리지 않습니까?

B 클래스의 m() 메소드는 A 클래스의 m() 메소드를 다른 우선 순위 매개 변수를 가지고 있기 때문에 무시하는 것이 아닙니다. A 연장 B의 인스턴스에 미리

+4

나는 A, a, aa, m (A aa), a.m, aa.a와 같은 이름을 사용하는 것을 피하기 시작했다. 단지 코드를 읽기가 더 어렵게 만듭니다. –

+0

당신이 옳고 나는 당신에게 전적으로 동의합니다. 책에서 가져온 운동입니다. 상속을 탐색하는 것뿐입니다. C.m() B.m() 대신 C.m() A.m()을 왜 인쇄했는지에 대한 아이디어가 있습니까? 감사 m8 –

답변

5

b

감사합니다. 이와 같이, B은 2 개의 m 방법을 갖는다.

호출되는 항목을 확인하려면 메서드가 호출되는 개체 유형이 중요합니다. x의 선언 타입 X 때문에

(x.m(b)) 

X 인터페이스에서 m 메소드 호출의 결과이다.

따라서 (x.m(b))A 유형의 개체입니다 (실제 구현은 B 임에도 불구하고).

이 타입은 A이고 A 클래스의 m 메소드가 호출됩니다.

메서드의 이름을 변경하면 AB의 메서드가 실제로 다른 개체라는 것을 명확하게 알 수 있습니다.

내 실수

x.m (b)는 정적 및 동적 유형 == B를 가지고있는 개체를 반환한다고 가정된다; xx.m 유형 A의 결과를 만드는 유형 X으로 선언되어 있기 때문에, 잘못

.

+0

또 다른 중요한 점은 인수가 더 구체적이기 때문에'A' (Aaa) {'에서'B''Am (Bbb) {'의 메소드가'A''의 메소드를 오버라이드하지 않는다는 것입니다. A에서 메소드의 모든 호출에 응답 할 수 없습니다. (하지만 당신은 이미 그 부분을 이해했다고 생각합니다). – njzk2