在Java中使用带引用的super()
我有三节课
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner
{ //constructor
InheritInner(WithInner wi) {
wi.super();
}
}
这个例子取自Eckel在Java中的思想。我不明白为什么我们不能用wi = new WithInner();
代替。超级()?在调用wi.super()
时,我们调用的是对象的默认构造函数,不是吗
# 1 楼答案
内部类维护对外部实例的引用(例外是
static
内部类)。在本例中,WithInner.Inner
实例有一个对包含WithInner
实例的引用。该关联是在内部类实例化时创建的如果不引用外部类,则无法创建内部类的实例。扩展这样一个内部类的类也隐含着这样一个引用,并且需要委托给内部类构造函数来建立关联。执行此操作的语法如示例所示:
在这里,
super()
基本上指的是超类构造函数,也就是WithInner.Inner
构造函数。构造函数没有正式接受任何参数,但它仍然需要对外部实例(类型为WithInner
)的引用。这一行作为一个整体本质上意味着“调用超类构造函数,并与wi
实例关联”与具有显式关联的内部类的实例化语法相比:
是的,这也是有效的语法。但在野外并不常见(因为内部类实例通常只从外部类中创建,在这种情况下,关联是隐式的——在这种情况下,不需要这种语法,它显式地提供关联)
关于你的问题:
这不会将创建的
WithInner
实例与内部类实例相关联。你会得到一个编译时错误,因为你的InheritInner
构造函数不再显式地调用合成的超类构造函数,也不能隐式地调用它,因为它需要外部实例引用来关联。很可能最容易将外部实例引用视为内部类构造函数的隐藏参数(实际上,这就是它在后台实现的方式)不,您正在调用
WithInner.Inner
构造函数,它为外部实例引用提供了一个“隐藏”参数wi
基本上作为隐藏参数值传递给WithInner.Inner
构造函数