今天看到一道题目,是这样的:(我在里面打印了一些语句,先注释掉了)
打印的结果为1、2;
当然如果对初始化顺序很了解的人,会觉得这道题其实不咋的。。下面我给分析一下这道题吧
这时候把注释放开,打印结果如下:
Singleton counter1:1
Singleton counter1:1
Singleton.counter1:1
Singleton.conuter2:2
静态变量及构造函数已经初始化附值完毕
3
obj.counter1==1
obj.counter2==2
在得到实例化之前,程序先去运行它的static变量,也就是最上面的第一句话,由这句话把counter1和counter2的值变为1,一开始它们都默认为0,因为new出实例是在static int counter和static int counter2之前。。程序的执行是有顺序的,也就是变为1后,
public static int counter1;
public static int counter2 = 2;
这两步又对变量重新赋值,因此导致最后的结果是1、2。。
为了证实我的想法,可把private static Singleton obj= new Singleton();移到第二条去或者第三条去,出来的结果是不一样的。。
总结一下初始化的顺序:1、静态变量;2、静态初始化块,即用{},没有方法名无返回值;3、变量;4、初始化块;5、构造器。
静态变量的赋值有一定的先后顺序!