一、题目
几乎同样的代码,有这样两种情况:
情况一:new SingleTon()在后面,得到的结果是:count1 = 1和count2 = 1
情况二:new SingleTon()在前面,得到的结果是:count1 = 1和count2 = 0
【问】请简述一下,这两种情况的输出结果为什么会不同?
二、分析
这里主要涉及到的知识是,JVM的类加载机制。
1、类的生命周期:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载,而验证,准备和解析又可以归为连接阶段。
2、当调用类中的静态方法getSingleTon()时,会触发类的初始化。
(1)对于情况一:
1) 连接阶段,会为静态变量赋初始值,这时count1=0,count2=0;
2)然后初始化阶段,代码从上到下执行,赋值操作和静态代码块,这时count1=0,count2=0;
创建对象SingleTon后,对count1和count2进行++,最后count1=1,count2=1。
(2)对于情况二:
1)连接阶段,同样是静态变量赋初始值,这时同样count1=0,count2=0;
2)初始化阶段,从上而下执行代码,先创建对象,对count1和count2进行++,这时count1=1,count2=1;然后 public static int count1对count1是没赋值的,这时count1还是等于1,但是count2赋值了0,这时count2=0,所以最后的输出结果count1=1,count2=0
【代码】
class SingleTon{
private static SingleTon singleTon = new SingleTon();
public static int count1;
public static int count2 = 0;
private SingleTon(){
count1++;
count2++;
}
public static SingleTon getSingleTon(){
return singleTon;
}
}
public class ClassLoaderTest {
public static void main(String[] args) {
SingleTon.getSingleTon();
System.out.println("count1 = "+ SingleTon.count1);
System.out.println("count2 = "+ SingleTon.count2);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117648.html