`

类加载的顺序

    博客分类:
  • java
阅读更多
写道
package com.wang;

public class TestLoad {
private static TestLoad load=new TestLoad();
public static int count1;
public static int count2=0;

private TestLoad(){
count1++;
count2++;
}

public static TestLoad getInstance(){
return load;
}

public static void main(String[] args) {
TestLoad load=TestLoad.getInstance();
System.out.println("count1="+load.count1);
System.out.println("count2="+load.count2);
}
}

 大家觉得这个代码的输出是什么?

答案是:

count1=1
count2=0

写道
package com.wang;

public class TestLoad {

public static int count1;
public static int count2=0;
private static TestLoad load=new TestLoad();
private TestLoad(){
count1++;
count2++;
}

public static TestLoad getInstance(){
return load;
}

public static void main(String[] args) {
TestLoad load=TestLoad.getInstance();
System.out.println("count1="+load.count1);
System.out.println("count2="+load.count2);
}
}

 

这个时候输出又是什么呢?

对了,是

count1=1
count2=1
这是什么原因造成的呢?

是因为在虚拟机加载类的机制造成的,

虚拟机设计类的加载顺序是:加载、链接、初始化。

加载是指:查找并加载类的二进制数据

链接又分如下三步:

–验证:确保被加载的类的正确性
–准备:为类的静态变量分配内存,并将其初始化为默认值
–解析:把类中的符号引用转换为直接引用

初始化是指:为类的静态变量赋予正确的初始值

 

其中说的准备和初始化都是指的对静态变量进行的,因为此时还没有实例。

造成上面输出结果的原因,也是在准备和初始化的顺序造成的。

在上面的代码中,当类加载的时候,会先执行准备操作,这个时候count1,count2都被初始化成默认值,也就是0,同时准备static TestLoad load=new TestLoad(); 这行代码的时候,会执行
private TestLoad(){
count1++;
count2++;
}

这个构造方法,此时,count1,count2都被符成了1,1;但是当类在初始化的时候,又重新把count2设置成了用户设置的初始值,也就是count2=0,而count1并没有初始值,所以count1的值还是1

 

 

而第二种情况是,static TestLoad load=new TestLoad(); 放到了两个变量已经有初始值(也就是已经完成了初始化操作)的情况下,再执行,所以count1,count2都会是1

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics