本文对类初始化顺序总结,

java 代码示例1

/**
 * 类的初始化顺序
 * (无显示继承)
 *
 * @author lawt
 * @date 2019年1月16日
 */
public class InitialOrderTest {
/**
     * 静态变量
     */
    private static String STATIC_FIELD = "静态变量";
    /**
     * 变量
     */
    private String field = "变量";
    // 静态初始化块
    static {
        System.out.println(STATIC_FIELD);
        System.out.println("静态初始化块");
    }

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

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

public static void main(String[] args) {
new InitialOrderTest();
        System.out.println("--------------------------------------");
        new InitialOrderTest();
    }
}

运行结果:

Java类初始化顺序_System

所以顺序为:

静态成员、静态块----普通成员、非静态块---构造函数

Java类初始化顺序_子类_02

以上只是没有把显示继承放进来

java代码示例2

/**
 * 有继承关系的类初始化顺序
 *
 * @author lawt
 * @date 2018年7月5日
 */
class Parent {
// 静态变量
   public static String STATIC_FIELD
             = "父类--静态变量";
    protected int i = 1;
    protected int j = 8;
    // 变量
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(STATIC_FIELD);
        System.out.println("父类--静态初始化块");
    }

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

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

public void test() {
        System.out.println("父类---test");
        System.out.println("父类---i=" + i);
    }
}
/**
 * 类的初始化顺序
 *
 * @author lawt
 * @date 2019年1月16日
 */
public class SubClass extends Parent {

// 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    public int i = 0;
    // 静态初始化块
    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);
    }

@Override
    public void test() {
        System.out.println("子类---test");
        System.out.println("子类---i=" + i);
    }

// 程序入口
    public static void main(String[] args) {
        Parent parent = new SubClass();
        System.out.println("**Parent parent = new SubClass()**" + parent.i);
        System.out.println("**Parent parent = new SubClass()**" + parent.i);
        parent.test();
        System.out.println("-----------------------------------");
        SubClass subClass = new SubClass();
        System.out.println("=======" + subClass.i);
        subClass.test();
        System.out.println("***********************************");
        Parent p = new Parent();
        System.out.println("**  Parent p = new Parent()**i=" + p.i);
        p.test();
    }
}

运行结果:

父类--静态变量

父类--静态初始化块

子类--静态变量

子类--静态初始化块

父类--变量

父类--初始化块

父类--构造器

i=1, j=8

子类--变量

子类--初始化块

子类--构造器

i=0,j=9

**Parent parent = new SubClass()**1

**Parent parent = new SubClass()**1

子类---test

子类---i=0

-----------------------------------

父类--变量

父类--初始化块

父类--构造器

i=1, j=8

子类--变量

子类--初始化块

子类--构造器

i=0,j=9

=======0

子类---test

子类---i=0

***********************************

父类--变量

父类--初始化块

父类--构造器

i=1, j=8

**  Parent p = new Parent()**i=1

父类---test

父类---i=1

顺序为:

Java类初始化顺序_子类_03