开发者社区> 问答> 正文

java内部类继承的问题?报错

关于内部类的继承有些疑问想请教下大家:

1.eclipse上保存提示

No enclosing instance of type Outer is available due to some intermediate constructor invocation
但是可以编译、运行都没问题。 这里eclipse检查错误的机制是什么?
public class Outer {
	public class InnerSub extends Outer{
	}
	public class InnerSub_2 extends InnerSub{
	}

	public static void main(String ... args) throws Exception{
		Outer.InnerSub sub = new Outer().new InnerSub();
		System.out.println("run...");
	}
}

2.还是上面这段代码,创建InnerSub_2的实例对象会报错,但是如果改成下面的则可以。(将InnerSub类改成static也可以使这种继承关系成立)

public class Outer {
	public class InnerSub{// extends Object{
	}
	public class InnerSub_2 extends InnerSub{
	}

	public static void main(String ... args) throws Exception{
		Outer.InnerSub sub = new Outer().new InnerSub();
		Outer.InnerSub sub2 = new Outer().new InnerSub_2();
		System.out.println("run...");
	}
}

No enclosing instance of type Outer is available due to some intermediate constructor invocation
为什么内部类继承外部类会造成这种问题,能说说其中的细节吗?谢谢!



展开
收起
爱吃鱼的程序员 2020-06-10 11:05:36 630 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    好奇葩的一个问题,我也没遇到过,我尝试了解了下这个问题

    先说说为什么上面的能运行吧,因为报错的是 InnerSub_2类,而 InnerSub已经被正确的编译,并产生了Outer$ InnerSub.class文件,所以你可以执行

    而后要理解第二个问题就比较麻烦了,先看下一个老外写的解释:

    Whatishappeningis...aninnerclassneedsaninstanceoftheouterclassforittobeinstantiated

    好吧,虽然能看懂,我也没有很好的理解,大致意思就是由于 InnerSub不是static的,所以在构造 InnerSub_2的时候必须要有一个Outer的实例来访问 InnerSub,所以解决办法有2:

    1.你说的static方法

    2.给 InnerSub_2加一个构造方法并传入 Outer实例

    public InnerSub_2 (Outerouter){
     outer.super();
    }

    说了这么多我根本不知道自己在讲什么


    ---------------------------更新 

    我又看了下这个问题,你主要矛盾是在继承Outer上吧,嗯,这个应该是Eclipse的bug,因为你直接用javac是可以直接编译Outer.java的,也可以正常执行javaOuter,而我上面的方法2只是用来解决这个bug的。。。

    说了这么多,最重要的还是不要写这种充满疑惑的代码,只会让自己和别人更恼火

    这样的内部继承关系也是早上在贴吧看到的,不过他的问题是在创建内部类实例的时候犯的错。确实,内部类继承外部类,内部类再继承内部类这种写法实在是想不出有什么需求会用到。我在stackoverflow上也搜到了类似的回答:aninnerclass(withoutthestaticmofifier)hasanimplicitreferencetoaninstanceofitsouterclass。意思也差不多,同样我也不是很理解其中的具体细节。不过还是很感谢你的回答,谢谢!
    2020-06-10 11:05:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载