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

标签 java inner-classes

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

相关文章:

c++ - 声明但不定义内部结构/类——C++ 是否合法?

java - 我们可以为接口(interface)和抽象类创建对象吗?

java - 内部类允许静态字段和非常量静态表达式 - 为什么?

python - 函数参数名称中的类与嵌套类属性冲突

java - 将小部件添加到 map 会破坏 GWT 中的其他小部件

java - Spring Security 3.1 和不安全的 HTTP channel

java - 输入不是正确的UTF-8,指示编码

java - TX行锁争用: Inserting Duplicate values for Unique Key

c++ - CRTP - 嵌套叶类类型的可见性

java - System.currentTimeMillis vs System.nanoTime