JVM类加载机制—加载的顺序问题

1、代码

package com.aop8.classload;

public class Demo01 {
	
	static {
		System.out.println("静态代码块Demo01");
	}

	public static void main(String[] args) {
		System.out.println("main方法");
		System.out.println("=============================");
		A a = new A();
		System.out.println("=============================");
		A a2 = new A();
		System.out.println("=============================");
		System.out.println(B.density);
		System.out.println("=============================");
		System.out.println(C.y);
		System.out.println("=============================");
		System.out.println(C.x);
	}
}

class A extends A_Father {
	
	public static int width = 100;
	public static final int heigth = 200;
	
	static {
		System.out.println("静态代码块A");
		width = 300;
	}

	public A() {
		System.out.println("构造方法A");
	}
}

class A_Father {
	public static int capacity = 300;
	public static int high = 50;

	static {
		System.out.println("静态代码块A_Father");
	}

	public A_Father() {
		System.out.println("构造方法A_Father");
	}
}

class B {
	public static final double density = 0.52;

	static {
		System.out.println("静态代码块B");
	}
}

class C extends C_Father {
	public static int x = 12;

	static {
		System.out.println("静态代码块C");
	}
}

class C_Father {
	public static int y = 12;

	static {
		System.out.println("静态代码块C_Father");
	}
}

2、运行结果:

静态代码块Demo01
main方法
=============================
静态代码块A_Father
静态代码块A
构造方法A_Father
构造方法A
=============================
构造方法A_Father
构造方法A
=============================
0.52
=============================
静态代码块C_Father
12
=============================
静态代码块C
12

3、分析:

代码开始由 public 这个类开始,加载这个类的时候,
首先看有没有静态的属性,以及静态的代码块(这里有静态代码块Demo01 )。

然后是 main 这个主方法,打印(main方法),

然后是A a语句,这时候加载类A,因为A有父类,先加载父类,
对于父类还是先看其有没有静态的属性,代码块,这里父类打印(静态代码块A_Father),
然后再加载子类,检查静态代码块(静态代码块A),再执行语句new A,同样先打印父类(构造方法A_Father),然后是子类的构造方法(构造方法A)。

再次执行 A a2 的时候,不会再进行加载了,new A()的时候,构造方法还是会进行调用打印(构造方法 A_Father )和(构造方法A )。

在执行 B.density 的时候,因为其为 final 类型的,则其类不会加载。(假如其类型不是 final,只是static,则先打印 静态代码块B,再打印出其值 )。

然后是 C.y,直接加载父类 C_Father,则打印(静态代码块 C_Father)。

然后在执行 C.x,加载类 C,打印(静态代码块C

参考

Java类的加载和代码执行顺序:
https://blog.csdn.net/qq_34993631/article/details/82890187

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/88061387