2012-09-14 2 views
0

은의 다음 코드를 보자 : 그 코드가 B를 작성하는 기대상속을

public class Test { 

    class A { 
     public A() {} 

     private void testMethod() { 
      System.out.println("A"); 
     } 
    } 

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

     private void testMethod() { 
      System.out.println("B"); 
     } 
    } 

    public Test() { } 

    public A get() { 
     return new B(); 
    } 

    public static void main(String[] args) { 
     new Test().get().testMethod(); 
    } 
} 

. 대신 A이 기록됩니다.

클래스가 포함하고있는 내부 클래스의 private 메서드를 호출 할 수 있다는 것이 이상하게 느껴질 수 있습니다 (왜 그런 식으로 만들었습니까?). 그러나 실제로 이해할 수없는 것은 무엇입니까? 왜 다형성이 작동하지 않습니다.

Test.main()에서 전화 할 경우 A.testMethod()이라고 부를 수 있습니다. 전화 번호는 B.testMethod()입니다. Java는 또한 객체의 동적 유형을 결정할 수 있습니다. 왜 Java가 동적 유형 중 하나 대신 선언 된 유형의 메소드를 호출합니까? 이 문제는 확인할 수 있습니다 : Test.A.testMethod()private 경우에만

public static void main(String[] args) { 
    B b = new Test().new B(); 
    A a = b; 
    b.testMethod(); // writes B 
    a.testMethod(); // writes A 
} 

또한, 왜 이런 일이 무엇입니까?

답변

3

컴파일시 선언은 개인 수정을 가지고 경우가 JLS #15.2.3

에 정의되어, 다음 호출 모드는 호출이 만약

그리고 JLS #15.4.4

비가 상이다 모드가 가상이 아니며 무시가 허용되지 않습니다. 클래스 T의 메소드 m이 호출 될 메소드입니다. (귀하의 경우 B) 런타임에 객체의 실제 타입에 반대 T은, 귀하의 경우 A에서 선언 된 유형입니다

. 즉, 개인적인 방법으로는 다형성이 없습니다.

0

Java에서 모든 비 정적 메서드는 기본적으로 "가상 함수"입니다. 및 메서드를 오버라이드 할 수없는 키워드는이 상속되지 않는 두 가지 특정 비 정적 메서드가 있습니다.

http://en.wikipedia.org/wiki/Virtual_function#Java

5

당신이 기다리고있어 동작은 가상의 방법에서 비롯됩니다.
개인 메서드는 가상이 아닙니다.

대신 동일한 이름을 가진 두 개의 관련없는 메소드가 있습니다.