java 不是封闭类,在范围内没有封闭类型的实例

I investigate java inner classes.

I wrote example:

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); }

}

}

I invoke it from main using following string:

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

I see compile error:

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

Can you explain me this situation?

UPDATE

NMYk3.png

解决方案

Inner is an inner class. It can only be created when there is an enclosing instance of the class containing the Inner class definition.

However, you've created a static nested class, Nested, which extends from this class. When you try to invoke the super constructor

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

it will fail because the super constructor, for Inner, depends on an instance of Outer, which doesn't exist in the static context of the Nested class. Jon Skeet provides a solution.

An explanation of the solution appears in the JLS here.

Superclass constructor invocations may be subdivided:

Unqualified superclass constructor invocations begin with the keyword

super (possibly prefaced with explicit type arguments).

Qualified superclass constructor invocations begin with a Primary

expression.

They allow a subclass constructor to explicitly specify the newly

created object's immediately enclosing instance with respect to the

direct superclass (§8.1.3). This may be necessary when the superclass

is an inner class.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值