[#0x0018] 对内部类的继承

  首先我们要搞清楚关于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内部类的导出类。

你可能感兴趣的:(ext)