问:下列程序输出的结果是什么?
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