欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java类实例化顺序总结

程序员文章站 2022-05-23 17:33:36
...

直接上一段代码:

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步会在每次实例化对象时都执行。

相关标签: 类实例化顺序