正如人们所知,new
刚刚分配的对象字节码未初始化,因此不是 java.lang.Object
.如果我进行运行时字节码操作并将该对象提供给方法,JVM 会报错甚至崩溃(因为我提供给它的“东西”不是 java.lang.Object
)。
因此,我的问题是,对象何时“完全”初始化,即变为 java.lang.Object
?是当构造函数( <init>
):
- 叫什么?
- 返回?
- 在它回来之前的某个时间?
- 调用
java.lang.Object.<init>
? - 其他时间?
最佳答案
从任何给定的角度<init>
方法,this
在调用 invokespecial
之后,值被认为已初始化返回,是否正在调用另一个 <init>
同一个类或父类(super class)中的方法。
同样,对于使用 new
创建的对象指令,一旦您将它们视为已初始化invokespecial
一个<init>
方法。
请注意,初始化跟踪对于方法而言是局部的。字节码验证是在一个方法一个方法的基础上完成的,每个方法只看到在它内部创建的对象和对方法的调用。不调用另一个构造函数就不可能在构造函数中初始化 this 值这一事实确保它最终会链接到 java.lang.Object
。构造函数,除非它抛出或进入无限循环。
关于java - Java 对象何时完全初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48981711/