为何能在Java实例初始化块中调用实例方法?
实例初始化块中this的可用性与执行顺序解惑
我发现实例初始化块会在构造方法之前执行,而且此时this关键字已经可用,能调用类中的任意公有或私有方法。但我之前一直以为只有构造方法才能保证实例创建完成以及this的可用性,这个执行顺序让我很意外。
附上测试代码:
public class Test { { this.privatePrint(); this.publicPrint(); } public Test() { System.out.print(" Constructor "); } public void publicPrint() { System.out.print(" public "); } public void privatePrint() { System.out.print(" private "); } public static void main(String[] args) { new Test(); } }
运行输出为:private public Constructor
我在JDK 11和17版本中都做了测试,结果一致。
核心原因:实例初始化块的本质
实例初始化块在编译阶段会被自动合并到每个构造方法的最前端(在构造方法的显式代码之前执行)。当执行初始化块时,JVM已经完成了对象的内存分配,实例的基本结构已经创建完成,所以this引用是合法可用的。
关键细节
this的可用性并不是由构造方法“赋予”的,而是对象内存分配完成后就存在。构造方法的作用是完成实例的初始化逻辑,而不是创建对象本身——对象的内存分配是在调用构造方法之前由JVM完成的。- 虽然
this可用,但此时实例可能还未完全初始化(比如某些成员变量还没被构造方法赋值),如果在初始化块中依赖未初始化的成员变量,可能会引发问题。 - 所有实例初始化块和实例变量的初始化语句,都会按代码顺序被合并到构造方法的开头,这就是为什么测试代码中初始化块的方法调用先于构造方法的输出。
内容的提问来源于stack exchange,提问作者MaksimBodrov
相关产品推荐
相关产品推荐

