gpt4 book ai didi

java - 在调用构造函数之前,Java 中的对象是否在堆上创建?

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:40 24 4
gpt4 key购买 nike

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

我理解从基类构造函数调用覆盖方法的不良影响,但只是想了解这是如何实现的。

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

下面是演示相同内容的代码。

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

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

客户端.java

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

控制台输出

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

子类执行中定义的一些方法...

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

最佳答案

Does object in java created before Constructor is invoked ?

是的,否则您将没有要初始化的对象。

在字节码层面,先创建对象,然后调用构造函数,传入对象进行初始化。构造函数的内部名称是 <init>它的返回类型总是 void这意味着它不会返回对象,只会对其进行初始化。

备注:Unsafe.allocateInstance将在不调用构造函数的情况下创建一个对象,这对于反序列化很有用。

关于java - 在调用构造函数之前,Java 中的对象是否在堆上创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com