在调用Constructor之前,是否在堆上创建了对象?

nit*_*.kk 4 java heap inheritance constructor

当从基类的构造函数调用重写方法时,也根据运行时多态性概念调用子类中定义的方法.我想知道如何在JVM中处理这个问题,当控件在基类构造函数中时,子类的构造函数尚未被调用,因此Object尚未完全构造.

我理解从基类构造函数调用override方法的不良影响,但只是希望了解如何使其成为可能.

我觉得堆中的对象是在调用构造函数之前创建的,并且在调用构造函数时会初始化属性.请为上述内容提供宝贵的意见.

以下是演示相同的代码.

Base.java

public class Base {
    public Base() {
            System.out.println("Base constructor is executing...");
            someMethod();
    }

    public void someMethod() {
            System.out.println("someMethod defined in Base class executing...");
    }
}
Run Code Online (Sandbox Code Playgroud)

Sub.java

public class Sub extends Base{
    public Sub() {
            System.out.println("Sub constructor is executing...");
    }
    @Override
    public void someMethod() {
            System.out.println("someMethod defined in Sub class executing...");
    }
}
Run Code Online (Sandbox Code Playgroud)

Client.java

public class Client {
    public static void main(String[] args) {
            Sub obj = new Sub();
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台上的输出是

基础构造函数正在执行...

someMethod在Sub类中执行...

子构造函数正在执行...

Pet*_*rey 5

是否在调用Constructor之前创建了java中的对象?

是的,否则您将无法初始化对象.

在字节代码级别,首先创建对象,然后调用构造函数,传入对象以进行初始化.构造函数的内部名称是<init>,它的返回类型总是void意味着它不返回对象,只是初始化它.

注意:Unsafe.allocateInstance将在不调用构造函数的情况下创建对象,并且对于反序列化非常有用.

  • 相关的[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9.4)引用:`新对象包含所有的新实例在指定的类类型及其所有超类中声明的字段.在创建每个新字段实例时,它将初始化为其默认值(第4.12.5节) (2认同)