朋友, 你对Java很熟吗? 来看看下面这段代码, 心里运行一次, 看看它的执行结果是什么?
class Singleton
{
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton()
{
counter1++;
counter2++;
}
public static Singleton getInstance()
{
return obj;
}
}
// 程序2
public class MyMain
{
public static void main(String[] args)
{
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}
想出来结果了吗? 那你把这段程序编译运行一下, 看看是不是你想的答案?
原理是这样的: JAVA在编译以后, 对静态变量并不马上进行赋值操作, 所以, 当你new一个实例的时候, counter1和counter2都被赋值为1(你用单步跟踪一次就可以知道了), 这时候, 要害的问题在于 private static Singleton obj = new Singleton(); 这条语句是在counter2的赋值之前. 因此, 当生成Singleton类的实例后, 也就是说构造器被执行之后, 才会去执行public static int count2=0, 这时候counter2又被清0了, 所以, 答案就是屏幕上输出:
obj.counter1==1
obj.counter2==0