疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java继承内部类


 

   

  一般地,要想实例化一个内部类,如类Inner1,需要提供一个外围类的实例给构造器。一般情况下,它是隐式地传递给内部类的构造器,但是它也是可以以 expression.super(args) 的方式即通过调用超类的构造器显式的传递。

  public class Outer {

  class Inner1 extends Outer{

  Inner1(){

  super();

  }

  }

  class Inner2 extends Inner1{

  Inner2(){

  Outer.this.super();

  }

  Inner2(Outer outer){

  outer.super();

  }

  }

  }

  class WithInner {

  class Inner {}

  }

  class InheritInner extends WithInner.Inner {

  // ! InheritInner() {} // 不能编译

  /*

  * 这里的super指InheritInner类的父类WithInner.Inner的默认构造函数,而不是

  * WithInner的父类构造函数,这种特殊的语法只在继承一个非静态内部类时才用到,

  * 表示继承非静态内部类时,外围对象一定要存在,并且只能在 第一行调用,而且一

  * 定要调用一下。为什么不能直接使用 super()或不直接写出呢?最主要原因就是每个

  * 非静态的内部类都会与一个外围类实例对应,这个外围类实例是运行时传到内

  * 部类里去的,所以在内部类里可以直接使用那个对象(比如Outer.this),但这里

  * 是在外部内外 ,使用时还是需要存在外围类实例对象,所以这里就显示的通过构造

  * 器传递进来,并且在外围对象上显示的调用一下内部类的构造器,这样就确保了在

  * 继承至一个类部类的情况下 ,外围对象一类会存在的约束。

  */

  InheritInner(WithInner wi) {

  wi.super();

  }

  public static void main(String[] args) {

  WithInner wi = new WithInner();

  InheritInner ii = new InheritInner(wi);

  }

  }