java基础-类的加载顺序

一、类的加载顺序

代码如下(示例):

class Root {
	static {
		System.out.println("root的静态初始化块");
	}
	{
		System.out.println("root的普通初始化块");
	}	
	public  Root () {
		System.out.println("root的无参构造器");
	}	
	public  Root (String msg) {
		this();
		System.out.println("Root的带参构造器" + msg);
	}	
}
class Mid extends Root {
	static {
		System.out.println("Mid的静态初始化块");
	}	
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid() {
		super("这有个参数");
		System.out.println("Mid的无参构造器");
	}
	public Mid(String msg) {
		this();		
		System.out.println("Mid的带参构造器" + msg);
	}
}
class Leaf extends Mid{
	static {
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}
	public Leaf() {
		super("这还有个参数");
		System.out.println("Leaf的无参构造器");
	}
}
  public class LeafTest {
	public static void main(String[] args) {
		Leaf leaf1 =new Leaf();
		System.out.println("*****************");
		Leaf leaf2 =new Leaf();
	}
}

2运行结果

代码如下(示例):

root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
root的普通初始化块
root的无参构造器
Root的带参构造器这有个参数
Mid的普通初始化块
Mid的无参构造器
Mid的带参构造器这还有个参数
Leaf的普通初始化块
Leaf的无参构造器
*****************
root的普通初始化块
root的无参构造器
Root的带参构造器这有个参数
Mid的普通初始化块
Mid的无参构造器
Mid的带参构造器这还有个参数
Leaf的普通初始化块
Leaf的无参构造器

总结

规律:由父及子,静态先行,代码块先于构造器
1、首先,在new一个对象之前会先加载类,在加载类时会先加载父类(没有自定义父类就是object类),然后依次加载子类,因为静态块是随着类的加载而执行,所以最先输出的是三个类的静态块
2.其次构造器中的super,会再一次到父类,所以会继续依次执行三个类中的非静态代码块,最后是构造函数
3. 因为静态块只在类加载时执行一次,所以当再一次new一个对象时 ,会从父类的非静态代码块开始,然后是构造器

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页