【问题标题】:How this Inner class inheritance example works?这个内部类继承示例如何工作?
【发布时间】:2016-09-05 11:51:40
【问题描述】:

我正在阅读有关从内部类继承的内容,但在试图理解以下代码的工作原理时遇到了困难:

class Outer{
    class Inner{
    }
}
class Derived extends Outer.Inner{
    Derived(Outer o){
        o.super();
    }
}

据我所知,关键字 super 指的是超类, super() 指的是它的无参数构造函数。在 Outer 类的情况下,超类是 Object 类。
我想了解这段代码是如何工作的。
为什么 Object 类的实例化使得扩展 Inner 类成为可能?
创建 Object 类实例与创建 Outer 类对象有什么关系?

删除包含“o.super();”的行导致错误:
java:需要包含 p.Outer.Inner 的封闭实例

我阅读了很多文章,但我不知道它是如何工作的。
我会很感激任何答案。

【问题讨论】:

  • 测试一下。将 println() 行放入所有构造函数中,并观察它以什么顺序打印出来。 ;)
  • 如果您在实际项目中这样做,您可能需要重新考虑您的对象层次结构。

标签: java inheritance inner-classes


【解决方案1】:

假设你有一个变量o 引用Outer 的一个实例,并且你想创建一个Inner 的实例,它的封闭实例是o 的值。您可以致电:

Outer.Inner inner = o.new Outer.Inner();

这在 Java 中很少见(因为通常在构造内部类时,使用“this”作为隐式封闭实例),但它是有效的。

这实际上是等价的,但在子类构造函数的上下文中。 Inner真的有一个这样的构造函数:

Inner(Outer enclosingInstance)

...而这一行是有效地调用

super(o)

...只是在语法中没有以这种方式表达来区分这种“特殊”信息和任何常规参数。

【讨论】:

    【解决方案2】:

    为什么 Object 类的实例化使得扩展 Inner 类成为可能?

    In Inner 实例需要一个 Outer 实例作为其内部实例。没有它的外部实例就没有它是没有意义的。如果有一个没有外部的内部确实有意义,那么您将使它成为static

    创建 Object 类实例与创建 Outer 类对象有什么关系?

    在创建 Inner 实例之前,您需要一个 Outer 实例。

    我阅读了很多文章,但我不知道它是如何工作的。

    它将Outer 实例设置为Inner 超类需要。

    【讨论】:

      【解决方案3】:

      Inner 类被称为嵌套内部类,并以这样一种方式绑定到 Outer 类,即需要使用像 Outer.Inner inner = (new Outer()).new Inner(); 这样的 Outer 类的实例来初始化它。

      如果您的内部类是使用 static 修饰符声明的,它将是一个静态嵌套类,并且不需要外部类的实例来初始化它的新实例,如下所示:Outer.Inner inner = new Outer.Inner();

      【讨论】:

        【解决方案4】:

        你像这样实例化内部类Outer outer = new Outer(); Inner inner = outer.new Inner();

        【讨论】:

          猜你喜欢
          • 2012-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          • 2019-06-05
          • 1970-01-01
          相关资源
          最近更新 更多