我正在学习内部课程。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写super(int i)来调用它时,代码无法编译。

class Outer{
  class Inner{
    private int a;
    Inner(int i){
     this.a=i;
    }

    public void inheritFromInner(){
      System.out.println("Inherited from inner");
    }
  }
}

class Test extends Outer.Inner{
  Test(int r){
   super(r);// This line does not compile.
  }
}


内部类是外部类的一部分(成员),因此必须通过外部类进行访问。如何调用Test类的超级构造函数。

编译错误为:由于某些中间构造函数调用,没有Outer类型的封闭实例可用

最佳答案

现有的答案并未详细说明成员类别之间的差异。

成员类是在另一个类中声明的任何类。它们有时被称为嵌套类。在成员类的种类中,这里将不提及匿名内部类和局部类。其余成员类型是内部类和静态成员类。


内部类。内部类实例必须使用现有外部类实例的上下文实例化。内部类包含对外部类实例的隐式引用(这可能导致内部类实例导致内存泄漏的事实)。尽管不常见,您可以按以下方式实例化内部类实例:

Outer out = new Outer();
Outer.Inner inner = out.new Inner();


因为super()关键字必须是在子类构造函数中执行的第一行,所以如果确实需要将其构造在内部类中,则必须像这样声明构造函数:

class Test extends Outer.Inner{
    Test(Outer out, int r) {
        out.super(r);
    }
}

静态成员类。在类声明中使用修饰符static声明了静态成员类。在几乎所有重要的方面,静态成员类都是顶级类。像顶级类(和内部类不同)一样,它们不需要任何其他对象实例进行实例化。静态成员类对象通常被实例化为:

Outer.Inner inner = new Outer.Inner();



只要有可能,就应该强烈建议使用静态成员类,而不是内部类。仅当成员类对象确实必须具有超类实例(这是不常见的)时,才使用内部类。

09-11 19:35
查看更多