2011-09-13 7 views
4
public class A { 
    public A() { 
     foo(); 
    } 

    private void foo() { 
     System.out.print("A::foo "); 
     goo(); 
    } 

    public void goo() { 
     System.out.print("A::goo "); 
    } 
} 

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

public void foo() { 
    System.out.print("B::foo "); 
} 

public void goo() { 
    System.out.print("B::goo "); 
} 

    public static void main(String[] args) { 

A b = new B() { 
     public void foo() {System.out.print("Anonymous::foo ");} 
     public void goo() {((B)this).foo();} 
     }; 

} 
} 

왜이 프로그램 인쇄 A::foo Anonymous::foo Anonymous::foo을 이해했는지 알고 싶습니다. 이 익명의 클래스가 이전 B를 대체합니까? 메서드를 재정의합니까?익명 클래스, 상속 및 재정의

필자는 A의 기본 생성자로 가서 A의 foo- print "A :: foo"를 실행해야합니다. B의 goo를 실행하는 것보다 적절하게 재정의되었으므로 이제 B의 goo가 Anonymous의 것입니다. 클래스, 그래서이 B 조 (아무것도 안 함) 캐스팅하고 foo 위의 foo, B 실행합니다, 그래서 "익명 : foo"인쇄해야합니다. 무엇이 잘못 되었습니까?

고마워요.

답변

4

귀하의 질문은 모든 것을 명확하지 않다, 그러나 저 그냥 대답이 경우 대신 B을 확장 익명 클래스의 정확히 같은 것이라고 가정 해 봅시다, 당신은 B을 확장 최상위 클래스를 C했다. 익명의 클래스에 대해서는 다형성과 상속과 관련하여 다르게 행동하지 않습니다. B의 생성자가 foo()을 호출하면 익명 클래스 인 여기에서 가장 파생 된 클래스의 재정의 버전이 호출됩니다.

+0

안녕하세요 어니스트.이 익명의 클래스를 작성하는 것이 B에서 확장되는 클래스를 작성하는 것과 같습니다. 그리고 b의 ​​동적 유형이 될 것입니까? – Numerator

+1

네, 그렇습니다. 그리고이 소문은 어떤 답을하지 않았습니까? –

+2

다운 투표하려면 의견을 제공하십시오. –

3

A의 constuctor는 개인용이므로 오버로드되지 않으므로 A.foo (A :: foo)를 호출합니다. A.foo는 B가 무시한 다음 Anonymous.goo -> Anonymous.foo (Anonymous :: foo)를 사용하여 goo()를 호출합니다. 그러면 B의 생성자가 foo를 호출하여 Anonymous에 의해 재정의됩니다. (Anonymous :: foo)

4

여기서 혼란스러운 것은 두 가지 foo 메소드가 있다고 생각합니다. 하나는 비공개이므로 재정의 할 자격이 없으며 다른 하나는 공개이므로 재정의 할 수 있습니다. B는 생성자에서 foo를 호출하지만 하위 클래스는이를 무시합니다.

+0

이것은 실제로 실현되었습니다. 감사. – Numerator

+0

@Nir : EFH에 동의합니다. 나는 당신이 무엇을 요구하고 있는지 분명하지 않습니다. –

+0

나는 인쇄되는 것을 왜 인쇄하는지 이해하지 못했고, 나는 그것이해야한다고 생각하는 것을 적었고, 당신의 교정과 설명을 기대했다. 이 구문에서이 익명 클래스를 오해했습니다. – Numerator

1

이러한 종류의 익명 구조를 사용하면 실제로 B의 하위 클래스가 만들어집니다. 익명 클래스에서 제공하는 B 메서드를 재정의하여 대신 사용하게됩니다.

+0

조나단 웨더 헤드 (Jonathan Weatherhead) 내 자신의 경험과 고통으로 네가 옳다. 그게 정확히 무슨 일이야. 그러나 "공식적인"문서 어디서나이 동작을 설명 할 수는 없습니다. 그것을 찾는 것을 도와 줄 수 있습니까? 이 정보는 어디서 얻었습니까? – Legna

관련 문제