没有类型的封闭实例...在范围内

我研究了java内部类。

我写了例子:

public class Outer {
    public Outer(int a){}

    public class Inner {
        public Inner(String str, Boolean b){}
    }

    public static class Nested extends Inner{
        public static void m(){
            System.out.println("hello");
        }
        public Nested(String str, Boolean b , Number nm)   { super("2",true);   }
    }

    public class InnerTest extends Nested{
        public InnerTest(){  super("str",true,12);  }
    }
}

我使用以下字符串从main调用它:

 new Outer(1).new Inner("",true);

我看到编译错误:

  java: no enclosing instance of type testInheritancefromInner.Outer is in scope

你能解释一下这种情况吗?

更新

enter image description here


答案 1

Inner是一个内部类。仅当存在包含类定义的类的封闭实例时,才能创建它。Inner

但是,您已经创建了一个嵌套类,该类从此类扩展而来。当您尝试调用超级构造函数时staticNested

public Nested(String str, Boolean b , Number nm)   { super("2",true);   }

它将失败,因为 超构造函数 for 依赖于 的实例,该实例在类的上下文中不存在。Jon Skeet 提供了一个解决方案。InnerOuterstaticNested

解决方案的解释出现在此处的 JLS 中。

超类构造函数调用可以细分:

  • 非限定超类构造函数调用以关键字 super 开头(可能以显式类型参数开头)。

  • 限定的超类构造函数调用以主表达式开头。

    • 它们允许子类构造函数显式指定新创建对象相对于直接超类的立即封闭实例 (§8.1.3)。当超类是内部类时,这可能是必需的。

答案 2

正如 Sotirios 所说,您的嵌套(非内部)类没有隐式的实例来有效地提供给 .OuterInner

但是,您可以通过在部件之前显式指定它来绕过它:.super

public Nested(String str, Boolean b, Number nm) { 
    new Outer(10).super("2", true);
}

甚至接受它作为参数:

public Nested(Outer outer) { 
    outer.super("2", true);
}

但是,我强烈建议您避免这种复杂的代码。我大部分时间都避免嵌套类,几乎总是命名内部类,我不记得使用过这样的组合


推荐