在范围内没有封闭类型的实例
我调查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
你能解释一下这种情况吗?
UPDATE
Inner
是一个内在阶级。 它只能在包含Inner
类定义的类的封闭实例时创建。
但是,您已经创建了一个static
嵌套类Nested
,它从此类扩展而来。 当您尝试调用超级构造函数时
public Nested(String str, Boolean b , Number nm) { super("2",true); }
它会失败,因为Inner
的超级构造函数依赖于Outer
一个实例,它在Nested
类的static
上下文中不存在。 Jon Skeet提供了一个解决方案。
解决方案的解释在此处出现在JLS中。
超类构造函数调用可以细分:
非限定的超类构造函数调用以关键字super开头(可能以显式类型参数开头)。
合格的超类构造函数调用以Primary表达式开头。
- 它们允许子类构造函数显式指定新创建的对象关于直接超类(第8.1.3节)的直接封闭实例。 当超类是内部类时,这可能是必要的。
正如Sotirios所说,你的嵌套(非内部)类并不隐含地有一个Outer
实例来有效地提供给Inner
。
但是,您可以通过在.super
部分之前明确指定它来解决此.super
:
public Nested(String str, Boolean b, Number nm) { new Outer(10).super("2", true); }
甚至接受它作为参数:
public Nested(Outer outer) { outer.super("2", true); }
但是,我强烈建议您避免使用这种错综复杂的代码。 我大部分时间都避免使用嵌套类,几乎总是命名为内部类,而且我永远不会记得像这样使用它们的组合 。