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变量声明的前面,所以执行顺序是:
- 先执行初始化块,给
tmp赋值为2并打印,输出2.0; - 再执行
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
相关产品推荐
相关产品推荐

