Java 没有类型为的封闭实例。。。范围内
我研究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
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()之类的构造函数中使用
不仅可以是参数,还可以是字段。通过这种方式,您可以悄悄地将内部类扩展到外部类之外。