java静态属性/静态代码块、非静态属性/非静态代码块、构造方法及子父类的执行顺序
?请看下面小demo,这里有两个类SubClass和SupperClass,其中SubClass继承于SupperClass。
?
SupperClass类:
/**
?* 父类
?*
?* @author yangbl
?*
?*/
public class SupperClass {
??? static String staticVariable = "supper staticVariable initialize";
??? static {
??? ??? staticVariable = "supper static block execute";
??? ??? System.out.println(staticVariable);
??? }
??? {
??? ??? staticVariable = "supper block execute";
??? ??? System.out.println(staticVariable);
??? }
??? public SupperClass() {
??? ??? staticVariable = "supper constructor execute";
??? ??? System.out.println(staticVariable);
??? }
}
?
SubClass类:
/**
?* 子类
?*
?* @author yangbl
?*
?*/
public class SubClass extends SupperClass {
??? static {
??? ??? staticVariable = "subClass static block execute";
??? ??? System.out.println(staticVariable);
??? }
??? {
??? ??? staticVariable = "subClass block execute";
??? ??? System.out.println(staticVariable);
??? }
??? public SubClass() {
??? ??? staticVariable = "subClass constructor execute";
??? ??? System.out.println(staticVariable);
??? }
??? public static void main(String[] args) {
??? ??? SupperClass supperClass = new SubClass();
??? }
}
?
运行SubClass类中的main方法得到结果如下:
supper static block execute
subClass static block execute
supper block execute
supper constructor execute
subClass block execute
subClass constructor execute
?
分析结果可以得到如下加载执行顺序结论:
1.加载父类的静态属性和静态代码块。
2.加载子类的静态属性和静态代码块。
3.加载父类的非静态属性和非静态代码块。
4.加载父类的构造方法。
5.加载子类的非静态属性和非静态代码块。
6.加载子类的构造方法。
?
注:
1.静态属性和静态代码块是在类加载的时候就加载执行,执行顺序与代码顺序相同。
2.非静态属性和非静态代码块是在类创建实例的时候执行,优先于构造方法,执行顺序与代码顺序相同。