您的位置:首页 > 编程语言 > Java开发

Thinking in java 之:内部类的继承

2015-09-07 13:14 281 查看
因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密的”引用必须被初始化。

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()调用的是内部类的默认构造器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: