g2 { ? ? ? public class Yolk extends Egg2.Yolk { ? ? ? ? ? ? ? public Yolk() { ? ? ? ? ? ? ? ? ? ? System.out.println("BigEgg2.Yolk()"); ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? public void f() { ? ? ? ? ? ? ? ? ? ? System.out.println("BigEgg2.Yolk.f()"); ? ? ? ? ? ? ? } ? ? ? } ? ? ? ? public BigEgg2() { ? ? ? ? ? ? ? insertYolk(new Yolk()); ? ? ? } ? ? ? ? public static void main(String[] args) { ? ? ? ? ? ? ? Egg2 e2 = new BigEgg2(); ? ? ? ? ? ? ? e2.g(); ? ? ? } } ? 输出结果为: Egg2.Yolk() New Egg2() Egg2.Yolk() BigEgg2.Yolk() BigEgg2.Yolk.f() ? 现在BigEgg2.Yolk 通过extends Egg2.Yolk 明确地继承了此内部类,并且重载了其中的方法。Egg2 的insertYolk()方法使得BigEgg2 将它自己的Yolk 对象向上转型,然后传递给引用y。所以当g()调用y.f()时,重载后的新版的f()被执行。第二次调用Egg2.Yolk()是BigEgg2.Yolk 的构造器调用了其基类的构造器。可以看到在调用g()的时候,新版的f()被调用了。 ? ? ? ? ? ? ? ? 内部类的继承问题(thinking in java 3th p294) 因为内部类的构造器要用到其外围类对象的引用,所以在你继承一个内部类的时候,事情变得有点复杂。问题在于,那个“秘密的”外围类对象的引用必须被初始化,而在被继承的类中并不存在要联接的缺省对象。要解决这个问题,需使用专门的语法来明确说清它们之间的关联: class WithInner { ? ? ? ? class Inner { ? ? ? ? ? ? ? ? Inner(){ ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("this is a constructor in WithInner.Inner"); ? ? ? ? ? ? ? ? }; ? ? ? ? } } ? public class InheritInner extends WithInner.Inner { ? ? ? ? // ! InheritInner() {} // Won't compile ? ? ? ? InheritInner(WithInner wi) { ? ? ? ? ? ? ? ? wi.super(); ? ? ? ? ? ? ? ? System.out.println("this is a constructor in InheritInner"); ? ? ? ? } ? ? ? ? ? public static void main(String[] args) { ? ? ? ? ? ? ? ? WithInner wi = new WithInner(); ? ? ? ? ? ? ? ? InheritInner ii = new InheritInner(wi); ? ? ? ? } } ? 输出结果为: this is a constructor in WithInner.Inner this is a constructor in InheritInner ? 可以看到,InheritInner 只继承自内部类,而不是外围类。但是当要生成一个构造器时,缺省的构造器并不算好,而且你不能只是传递一个指向外围类对象的引用。此外,你必须在构造器内使用如下语法: enclosingClassReference.super(); 这样才提供了必要的引用,然后程序才能编译通过。
|