首先明白类加载三个阶段:加载,连接,初始化。连接阶段还分了三个步骤:验证,准备,解析。
类加载
- 加载
将.class
文件二进制数据加载进内存。
- 连接
把类的二进制合到到JRE中,分三个步骤。
- 验证:检验加载的类内部结构是否正确,并和其他类协调一致。
- 准备:为类静态变量分配内存,并设置默认值(仅包含类静态变量,不包含实例变量)。
- 解析:虚拟机将常量池中的符号引用替换为直接引用。
- 初始化
类静态变量初正确的初始值,执行静态代码块,执行构造方法等。
示例代码
示例一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.java.classloader;
public class Demo1 {
public static void main(String[] args) { Singleton s = Singleton.getSingleton(); System.out.println("counter1 = " + s.counter1); System.out.println("counter2 = " + s.counter2); } }
class Singleton {
private static Singleton singleton = new Singleton();
public static int counter1; public static int counter2 = 0;
public Singleton() { counter1++; counter2++; }
public static Singleton getSingleton() { return singleton; } }
|
示例二