Java:非静态嵌套类和 instance.super()

2022-09-03 00:43:38

我很难把头放在Java中的非静态嵌套类上。请考虑以下示例,它先打印“内部”,然后打印“子”。

class Outer {
    class Inner {
        Inner() { System.out.println("Inner"); }
    }
}

public class Child extends Outer.Inner {
    Child(Outer o) {
        o.super();
        System.out.println("Child");
    }
    public static void main(String args[]) {
        new Child(new Outer());
    }
}

我理解Inner的实例总是必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法是什么意思 - 为什么它调用内部构造函数?o.super()

我只见过一个用于调用超类构造函数并调用被覆盖方法的超类版本的平原,但从来没有出现过某种形式。super(args)super.method()instance.super()


答案 1

它被称为“合格的超类构造函数调用”。

从这里引用:

显式构造函数调用语句可分为两种:

  • 备用构造函数调用以关键字 this 开头(可能以显式类型参数开头)。它们用于调用同一类的备用构造函数。

  • 超类构造函数调用以关键字 super(可能以显式类型参数开头)或主表达式开头。它们用于调用直接超类的构造函数。超类构造函数调用可以进一步细分:

  • 非限定超类构造函数调用以关键字 super 开头(可能以显式类型参数开头)。

  • 限定的超类构造函数调用以主表达式 开头。它们允许子类构造函数显式指定新创建对象相对于直接超类的立即封闭实例 (§8.1.3)。当超类是内部类时,这可能是必需的。


答案 2

内部类(非静态子类)实质上是嵌套类(静态子类),具有指向其父对象的隐式链接。下面是上面的代码,而是使用静态嵌套类编写的:

class Outer {
    static class Inner {
        final Outer outer;
        Inner(Outer outer) {
            this.outer = outer;
            System.out.println("Inner");
        }
    }
}

public class Child extends Outer.Inner {
    Child(Outer o) {
        super(o); // o.super();
        System.out.println("Child");
    }

    public static void main(String args[]) {
        new Child(new Outer());
    }
}

看看这个,你应该能够理解o.super()在做什么。


推荐