关于内部类的继承有些疑问想请教下大家:
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为什么内部类继承外部类会造成这种问题,能说说其中的细节吗?谢谢!
好奇葩的一个问题,我也没遇到过,我尝试了解了下这个问题
先说说为什么上面的能运行吧,因为报错的是 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。意思也差不多,同样我也不是很理解其中的具体细节。不过还是很感谢你的回答,谢谢!版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。