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.非静态属性和非静态代码块是在类创建实例的时候执行,优先于构造方法,执行顺序与代码顺序相同。

你可能感兴趣的:(java基础)