gpt4 book ai didi

java - 从其子类调用内部类的构造函数

转载 作者:行者123 更新时间:2023-11-29 06:58:06 29 4
gpt4 key购买 nike

我正在学习内部类。出于好奇,我扩展了具有参数化构造函数的内部类。但是当我编写 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类的 super 构造函数。

编译错误是:由于某些中间构造函数调用,没有可用的 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();

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

关于java - 从其子类调用内部类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880649/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com