【发布时间】:2011-09-13 14:04:02
【问题描述】:
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,也就是 B 的上面的 foo,所以它应该打印“Anonymous:foo”。我怎么了?
非常感谢。
【问题讨论】:
标签: java inheritance anonymous overriding