java 单例 初始化_Java 单例与类实例初始化相关的一个陷阱题

b331b651dc1c37b6285058cf355807e1.png

码农每日一题

长按关注置顶

工作日每天推送一个短小精干的技术知识点,让您可以随时查漏补缺。

问:下面程序的运行结果是什么?为什么?

classSingleTon{

privatestaticSingleTonsingleTon =newSingleTon();

publicstaticintcount1;

publicstaticintcount2 =0;

privateSingleTon() {

count1++;

count2++;

}

publicstaticSingleTongetInstance() {

returnsingleTon;

}

}

publicclassDemo{

publicstaticvoidmain(String[] args) {

SingleTonsingleTon =SingleTon.getInstance();

System.out.println("count1="+ singleTon.count1);

System.out.println("count2="+ singleTon.count2);

}

}

答:结果如下。

count1=1

count2=0

原因为 SingleTon singleTon = SingleTon.getInstance(); 调用了类的静态方法,所以触发类的初始化,类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值 singleton=null,count1=0,count2=0,类初始化时为类的静态变量赋值和执行静态代码快,singleton 赋值为 new SingleTon() 调用类的构造方法,调用类的构造方法后 count=1 且 count2=1,继续为 count1 与 count2 赋值,此时 count1 没有赋值操作,所有 count1 为 1,但是 count2 执行赋值操作就变为 0。

相关推荐:

0c6f614cbdf312f94213de37af060479.png

放松一下,顺带评论点赞分享一波~

无聊中,给小姨子发了一个心理测试题:“假如我们两个人流落到荒岛,你会做些什么?”。她的回答很吓人:“她说要截屏告诉她姐!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值