由另一个内部类扩展的内部类

由另一个内部类扩展的内部类

问题描述:

当发生class C extends B时发生错误。但是,当我写new 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(); 
       } 
      } 
     } 
    } 

我的问题是,为什么class C cannot extend Class B?为什么打电话new A().super();解决了这个问题?这是什么意思?有没有更好的方法来解决它(不使用静态嵌套类)?

+0

两个版本(有和没有'新的A()。super();'编译对我来说很好。我正在运行java 1.8.0_144。 – Turing85

+1

关于“发生错误”和“问题”,你能更具体吗? – Henry

+1

关于“更好的解决方法”,我会考虑将嵌套类层次重构为单独的类,但当然取决于实际代码的建模。 –

将被编译和执行打印“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.即实例化的另一exampleC类可以延伸乙类如你的问题的初始代码片段。您的代码在语法方面是正确的,并且可以无需增加任何不必要的new A().super()

对于考虑进行编译,让我们参考tutorial内部类,这些定义都是非静态的。对于静态情况下,正确的名称是Static Nested Class和

将InnerClass的实例可以的在OuterClass

一个实例中只存在实例化一个内部类,你必须先实例化外部类

这意味着,内部类只存在于特定的OuterClass实例而不是OuterClass类的上下文中,这就是为什么new A()确实解决了问题,因此提供了运行时实例其中BC确实存在

+0

调用新的A()不能解决问题。调用新的A()。super();解决了这个问题。请解释一下,调用它的输出是什么? – Alice

+1

@爱丽丝的教程就在那里。你读过它吗?调用'new A()。super();'指示编译器创建一个'A'的新实例,然后在'A'上调用超级构造函数('C',即'B'的构造函数) (因此'.super()' - 部分)。因此,'C'实例绑定到新创建的'A'实例。 – Turing85

+0

@ Turing85我同意A的一个新实例调用超级构造函数,但我不认为超级是C. – Alice