- 假如这个类还没有被加载和连接,那就先进行加载和连接
- 假如类存在直接父类,并且这个父类还没有被初始化,那么就先初始化直接父类
- 假如类中存在初始化语句,那就依次执行这些初始化语句
类加载的初始化赋值是按照代码声明的顺序进行
public class ClassLoadTest {
/**
* 当调用一个类的静态方法时触发对这个类进行初始化
* @param args
*/
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.a); //1
System.out.println(singleton.b); //1
System.out.println("---------------------------");
Singleton2 singleton2 = Singleton2.getInstance();
System.out.println(singleton2.a); //1
System.out.println(singleton2.b); //0
}
}
/**
* 1.类准备阶段对类中静态参数进行赋默认值 a=0,b=0,singleton=null;
* 2.当调用静态方法getInstance()时,触发Singleton初始化按顺序初始化变量
* 3.a=0,b=0,singleton = new Singleton()
* 4.当触发Singleton的构造方法a=1,b=1
*/
class Singleton {
public static int a;
public static int b = 0;
private static Singleton singleton = new Singleton();
private Singleton() {
a++;
b++;
}
public static Singleton getInstance() {
return singleton;
}
}
/**
* 1.类准备阶段对类中静态参数进行赋默认值 a=0,singleton=null,b=0;
* 2.当调用静态方法getInstance()时,触发Singleton2初始化按顺序初始化变量
* 3.a=0,singleton = new Singleton()
* 4.当触发Singleton的构造方法a=1,b=1
* 5.b=0(当触发b赋值时将构造方法中修改的值覆盖)
*/
class Singleton2 {
public static int a;
private static Singleton2 singleton = new Singleton2();
public static int b = 0;
private Singleton2() {
a++;
b++;
}
public static Singleton2 getInstance() {
return singleton;
}
}