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

时间:2016-02-15 12:48:56

标签: java inheritance constructor heap

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

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

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

以下是展示相同内容的代码。

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...");
    }
}

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...");
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
            Sub obj = new Sub();
    }
}

控制台上的输出

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

在Sub类执行中定义的someMethod ...

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

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