gpt4 book ai didi

java - 在 Java 中使用带有引用的 super()

转载 作者:搜寻专家 更新时间:2023-10-30 21:30:25 24 4
gpt4 key购买 nike

我有三个类(class)

class WithInner {
class Inner {}
}

public class InheritInner extends WithInner.Inner
{ //constructor
InheritInner(WithInner wi) {
wi.super();
}
}

这个例子摘自 Eckel 的 Thinking in Java。我不明白为什么我们不能调用 wi = new WithInner(); 而不是 .super()?在调用 wi.super() 时,我们正在调用 Object 的默认构造函数,不是吗?

最佳答案

内部类维护对外部实例的引用(static 内部类除外)。在这种情况下,WithInner.Inner 实例具有对包含的 WithInner 实例的引用。该关联是在内部类实例化时创建的。

如果不引用外部类,则不能创建内部类的实例。扩展这样一个内部类的类也隐含了这样一个引用,并且需要委托(delegate)给内部类构造函数来建立关联。这样做的语法如您的示例所示:

wi.super();

这里,super() 本质上指的是父类(super class)构造函数——即WithInner.Inner 构造函数。构造函数没有形式上的参数,但它仍然需要对外部实例(WithInner 类型)的引用。该行作为一个整体本质上意味着“调用父类(super class)构造函数,并与 wi 实例关联”。

比较具有显式关联的内部类实例化的语法:

wi.new WithInner.Inner()

是的,这也是有效的语法。但是,它在野外并不常见(因为内部类实例通常只在外部类中创建,并且在这种情况下关联是隐式的 - 在这种情况下不需要这种语法,它显式提供了关联) .

具体引用您的问题:

I can't understand why we can't call wi = new WithInner(); instead of .super()?

这不会将创建的 WithInner 实例与内部类实例相关联。你会得到一个编译时错误,因为你的 InheritInner 构造函数将不再显式调用合成父类(super class)构造函数,并且它不能被隐式调用,因为它需要外部实例引用来关联.将外部实例引用视为内部类构造函数的隐藏参数可能是最简单的方法(实际上,这就是它在幕后实现的方式)。

And while calling wi.super() we are calling Object's default constructor, aren't we?

不,您正在调用 WithInner.Inner 构造函数,它有一个用于外部实例引用的“隐藏”参数; wi 本质上是作为隐藏参数值传递给 WithInner.Inner 构造函数。

关于java - 在 Java 中使用带有引用的 super(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35793291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com