Java无难事:详解Java编程核心思想与技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

7.7 内部类的继承与覆盖

7.7.1 内部类的继承

由于创建内部类对象的时候需要外部类的对象,所以在继承内部类的时候情况就会变得复杂,我们需要确保内部类对象与外部类对象之间的引用正确建立,为了解决这个问题,Java给我们提供了一种特殊的语法,来说明它们之间的关系。

我们看代码7.16。

img

类InheritInner从Outer类中的内部类Inner继承,为了建立内部类Inner的对象到外部类Outer的对象之间的联系,需要在子类InheritInner中定义一个特殊的构造方法,其参数是外部类对象的引用,然后在构造方法中使用“ou.super();”这种特殊语法的语句,来建立内部类对象到外部类对象的引用关系。

在main方法中,可以看到,依然是先建立外部类对象,然后将该对象的引用传递给InheritInner类的构造方法。程序运行的结果是:

img

7.7.2 内部类的覆盖

编写一个类,从一个外部类继承,然后在类中重新定义外部类中的内部类,那么会发生什么情况呢?内部类是否会被重写呢?

我们编写代码7.17,来看看内部类是否会被覆盖。

img
img

类OverrideInner从外部类Outer继承,并重新定义了Outer中的内部类Inner。在基类Outer的构造方法中调用了内部类的foo方法,如果OverrideInner类对内部类Inner的覆盖成功,那么在构造OverrideInner这个派生类对象时,根据多态性的原理,应该调用的是被重写后的Inner类的foo方法,输出“Bar”,然而,程序运行的实际结果却是“Foo”。也就是说,OverrideInner类的内部类Inner对Outer类的内部类Inner没有任何影响,它们并不存在覆盖的关系,是完全独立的两个内部类,各自在自己的名称空间下。