NOTE

7.8 类初始化顺序

1. 什么时候会触发初始化 new一个实例或者main方法所在类 2. 初始化规则 如果父类没有初始化,那么首先初始化父类 3. 举例 3.1. 单个类的情况 - 结果 3.2. 继承的情况 - 结果 4. 参考 - Java类初始化顺序 \- code\-craft \- SegmentFault

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么时候会触发初始化

new一个实例或者main方法所在类

2. 初始化规则

如果父类没有初始化,那么首先初始化父类

3. 举例

3.1. 单个类的情况

public class InitialOrderTest
{
    /* 静态变量 */
    public static String staticField = "静态变量";
    /* 变量 */
    public String field = "变量";

    /* 静态初始化块 */
    static
    {
        System.out.println(staticField);
        System.out.println("静态初始化块");
    }

    /* 初始化块 */
    {
        System.out.println(field);
        System.out.println("初始化块");
    }

    /* 构造器 */
    public InitialOrderTest()
    {
        System.out.println("构造器");
    }


    public static void main(String[] args)
    {
        new InitialOrderTest();
    }
}
  • 结果
静态变量
静态初始化块
变量
初始化块
构造器

3.2. 继承的情况

class Parent
{
    /* 静态变量 */
    public static String p_StaticField = "父类--静态变量";
    /* 变量 */
    public String p_Field = "父类--变量";
    protected int i = 9;
    protected int j = 0;

    /* 静态初始化块 */
    static
    {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }

    /* 初始化块 */
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }

    /* 构造器 */
    public Parent()
    {
        System.out.println("父类--构造器");
        System.out.println("i=" + i + ", j=" + j);
        j = 20;
    }
}

public class SubClass extends Parent
{
    /* 静态变量 */
    public static String s_StaticField = "子类--静态变量";
    /* 变量 */
    public String s_Field = "子类--变量";

    /* 静态初始化块 */
    static
    {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }

    /* 初始化块 */
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }

    /* 构造器 */
    public SubClass()
    {
        System.out.println("子类--构造器");
        System.out.println("i=" + i + ",j=" + j);
    }

    /* 程序入口 */
    public static void main(String[] args)
    {
        System.out.println("子类main方法");
        new SubClass();
    }
}
  • 结果
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
子类main方法
父类--变量
父类--初始化块
父类--构造器
i=9, j=0
子类--变量
子类--初始化块
子类--构造器
i=9,j=20

4. 参考