日期:2014-05-20  浏览次数:20754 次

static 关键字的问题
Java code
package tandey;


class Singleton{
    
    public static Singleton singleton =new Singleton();
    public static int count1;
    public static int count2=0;
    //public static Singleton singleton =new Singleton();
    public Singleton() {
      count1++;
      count2++;
    }
    
    public static Singleton getSingleton(){
        return singleton;
    }
}

public class Mytest {

    public static void main(String[] args) {
       Singleton singleton=Singleton.getSingleton();
       System.out.println(Singleton.count1);
       System.out.println(Singleton.count2); 
    }
}


如代码:
执行结果:
1
0
关于这个如何分析?求赐教

------解决方案--------------------
public static int count2=0;
相当于2条语句
public static int count2; //定义
static {count2=0;} //赋值
定义语句在执行代码之前,因为定义语句就是把变量编译成相对地址(在java中就是索引号)
所以
定义语句先执行,然后
public static Singleton singleton =new Singleton(); //这里先执行,调用构造方法count1=1,count2=1
public static int count1; //然后这里没有执行代码
public static int count2=0;//然后这里执行static{count2=0;}使得count2又变成了0

LZ自己体会一下以下的例子
public class A {
static {System.out.println("1");}
static A a = new A();
static {System.out.println("3");}
static int b = 3;
static {System.out.println("4");}
static {b = 4;}

public A () {System.out.println("2");}

public static void main(String[] args) {
System.out.println(A.b);
}
}

------解决方案--------------------
首先碰到这句话Singleton singleton=Singleton.getSingleton();
载入Singleton 类 静态初始化 执行public static Singleton singleton =new Singleton();
那么count1++;count2++;所以他们都是1.然后继续 public static int count1;
public static int count2=0;count1还是1,count2被赋值成0;



------解决方案--------------------
Singleton singleton=Singleton.getSingleton();
 由于调用了Singleton的静态方法,属于"主动使用"的情况,因此会导致Singleton类的加载,它的加载分为三部:
 1.加载
 2.连接(在此阶段中,所有静态变量赋值为默认值,这里singleton为null,count1和count2为0)
 3.初始化:
调用类初始化方法<clinit>,按照代码的顺序依次初始化,先对singleton变量初始化,会调用new Singleton();所以调用到了构造器导致count1和count2的值都变成了1;
再对count1进行初始化,由于这里count1没有初始化语句,所以什么也不做;
再对count2进行初始化,由于这里语句为"count2=0"所以count2又变成了0;

打印出来的结果是1,0