1, 在第一次创建一个类的对象或者第一次调用一个类的静态属性和方法的时候,会发生类加载
2, java的静态属性等,实在类加载时执行的,在程序启动时,并没有执行.
3, 代码示例:
/**
* @Description 类中常量,静态属性,静态方法,静态代码块,代码块,构造方法的加载顺序
* @author Dev
*
*/
public class ClassLoadOrder { //第一步,准备加载类
static int num = 4; //第二步,静态变量和静态代码块的加载顺序由编写先后决定
{
num += 3;
System.out.println("b"); //第四步,加载匿名代码块
}
int a = 5; //第五步,加载变量
ClassLoadOrder() { //第六步,最后加载构造函数,完成对象的建立
System.out.println("c");
}
static { // 第三步,静态块,然后执行静态代码块,因为有输出,故打印a
System.out.println("a");
}
static void run() // 静态方法,调用的时候才加载,注意看,d没有加载
{
System.out.println("d");
}
}
class TestOne{
public static void main(String[] args) {
ClassLoadOrder classLoadOrder = new ClassLoadOrder(); //创建ClassLoadOrder这个类的对象,使ClassLoadOrder类发生类加载
}
}
二: 含有集成的类的加载顺序
public class HelloB extends HelloA{
public HelloB() {
System.out.println("HelloB"); //6 加载子类构造方法
}
{System.out.println("I'm B class!");} //5 加载子类代码块
static {System.out.println("static B");} //2 加载子类的静态代码块
public static void main(String[] args) {
new HelloB();
}
}
class HelloA{
public HelloA() {
System.out.println("HelloA"); //4 加载父类构造方法
}
{System.out.println("I'm A class!");} //3 加载父类代码块
static {System.out.println("static A");} //1 加载父类的静态代码块
}