关于java中代码块和构造函数的加载顺序以及父类和子类中的加载顺序

首先,我们简单了解一下代码块和构造方法

静态代码块:

存在类内方法外,使用static修饰,作用是类的预加载,当类第一次被加载的时候执行一次,优先于构造代码块 优先于构造方法
构造代码块:

存在类内方法外,作用是对象的预加载,每当new调用构造方法的时候 会优先执行构造代码块,每new一次就优先执行一次构造代码块

普通代码块:

存在成员方法中,作用是控制变量的生命周期,执行完后立即消失.
构造方法:

创建对象的方式,每当调用构造方法时,构造方法执行一次 

关于加载顺序,我们将通过实现代码来查看

一、定义一个父类

public class Die {
	int age;

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

	{
		// 父类的构造代码块
		System.out.println("父类的构造代码块");
	}

	// 父类无参
	public Die() {
		this(20);
		System.out.println("父类的无参构造方法");
		// 普通代码块
		{
			System.out.println("父类的代码块");
		}
	}

	// 父类含参
	public Die(int age) {
		super();
		this.age = age;
		System.out.println("父类的含参构造方法");

	}

}

二、定义一个子类

public class Zi extends Die{
	String name;
	static{
		System.out.println("子类的静态代码块");
	}
	
	{
		//构造代码块
		System.out.println("子类的构造代码块");
	}
	
	//子类无参
	public Zi() {
		this("");//在执行子类的含参构造方法 但是没有对象产生
		System.out.println("子类无参构造方法");
		//普通代码块
		{
			System.out.println("子类的代码块");
		}
	}

	//子类含参
	public Zi(String name) {
		super();
		this.name = name;
		System.out.println("子类的含参构造");
	}
	
}

三、测试类

public class ExtendsDemo {
	public static void main(String[] args){
		Zi z = new Zi();
		System.out.println("==========");
		Die d = new Zi();
	}
}

结果:

Zi z = new Zi()    的运行结果:
父类的静态代码块
子类的静态代码块
父类的构造代码块
父类的含参构造方法
父类的无参构造方法
父类的代码块
子类的构造代码块
子类的含参构造
子类无参构造方法
子类的代码块
Die d = new Zi()    的运行结果:
父类的构造代码块
父类的含参构造方法
父类的无参构造方法
父类的代码块
子类的构造代码块
子类的含参构造
子类无参构造方法
子类的代码块

静态代码块只加载一次,所以第二次没有加载静态代码块

猜你喜欢

转载自blog.csdn.net/znmdwzy/article/details/81610988