java中的类加载顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingletonDemo {
private static SingletonDemo singletonDemo = new SingletonDemo();
private static int count1;
private static int count2 = 0;

public SingletonDemo() {
count1++;
count2++;
System.out.println("count1:" + count1);// 1
System.out.println("count2:" + count2);// 2

}
public static void main(String[] args) {
System.out.println("count1:" + count1);// 3
System.out.println("count2:" + count2);// 4
}
}

分析:

类的加载过程为:转载 – 链接 – 初始化

  • 装载:根据类全路径进行加载
  • 链接包含三个步骤:验证 - 准备 - 解析。
    • 验证:
      • 文件格式验证
      • 元数据验证
      • 字节码验证
      • 符号引用验证
    • 准备:为类的静态变量分配内存,并将其初始化为默认值。
    • 解析:把类中的符号引用转换为直接引用

初始化阶段会初始化类中的:

  • 静态成员变量singletonDemo,初始化时,count1count2默认为0,初始化后count1count2都是1,所以1和2位置输出均为1。
  • 静态变量count1count2,初始化前count1count2都是1,初始化后count2被赋值为0。所以3和4的位置输出1,0