您的位置:首页 > 编程语言 > Java开发

java类加载顺序

2015-06-05 14:53 363 查看
这里用个经典问题来说明。

class Person {
private static Person person = new Person();

public static int count1;

public static int count2 = 5;

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

public static Person getInstance()
{
return person;
}

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

}
输出为1和5。

过程:

1.类的加载:把类的二进制数据加载到内存中

2.连接

2.1. 验证:确保被加载类的正确性

2.2 准备:为类的静态变量分配内存并赋值(注意这里赋的是默认值)

2.3 解析:符合引用转为直接引用

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

针对上述代码进行分析:

首先对类的静态变量分配内存并赋默认值。这里有3个静态变量:person count1 count2。按顺序分配内存并且赋默认值为null 0 0。接着调用了静态方法getInstance,该步骤触发了整个类的初始化,也就是上面第三步。person变量的初始化过程调用了构造函数,在构造函数中对count1 count2进行了++操作,值变为1 1。接着继续进行count1
count2变量的初始化赋值, count1没有赋值,保持1。count2赋值5,结果由1变成了5,所以最后的结果为1和5。

把上面的部分代码换一下:

public static int count1;

public static int count2 = 5;

private static Person person = new Person();


加载过程直到为静态变量分配内存并赋默认值都和上面一样。从初始化开始发生了变化:初始化顺序变为了先对count1 count2进行初始化,再对person变量进行初始化。count1初始化为了0,count2初始化为了5,再对person进行初始化,调用其构造函数,在构造函数中对count1和count2进行了++操作,所以结果变为1和6。

总结:静态变量的初始化顺序对结果会产生很大的影响,这点在代码编写中要特别注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: