首先我们要搞清楚关于closure这个单词的逻辑关系。如果说内部类是一个closure,那么外部类就是enclosing class,because OuterClass encloses InnerClass。
如果一个一般类来继承内部类,需要在构造器中使用特殊的语法。
class Outer
{
class Inner {}
}
public class ExtInner extends Outer.Inner
{
public ExtInner(Outer o)
{
o.super();
}
}
ExtInner的构造器必须要有一个Outer参数,然后调用.super();。这里要求必须使用一个enclosingClassReference.super();。
你可能会问:在ExtInner的构造器里return o.new Inner();行不行?编译器会告诉你:constructor返回的还是void。这个是本话题的意外收获。
然后ExtInner中无法通过Outer.this来连接到外部类对象,在ExtInner中使用Outer.this会得到编译错误“Outer不是封闭类”(Java SE 1.5.0_15),这里的封闭类应该就是enclosing class的意思,“Outer不是封闭类”表示Outer并没有enclose ExtInner,虽然Outer有enclose Inner,且ExtInner继承自Inner。
如果Base有一个Inner,然后Ext继承了Base,这时Ext并没有继承Base.Inner的代码,即Base.Inner的代码没有复制到Ext中。此时,如果在Ext中也写一个Inner,其实是不会发生冲突的。
如果内部类、外部类双重继承,情况如何呢?看下面代码:
class BaseOuter
{
void print()
{
System.out.println("BaseOuter prints");
}
class BaseInner
{
void print2()
{
System.out.println("BaseInner prints");
}
void print3()
{
BaseOuter.this.print();
}
}
}
class ExtOuter extends BaseOuter
{
void print4()
{
System.out.println("ExtOuter prints");
}
class ExtInner extends BaseOuter.BaseInner
{
void print5()
{
System.out.println("ExtInner prints");
}
void print6()
{
ExtOuter.this.print4();
}
void print7()
{
BaseOuter.this.print(); //error: BaseOut is not the enclosing class
}
}
}
public class ExtInnerTest
{
public static void main(String[] args)
{
ExtOuter eo = new ExtOuter();
ExtOuter.ExtInner ei = eo.new ExtInner();
ei.print2();
ei.print3();
ei.print5();
ei.print6();
ei.print7(); //error: BaseOut is not the enclosing class
}
}
可以看到ExtInner可以通过向上转型变成BaseInner,然后再连接到BaseOut.this("ei.print3();"通过编译并运行),但是不能直接使用BaseOut.this("ei.print7();" won't compile)。
总结一点,内部类不能被外部类的导出类继承,外部类也不enclose内部类的导出类。