代码如下
程序1class 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; } } 程序2public 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); } }
运行结果为什么是
obj.counter1==1 obj.counter2==0
为什么counter2=1呢?我觉得构造初始化过程分析的不错呀,先执行静态初始化变量,最后执行构造方法体.
程序1class 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; } } 程序2public 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); } }
运行结果为什么是
obj.counter1==1 obj.counter2==0
为什么counter2=1呢?我觉得构造初始化过程分析的不错呀,先执行静态初始化变量,最后执行构造方法体.
少大括号,还有不知道obj在哪定义的
首先初始化obj,执行private Singleton() { counter1++; counter2++; }
此时counter1=1,counter1=1;
然后执行public static int counter1; public static int counter2 = 0;
又拔counter2 赋值为0,而counter1不变
(1)int型变量在未初始化赋值之前,其初始值为0;
(2)static域的加载过程是(a)声明所有static变量,但不初始化赋值(b)按照编程者声明变量的次序,给每个变量依次初始化。你的代码中,
第一阶段,给obj, counter1, counter2声明变量。这时候obj还没有调用它的构造函数,counter1,counter2也没有初始化赋值,值为0。
第二阶段,由于obj声明在先,所以先初始化obj,调用构造函数,给counter1,counter2分别+1。由于counter1,counter2还未初始化,值为0,所以这个阶段过后,counter1=counter2=1;
第三阶段,轮到counter1初始化了。但没有相应的赋值操作,所以counter1的值仍为1.
第四阶段,counter2最后一个初始化,虽然之前counter2被obj的构造函数初始化为1,但这次是它自己的初始化,于是值为1的counter2被改为0;结果:counter1=1; counter2=0;如果改变变量声明次序,将obj的声明放在counter2之后,
则得到结果:counter1=1; counter2=1;
counter2是静态的不能被改变
一开始初始化静态,把静态属性都装入内存,并赋予初值(成员才这样);
再一个一个按顺序初始化静态成员,第一个初始化Singeleton,就把counter1+1,counter2+1;现在的值都是1,执行完后再初始化下面的静态成员了,有赋值的就赋值,counter1没赋值就还是等于1,counter2=0,所以变0
正解,如果楼主不太清楚静态变量初始化顺序,可以参考《java 编程思想》第四章之静态数据的初始化