这个Inner类继承示例的工作原理是什么?

时间:2016-09-05 11:51:40

标签: java inheritance inner-classes

我正在阅读有关内部类继承的内容,但我一直试图理解下面的代码是如何工作的:

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

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

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

我读过很多文章,但我无法弄清楚它是如何运作的 我会很乐意回答。

4 个答案:

答案 0 :(得分:2)

假设您有一个变量xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { console.log(this.responseText); } }; xhttp.open("GET", "http://dashboard.monitis.com/sharedPage.jsp?bla..bla", true); xhttp.send(); 引用o的实例,并且您希望创建一个Outer实例,其封闭实例为Inner的值。你可以打电话:

o

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

这实际上相当于它,但是在子类构造函数的上下文中。 Outer.Inner inner = o.new Outer.Inner(); 真的有一个像这样的构造函数:

Inner

...此行有效地调用

Inner(Outer enclosingInstance)

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

答案 1 :(得分:1)

  

为什么实例化Object类会使扩展内部类成为可能?

在Inner实例中需要一个外部实例作为内部实例。没有它的外部实例,没有它是没有意义的。如果拥有一个没有外部的内部确实有意义,你可以使它成为static

  

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

在创建内部实例之前,您需要一个外部实例。

  

我阅读了很多文章,但我无法弄清楚它是如何运作的。

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

答案 2 :(得分:1)

Inner被称为嵌套内部类,并且绑定到Outer类,以便初始化它需要使用Outer类的实例,如Outer.Inner inner = (new Outer()).new Inner();

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

答案 3 :(得分:0)

您实例化内部类,如Outer outer = new Outer(); Inner inner = outer.new Inner();