class SingleTon {
    private static SingleTon singleTon = new SingleTon();
    public static int count1;
    public static int count2 = 0;
    public int count3 = 0;    private SingleTon() {
        count1++;
        count2++;
        count3++;
    }    public static SingleTon getInstance() {
        return singleTon;
    }
}public class TestClassLoader {
    public static void main(String[] args) {
        SingleTon singleTon = SingleTon.getInstance();
        System.out.println("count1=" + singleTon.count1);
        System.out.println("count2=" + singleTon.count2);
        System.out.println("count3=" + singleTon.count3);
    }
}运行结果是:
count1=1
count2=0
count3=1答案的分析是:
1:SingleTon singleTon = SingleTon.getInstance();调用了类的SingleTon调用了类的静态方法,触发类的初始化 
2:类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值 singleton=null count1=0,count2=0 
3:类初始化化,为类的静态变量赋值和执行静态代码快。singleton赋值为new SingleTon()调用类的构造方法 
4:调用类的构造方法后count=1;count2=1 
5:继续为count1与count2赋值,此时count1没有赋值操作,所有count1为1,但是count2执行赋值操作就变为0在4,5之间有一个疑问,为什么在调用构造方法之后,又对static块进行了一次赋值?
一、类的主动引用是这样顺序:(1)static块"值"的初始化。(2)类的构造方法。(3)static块赋值?
二、类在主动引用时,static模块初始化了两次,且与类的实例化是异步完成的?

解决方案 »

  1.   

    这里要这样看
    class SingleTon {
        private static SingleTon singleTon ;
        static{ singleTon=new SingleTon();}
        public static int count1;
        public static int count2 ;
        static{count2=0;}
        public int count3 = 0; private SingleTon() {
            count1++;
            count2++;
            count3++;
        }    public static SingleTon getInstance() {
            return singleTon;
        }
    }先静态申请变量,singleton=null count1=0,count2=0 ;
    然后在执行静态块,静态变量赋值是放在静态块中的执行的,由于 singleTon静态实例化先于count2的赋值,所以类被先被初始化,由于静态变量和静态块只执行一次,这里初始化类时不再执行,只执行count3申明和赋值,最后是类构造执行。然后才会执行静态块 count2 的赋值。 静态方法getInstance()只有在被调用时才会执行。