Java 没有类型为的封闭实例。。。范围内

Java 没有类型为的封闭实例。。。范围内,java,inheritance,instantiation,inner-classes,Java,Inheritance,Instantiation,Inner Classes,我研究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.pri

我研究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
你能给我解释一下这种情况吗

更新


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

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

public Nested(String str, Boolean b , Number nm)   { super("2",true);   }
它将失败,因为
内部
的超级构造函数依赖于
外部
的实例,该实例在
嵌套的
类的
静态
上下文中不存在

JLS中会显示解决方案的说明

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

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

  • 限定的超类构造函数调用以主类开始 表情。

    • 它们允许子类构造函数显式指定新的 已创建对象的直接封闭实例(相对于 直接超类(§8.1.3)。当超类 是一个内部类。

正如Sotirios所说,嵌套(而非内部)类没有隐式地包含
Outer
的实例来有效地提供给
internal

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

public Nested(String str, Boolean b, Number nm) { 
    new Outer(10).super("2", true);
}
或者甚至接受它作为参数:

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

然而,我强烈建议您避免这种复杂的代码。我大多数时候都避免使用嵌套类,几乎总是使用内部类,我不记得这样组合使用它们。

请发布完整的代码。这是什么
testInheritancefromInner
?请参阅对外部类实例的引用,以便在
outer.super()之类的构造函数中使用
不仅可以是参数,还可以是字段。通过这种方式,您可以悄悄地将内部类扩展到外部类之外。