我正在学习内部课程。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写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();
只要有可能,就应该强烈建议使用静态成员类,而不是内部类。仅当成员类对象确实必须具有超类实例(这是不常见的)时,才使用内部类。