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"인쇄해야합니다. 무엇이 잘못 되었습니까?
고마워요.
안녕하세요 어니스트.이 익명의 클래스를 작성하는 것이 B에서 확장되는 클래스를 작성하는 것과 같습니다. 그리고 b의 동적 유형이 될 것입니까? – Numerator
네, 그렇습니다. 그리고이 소문은 어떤 답을하지 않았습니까? –
다운 투표하려면 의견을 제공하십시오. –