代码如下
程序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呢?我觉得构造初始化过程分析的不错呀,先执行静态初始化变量,最后执行构造方法体.

解决方案 »

  1.   

    楼主把代码1重新贴一下吧
    少大括号,还有不知道obj在哪定义的
      

  2.   

    程序在加载的时候给静态变量赋值,但静态变量的赋值也是按照顺序来的
    首先初始化obj,执行private Singleton() { counter1++; counter2++; } 
    此时counter1=1,counter1=1;
    然后执行public static int counter1; public static int counter2 = 0; 
    又拔counter2 赋值为0,而counter1不变
      

  3.   

    你的结果,说明了以下几个问题:
    (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;
      

  4.   

    Singleton 是设计模式中的单键模式,单键模式的作用就是只能创建一个对象。
    counter2是静态的不能被改变
      

  5.   

    要先知道JAVA初始化数据
                    一开始初始化静态,把静态属性都装入内存,并赋予初值(成员才这样);
                     再一个一个按顺序初始化静态成员,第一个初始化Singeleton,就把counter1+1,counter2+1;现在的值都是1,执行完后再初始化下面的静态成员了,有赋值的就赋值,counter1没赋值就还是等于1,counter2=0,所以变0
      

  6.   


    正解,如果楼主不太清楚静态变量初始化顺序,可以参考《java 编程思想》第四章之静态数据的初始化