Java类实例化顺序总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hqqqqqqq555/article/details/85766725

直接上一段代码:

public class LoadOrder {
    public static void main(String[] args) {
        Son son = new Son();
        System.out.println("&&&&&&&&&&&&&&&&&&&&&&&");
        Son son1 = new Son();
    }
}

class GrandFather {
    private static String GrandFatherStaticField = getGrandFatherStaticField();
    private String GrandFatherNonStaticField = getGrandFatherNonStaticField();
    
    static {
        System.out.println("爷爷的静态代码块");
    }

    {
        System.out.println("爷爷的非静态代码块");
    }

    public GrandFather() {
        System.out.println("爷爷的构造函数");
    }

    static String getGrandFatherStaticField() {
        System.out.println("爷爷的静态字段");
        return "GrandFatherStaticField";
    }

    static String getGrandFatherNonStaticField() {
        System.out.println("爷爷的非静态字段");
        return "GrandFatherNonStaticField";
    }
}

class Father extends GrandFather {
    private static String FatherStaticField = getFatherStaticField();
    private String FatherNonStaticField = getFatherNonStaticField();

    static {
        System.out.println("爸爸的静态代码快");
    }

    {
        System.out.println("爸爸的非静态代码快");
    }

    public Father() {
        System.out.println("爸爸的构造函数");
    }

    static String getFatherStaticField() {
        System.out.println("爸爸的静态字段");
        return "FatherStaticField";
    }

    static String getFatherNonStaticField() {
        System.out.println("爸爸的非静态字段");
        return "FatherNonStaticField";
    }


}

class Son extends Father {
    private static String SonStaticField = getSonStaticField();
    private String SonNonStaticField = getSonNonStaticField();

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

    {
        System.out.println("儿子的非静态代码块");
    }

    public Son() {
        System.out.println("儿子的构造方法");
    }

    static String getSonStaticField() {
        System.out.println("儿子的静态字段");
        return "SonStaticField";
    }

    static String getSonNonStaticField() {
        System.out.println("儿子的非静态字段");
        return "SonNonStaticField";
    }
}

执行结果:

爷爷的静态字段
爷爷的静态代码块
爸爸的静态字段
爸爸的静态代码快
儿子的静态字段
儿子的静态代码块
爷爷的非静态字段
爷爷的非静态代码块
爷爷的构造函数
爸爸的非静态字段
爸爸的非静态代码快
爸爸的构造函数
儿子的非静态字段
儿子的非静态代码块
儿子的构造方法
&&&&&&&&&&&&&&&&&&&&&&&
爷爷的非静态字段
爷爷的非静态代码块
爷爷的构造函数
爸爸的非静态字段
爸爸的非静态代码快
爸爸的构造函数
儿子的非静态字段
儿子的非静态代码块
儿子的构造方法

可以看到执行顺序是:

  1. 父类静态字段 => 父类静态代码块 => 子类静态字段 => 子类静态代码块 =>
  2. 父类字段 => 父类代码块 =>父类构造方法 => 子类字段 => 子类代码块 =>子类构造方法

其中第1步只会执行1次,第2步会在每次实例化对象时都执行。
注意:静态字段和静态代码块的执行顺序是根据代码顺序来的,如果静态代码块在静态字段之前,就先执行静态代码块。

猜你喜欢

转载自blog.csdn.net/hqqqqqqq555/article/details/85766725