Java单例模式中x、y输出值不同的原因及代码位置影响解析
静态成员初始化顺序导致的输出差异分析
原代码输出0、1的原因
Java类加载时,静态成员会按照代码里的声明顺序依次初始化:
- 首先执行
private static Singleton instance = new Singleton();,触发构造方法调用。此时x和y还没被显式赋值,都是默认的0,构造方法里的x++让x变成1,y++让y变成1。 - 接着执行
private static int x = 0;,这一步直接把x重新赋值为0。 - 最后执行
private static int y;,这只是变量声明,没有赋值操作,y保持之前的1不变。
所以main方法里输出x是0,y是1。
移到位置②后输出1、1的原因
把instance的声明移到x和y之后,静态成员的初始化顺序随之改变:
- 先执行
private static int x = 0;,x被赋值为0。 - 再执行
private static int y;,y默认初始化为0。 - 最后执行
private static Singleton instance = new Singleton();,调用构造方法时x变成1,y变成1,之后没有对x、y的后续赋值操作。
所以最终x和y都是1,输出1、1。
内容的提问来源于stack exchange,提问作者flower
相关产品推荐
相关产品推荐

