java中父类和子类中的静态代码块、非静态代码块和构造器的执行顺序

时间:2022-05-22 15:40:46

先来看一下程序:

package com.future.javaTest.testJavaProcess;
/**
* @ClassName: B
* @Description: 父类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。
* @author: a9858
* @date: 2016年8月19日 下午4:55:06
*/

public class B {
public B(){
System.out.println("this is B's constructor!");
}

static{
System.out.println("this is B's static block!");
}

{
System.out.println("this is B' static not block!");
}

}
package com.future.javaTest.testJavaProcess;
/**
* @ClassName: A
* @Description: 子类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。
* @author: a9858
* @date: 2016年8月19日 下午4:55:06
*/

public class A extends B{
/**
* @Title:A
* @Description:构造器
*/

public A(){
System.out.println("this is A's constructor!");
}

static{
System.out.println("this is A's static block!");
}

{
System.out.println("this is A' static not block!");
}

}
package com.future.javaTest.testJavaProcess;
/**
* @ClassName: Main
* @Description: 测试类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。<br>
* 结论:this is B's static block!<br>
this is A's static block!<br>
this is B' static not block!<br>
this is B's constructor!<br>
this is A' static not block!<br>
this is A's constructor!<br>
* @author: a9858
* @date: 2016年8月19日 下午4:57:49
*/

public class Main {
public static void main(String[] args) {
A a = new A();
}
}

测试方法测试的结果是:
this is B’s static block!
this is A’s static block!
this is B’ static not block!
this is B’s constructor!
this is A’ static not block!
this is A’s constructor


结论:在java构造对象时,先将本类和本类的父类加载到内存中,在加载的过程中会执行类中的静态代码块,执行的顺序是:父类静态代码块、子类静态代码块。然后才能继续执行程序(内存中必须有这个类才能构造这个类的实体对象嘛)。在构造本类的实体类之前就需要先调用类中的非静态代码块,然后再执行类的构造函数,来创建一个实体类,执行的顺序是:父类非静态代码块,父类构造函数,子类非静态代码块,子类构造函数。这个顺序的原因是:当new A();执行时,会调用A类的构造方法,但是A类有父类,就会先调用父类的构造方法,又因为父类有非静态代码块,所以就会先执行父类的非静态代码块,然后再执行父类的构造函数,然后才轮到A类,同样的,先执行A类的非静态代码块,再执行构造函数。