问题
偶然看到一段有意思的代码,如下:
public class SingletonDemo {
private static SingletonDemo singletonDemo = new SingletonDemo();
static int count1,count2=0;
public SingletonDemo(){
count1++;
count2++;
}
public static SingletonDemo getInsatance(){
return singletonDemo;
}
public static void main(String[] args) {
getInsatance();
System.out.println("count1="+count1);
System.out.println("count2="+count2);
}
}
分析
这段代码的打印是多少呢,相信有不少Java开发者会认为是count1=1 ,count2=1。然而,打印出的结果应该是count1=1 ,count2=0 。分析下这段代码执行顺序应该是如下:
public class SingletonDemo {
//static int count1,count2=0;
//1.类加载后 先执行这一行
private static SingletonDemo singletonDemo = new SingletonDemo();
//3.最后执行这里 count2被覆盖了
static int count1,count2=0;
//2.然后执行这一样
public SingletonDemo(){
count1++;
count2++;
}
public static SingletonDemo getInsatance(){
return singletonDemo;
}
public static void main(String[] args) {
getInsatance();
System.out.println("count1="+count1);
System.out.println("count2="+count2);
}
}
所以,执行结果应该是count1=1,count2=0。
思考
如果把static int count1,count2=0;这行代码放到最前面:
public class SingletonDemo {
static int count1,count2=0;
private static SingletonDemo singletonDemo = new SingletonDemo();
public SingletonDemo(){
count1++;
count2++;
}
public static SingletonDemo getInsatance(){
return singletonDemo;
}
public static void main(String[] args) {
getInsatance();
System.out.println("count1="+count1);
System.out.println("count2="+count2);
}
}
这样的话结果正是我们期望的count1=1,count2=1。其根本原因在于,类的加载顺序,静态属性从上到下依次加载。标题是基础,故笔者这里不作,javap -c 反编译分析。
总结
这个问题考察了对类加载顺序的理解。基础真的很重要,否则遇到这种看似奇葩的问题的时候,可能会吃惊于结果并且一脸懵逼。其实任何东西都不简单。