Thinking in java 之:内部类的继承

来源:互联网 发布:潘家园配眼镜 知乎 编辑:程序博客网 时间:2024/05/22 06:48
因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密的”引用必须被初始化。
class InnerOut {class Inner {public void print() {System.out.println("Inner");}}}public class InheritInner extends InnerOut.Inner {InheritInner(){} //编译失败InheritInner(InnerOut io) {io.super();// 必须有}public static void main(String[] args) {Inner i = new InnerOut().new Inner();i.print();}}

要理解这个问题就得先理解内部类,Inner是InnerOut的内部类,那么一般的用法 InnerOut.Inner inner = new InnerOut(). new Inner() ;
我们可以看出要想创建Inner的对象必须先创建InnerOut的对象之后才能创建Inner对象,那么现在你要用一个类InheritInner继承Inner类,在继承过程中构造方法会被调用,即使你不写也会调用默认构造方法,但问题出现了,在调用父类Inner构造方法时找不到InnerOut的对象, 所以就必须给InheritInner类的构造方法传入InnerOut对象再通过io.super();方法调用Inner的默认构造方法,因为这是创建对象的基本流程,所以这句话io.super();是必须的。

class InnerOut {public InnerOut() {System.out.println("create InnerOut");}class Inner {public Inner() {System.out.println("create Inner");}public void print() {System.out.println("Inner");}}}public class InheritInner extends InnerOut.Inner {InheritInner(InnerOut i) {i.super();// 必须有}public static void main(String[] args) {InheritInner ii = new InheritInner(new InnerOut());}}
打印结果:

create InnerOut
create Inner

从上面得出结论:

在调用构造方法InheritInner(new InnerOut());的时候,首先会调用外部类的构造器,然后这里的i.super()调用的是内部类的默认构造器。

0 0