java - 构造函数是否未绑定(bind)到类的实例?

标签 java inheritance polymorphism superclass

当从子类调用 super() 时,它是在“this”对象上调用的,即由语句 new Subclass() 创建的对象。 super() 在“this”对象上被调用。但是“this”对象包含父类(super class)及其自身的所有变量、方法及其构造函数,但不包含父类(super class)构造函数。那么如何在“this”对象上调用 super() 呢?

请参阅我试图解释我的理解的附图。

注:P是父类(super class),Q是派生类enter image description here

最佳答案

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/

相关文章:

java - 尝试在 webView 中登录 facebook 时出现空白页面

c++ - 在派生类中重写了哪个基类虚析构函数

java - 引用持久性并传递可变数量的数组

java - 使用 Java 进行树可视化

java - Spring Flex 1.5.0-M1 在 Maven Repo 中的任何地方?

c++ - 如何在派生类中创建与基类同名的函数

C++ - 从抽象基指针调用派生函数

C++ 防止继承基类的特定公共(public)成员

namespaces - 具有多态关系的命名空间 Laravel 5

java - 适当的 json 到后端 post 调用