|
原帖由 asdxxxyah 于 2009-1-8 20:16 发表 ![]()
public class Signal {
public static void main(String []args){
Sig sig=Sig.getSig();
System.out.println("count1="+sig.count1);
System.out.println("count2="+sig.count2);
}
}
class Sig {
private static Sig sig=new Sig();
public static int count1;
public static int count2=0;
private Sig(){
count1++;
count2++;
}
public static Sig getSig(){
return sig;
}
}
答案:count1=1
count2=0
谁能告诉我其中的原因?为什么一个+1,另个却不加呢??这题目没理解
这道题不过是考,静态域初始化的过程,静态域初始化是按照从上至下的书写顺序进行的。
1.Sig sig=Sig.getSig();
首先调用Sig静态方法,这时候会触发class loader加载Sig类,实际上java中类加载有三个步骤,Loading--Linking--Initialization
Loading是,由类加载器执行,查找字节码,由那些字节码创造一个Class对象
Linking是,验证字节码,分配静态域的存储空间,如果需要的话,解决所有的引用,这里就解决了sig的引用对象new Sig()
Initialization是,如果有一个超类,初始化它。执行静态初始化器,和静态初始化块。
引起类初始化的条件是,第一次引用静态方法(构造器是暗示静态的),或者引用非常量静态域。
new Sig()方法后,count1=1,count2=1
2.public static int count1;
这里没有对count1进行赋值操作,所以仍然为1
3.public static int count2=0;
这里对count2进行了赋值为0的操作,所以count2为0
最后,这道题使用了单例模式,确保某一个类只有一个实例 |
|