Java的初始化,关于各个代码块的运行顺序

          最近刷题遇到了很多这方面的题,最开始看到这个是一脸懵逼的,以前对于这个知识点是一带而过的,没有注意过,后来又重新查找了资料,知道了一些,在此做个小结。

          先上代码:

//父类
class A{
	
	//静态代码块
	static {
		System.out.println("父类的静态代码块");
	}
	
	//构造代码块
	{
		System.out.println("父类的构造代码块");
	}
	
	//构造函数
	public A() {
		System.out.println("父类的构造方法");
	}
}

//子类
class B extends A{
	//静态代码块
	static {
		System.out.println("子类的静态代码块");
	}
	
	//构造代码块
	{
		System.out.println("子类的构造代码块");
	}
	
	//构造函数
	public B() {
		System.out.println("子类的构造方法");
	}
}

public class TestOrder {
	public static void main(String[] args) {
		new B();
	}
}

执行结果:

父类的静态代码块
子类的静态代码块
父类的构造代码块
父类的构造方法
子类的构造代码块
子类的构造方法

     通过代码发现这个顺序一目了然 , 其底层原理是,在java代码在运行时,会先通过经过编译器编译变为.class文件(可以自己看下自己的java文件bin文件夹),然后在放入JVM(java虚拟机)中运行,在类的初始化过程中时,类的静态代码块会优先执行(在类的加载阶段就已经执行),然后是构造代码块,顾名思义,和构造函数肯定有关系,构造代码块依托于构造函数,构造代码块只有在每次创建对象时都会执行一次,优先于构造函数,所以执行结果顺序就是:

静态代码块——>构造代码块——>构造函数

    子类的创建依赖于父类(没有父母,哪来的孩子),故在创建子类之前,要先创建一个父类,最后的如结果所示。

你可能感兴趣的:(笔记)