Java 由另一个内部类扩展的内部类
Java 由另一个内部类扩展的内部类,java,inheritance,constructor,inner-classes,super,Java,Inheritance,Constructor,Inner Classes,Super,C类扩展B类时发生错误。但是,当我写新的A().super()时问题已解决。请考虑以下代码: public class A { public class B extends A { public class C extends B { public C() { // No enclosing instance of type A is available due to some in
C类扩展B类时发生错误。但是,当我写新的A().super()时代码>问题已解决。请考虑以下代码:
public class A {
public class B extends A {
public class C extends B {
public C() {
// No enclosing instance of type A is available due to some intermediate constructor error
// new A().super();
}
}
}
}
我的问题是为什么C类不能扩展B类?为什么要调用newa().super()代码>解决了问题?这是什么意思?有没有更好的方法来解决这个问题(不使用静态嵌套类)?最简单的代码段将被编译并执行,打印“OK”:
public class A {
public class B extends A {
public class C extends B {
public C() {
System.out.println("OK");
}
}
}
public static void main(String[] args) {
new A().new B().new C();
}
}
这里是A、B和C的另一个实例。也就是说,类C可以扩展类B,从您问题的初始代码片段开始。您的代码语法正确,无需添加任何不必要的newa().super()
考虑一下,让我们参考内部类的定义,这些定义是非静态的。对于静态情况,正确的名称是静态嵌套类
InnerClass的实例只能存在于OuterClass的实例中
要实例化内部类,必须首先实例化外部类
这意味着,内部类只存在于特定OuterClass实例的上下文中,而不存在OuterClass类,这就是为什么new A()
确实解决了这个问题,提供了运行时实例,其中类B
和C
确实存在于这两个版本中(有和没有new A().super()
编译对我来说很好。我正在运行java 1.8.0_144。您能更具体地说明“错误发生”和“问题”吗?关于“更好的解决方法”我会考虑将嵌套的类层次结构重构成单独的类,但当然这取决于实际代码是如何建模的。@亨利错误->没有A类型的封闭实例,因为一些中间结构“非静态内部”是一个重言式。调用新的A.()不解决问题。;解决了问题。请告诉我调用它的输出是什么?@Alice教程就在那里。你读了吗?调用newa().super();
指示编译器创建A
的新实例,然后调用超级构造函数(属于C
,即B
的构造函数)在A
上(因此是.super()
-部分)。因此,C
实例绑定到新创建的A
实例。@Turing85我同意A的新实例调用超级构造函数,但我不认为超级是C。@Alicesuper
是相对于C
进行解释的,而不是相对于A
,从而调用B
的构造函数。你能分享一下吗未正确编译的代码段?请考虑编译成功并打印“OK”的代码,请添加未编译的部分。