有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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) 个答案

  1. # 1 楼答案

    内部类维护对外部实例的引用(例外是static内部类)。在本例中,WithInner.Inner实例有一个对包含WithInner实例的引用。该关联是在内部类实例化时创建的

    如果不引用外部类,则无法创建内部类的实例。扩展这样一个内部类的类也隐含着这样一个引用,并且需要委托给内部类构造函数来建立关联。执行此操作的语法如示例所示:

    wi.super();
    

    在这里,super()基本上指的是超类构造函数,也就是WithInner.Inner构造函数。构造函数没有正式接受任何参数,但它仍然需要对外部实例(类型为WithInner)的引用。这一行作为一个整体本质上意味着“调用超类构造函数,并与wi实例关联”

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

    wi.new WithInner.Inner()
    

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

    关于你的问题:

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

    这不会将创建的WithInner实例与内部类实例相关联。你会得到一个编译时错误,因为你的InheritInner构造函数不再显式地调用合成的超类构造函数,也不能隐式地调用它,因为它需要外部实例引用来关联。很可能最容易将外部实例引用视为内部类构造函数的隐藏参数(实际上,这就是它在后台实现的方式)

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

    不,您正在调用WithInner.Inner构造函数,它为外部实例引用提供了一个“隐藏”参数wi基本上作为隐藏参数值传递给WithInner.Inner构造函数