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