You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实例变量初始化顺序及变量内存分配技术咨询

Java实例初始化块与成员变量初始化顺序问题

示例代码

class Test { 
 {
    tmp = 2;  
    System.out.println(this.tmp);
  }
  float tmp = 1;
}

class Main {
  public static void main(String[] args) {
    Test t = new Test();
    System.out.println("[Main] t.tmp : " + t.tmp);
    t.tmp = 100;
    System.out.println("[Main] t.tmp : " + t.tmp);
  }
}

运行结果

2.0
[Main] t.tmp : 1.0
[Main] t.tmp : 100.0

问题解答

Q1:实例变量的显式初始化是否在初始化块之后执行?

是的,这段代码里tmp = 1的显式初始化确实在初始化块之后执行。

Java中实例初始化块和成员变量的显式初始化代码,会严格按照它们在类中出现的顺序依次执行,不存在固定的“显式初始化先于初始化块”规则。

在Test类中,初始化块写在tmp变量声明的前面,所以执行顺序是:

  1. 先执行初始化块,给tmp赋值为2并打印,输出2.0;
  2. 再执行float tmp = 1;,这一步是给已经存在的tmp变量重新赋值为1;
    因此Main方法中第一次打印t.tmp会得到1.0。

Q2:变量tmp的内存分配时机是什么?是否在初始化块之前完成?

变量tmp的内存分配是在对象实例化的第一步完成的,也就是所有实例初始化代码(包括初始化块、显式初始化)执行之前。

当创建Test对象时,JVM会先为对象的所有实例变量分配内存空间,并赋予对应类型的默认初始值(float类型默认值为0.0)。之后才会按顺序执行初始化块和显式初始化代码:

  • 初始化块执行时,tmp已经存在,只是之前是默认值0.0,此时被赋值为2;
  • 后续的显式初始化代码再把tmp重新赋值为1。

这也是为什么初始化块里能直接访问tmp而不报错——变量的内存分配(声明阶段)已经完成,只是还没执行显式初始化的赋值操作。


内容的提问来源于stack exchange,提问作者ejpark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:05:22