【问题标题】:inner class extended by another inner class [duplicate]由另一个内部类扩展的内部类[重复]
【发布时间】:2017-09-15 08:19:02
【问题描述】:

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(); 可以解决问题?这是什么意思?有没有更好的方法来解决(不使用静态嵌套类)?

【问题讨论】:

  • 两个版本(有和没有new A().super(); 编译对我来说都很好。我正在运行 java 1.8.0_144。
  • 您能否更具体地了解“错误发生”和“问题”?
  • 关于“更好的解决方法”,我会考虑将嵌套的类层次结构重构为单独的类,但这当然取决于实际代码建模的内容。
  • @Henry 错误 -> 由于一些中间构造函数,没有可用的 A 类型封闭实例
  • '非静态内部'是一个重言式。

标签: java inheritance constructor inner-classes super


【解决方案1】:

最简单的代码 sn-p 将被编译并执行打印'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 实例化的另一个 example。也就是说,C 类可以扩展 B 类,就像您问题中的初始代码 sn-p 一样。您的代码在语法上是正确的,并且可以编译而无需添加任何不必要的new A().super()

为了考虑,让我们参考tutorial内部类,根据定义,它们是非静态的。对于静态情况,正确的名称是 static nested class

InnerClass 的实例只能存在于 OuterClass 的实例中

要实例化内部类,必须先实例化外部类

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

【讨论】:

  • 调用 new A() 并不能解决问题。调用 new A().super();解决了这个问题。请解释一下调用它的输出是什么?
  • @Alice 教程就在那里。你读过它吗?调用new A().super(); 指示编译器创建A 的新实例,然后在A 上调用超级构造函数(C,即B 的构造函数)(因此.super()-part )。因此,C 实例绑定到新创建的A 实例。
  • @Turing85 我同意 A 的新实例调用超级构造函数,但我认为 A super 不是 C。
  • @Alice super 被解释为相对于C,而不是A,因此调用B 的构造函数。
  • 你能分享一下没有正确编译的整段代码吗?考虑这个成功编译并打印“OK”的paste,以及this one。所以请添加不编译的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多