当从子类调用 super() 时,它是在“this”对象上调用的,即由语句 new Subclass() 创建的对象。 super() 在“this”对象上被调用。但是“this”对象包含父类(super class)及其自身的所有变量、方法及其构造函数,但不包含父类(super class)构造函数。那么如何在“this”对象上调用 super() 呢?
请参阅我试图解释我的理解的附图。
注:P是父类(super class),Q是派生类
最佳答案
But 'this' object contains ... not superclass constructor.
它确实“包含”父类(super class)构造函数(只要它“包含”任何方法,这有点手摇)——只是调用该 super 构造函数的唯一方法是使用 super(..)
语法及其约束(具体来说,它必须是子类构造函数的第一条语句)。
在那挥手致意:对象实际上并不包含方法。方法是在参数上调用的静态事物,当您调用 this.foo()
时它基本上被(由 JVM)翻译成 foo(this)
.姓名this
实际上只是“方法的第一个参数,它恰好总是我所期望的 this
”的特殊名称。
构造函数的工作方式完全相同。 new Foo()
分配一些内存,将其变量初始化为其默认值 (0/null),然后调用 Foo.<init>(<a reference to the new chunk of memory>)
.如果 Foo 构造函数调用 super()
, 然后是 Foo.<init>
中的第一条语句本质上是 FooSuperClass.<init>(this)
.
这不是 Java 语法的工作方式,但它基本上是正在发生的事情。
事实上,查看这段 Java 代码:
// in Super.java
public class Super {}
// in Sub.java
public class Sub extends Super {}
如果你这样做 javap -c Sub
,你会看到:
Compiled from "Sub.java"
public class Sub extends Super {
public Sub();
Code:
0: aload_0
1: invokespecial #1 // Method Super."<init>":()V
4: return
}
这是做什么的?在 0
它将第一个参数推送到 Sub()
构造函数(又名 this
)到堆栈,然后在 1
它调用 Super.<init>
,它将弹出该参数并将其传递给 Super.<init>
方法。 (最后,在 4
返回。)
关于java - 构造函数是否未绑定(bind)到类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29306295/