一道关于jvm加载的简单题目

本文通过两个不同版本的Java单例模式实现,详细解析了在构造函数中初始化静态计数器变量的行为及其对最终输出的影响。揭示了Java虚拟机如何初始化静态变量及构造函数执行时机的关键细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问:下列程序输出的结果是什么?

package newFeatures8;

public class Test{

	public static void main(String[] args) {
		Singleton2.getInstance();
       System.out.println("count1="+Singleton2.count1);
       System.out.println("count2="+Singleton2.count2);
	}

}

class Singleton2{
	private static final Singleton2 INSTANCE=new Singleton2();
	public static int count1;
	public static int  count2=0;
	public static Singleton2 getInstance(){
		return INSTANCE;
	}
	private Singleton2(){
		count1++;
		count2++;
	}
}

打印结果是:

count1=1

count2=0


原因是当调用Singleton2时,jvm就对静态成员变量赋予默认初始值

也就是说在jvm 方法区中有:

private static final Singleton2 INSTANCE=null;

public static int count1=0;//注意这是默认为int 的初始值 0 

public static int count2=0//注意这是默认为int 的初始值 0  而不是程序中给定的0,程序中给定的0还没未执行

接着程序从上到下开始执行

首先是 执行new Singleton2(),此时调用了构造函数,count1 变为1,count2 变为1

紧接着执行下一句,这时count1 还是1

当再执行下一句是 又重新为 count2赋值 为0,此时的0为程序中给定的值,所以count2=0

造成这样的原因是:一个赋了初始值,一个没有(由jvm赋初始值)


如果调整一下位置呢,将private static final Singleton2 INSTANCE=new Singleton2();

移到public static int  count2=0;之后,打印结果是否会一样呢

package newFeatures8;

public class Test{

	public static void main(String[] args) {
		Singleton2.getInstance();
       System.out.println("count1="+Singleton2.count1);
       System.out.println("count2="+Singleton2.count2);
	}

}

class Singleton2{
	public static int count1;
	public static int  count2=0;
	private static final Singleton2 INSTANCE=new Singleton2();
	public static Singleton2 getInstance(){
		return INSTANCE;
	}
	private Singleton2(){
		count1++;
		count2++;
	}
}

打印结果就是:

count1=1

count2=1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值