首先我们来看以下程序
public class ClassLoaderTest {
private static ClassLoaderTest ourInstance = new ClassLoaderTest();
public static int count1;
public static int count2=0;
public static ClassLoaderTest getInstance() {
return ourInstance;
}
private ClassLoaderTest() {
count1++;
count2++;
}
}
class test{
public static void main(String[] args) {
ClassLoaderTest instance = ClassLoaderTest.getInstance();
System.out.println("count1:"+instance.count1);
System.out.println("count2:"+instance.count2);
}
}
然后会打印什么结果?
答案是:
count1:1
count2:0
为什么会打印1和0?别着急,往下面看
接着,我们将代码修改为
public class ClassLoaderTest {
public static int count1;
public static int count2=0;
//将类初始化对象放在后面
private static ClassLoaderTest ourInstance = new ClassLoaderTest();
public static ClassLoaderTest getInstance() {
return ourInstance;
}
private ClassLoaderTest() {
count1++;
count2++;
}
}
class test{
public static void main(String[] args) {
ClassLoaderTest instance = ClassLoaderTest.getInstance();
System.out.println("count1:"+instance.count1);
System.out.println("count2:"+instance.count2);
}
}
我们得到的结果是:
count1:1
count2:1
相信看到这里,你应该有一个大致的理解了。类的加载是严格按照顺序来的
首先,我们执行第一次
private static ClassLoaderTest ourInstance = new ClassLoaderTest();
然后,上面初始化构造函数使得我们的count1
和count2
都为1,然后再执行下面的
public static int count2=0;
将count2
又赋值为0,相当于再次初始化,而我们的count1
由于没有赋值,所以保留原有值。
所以得到我们的结果为
count1:1
count2:0
更改代码后我们的count1和count2先执行赋值,此时都为0,然后执行
private static ClassLoaderTest ourInstance = new ClassLoaderTest();
然后,类初始化执行构造函数
private ClassLoaderTest() {
count1++;
count2++;
}
此刻count1
和count2
值为1
通过打印得出
count1:1
count2:1
类加载的初始化阶段会把所有static类按顺序加载一次,当得到对象时,count值还未初始化,所以被覆盖了值,默认为0;当执行完第一条语句后,接着把类中的另外两条count值初始化,所以得到到1,0