Java对象初始化顺序

在实例化对象前,如果没有加载过相应的类信息,那么会首先加载类,然后才实例化对象。

在这种情况下,顺序为:

a. 加载类

  1. 为父类静态属性分配内存并赋值 / 执行父类静态代码段 (静态代码块和静态成员,先后按照实际的代码顺序,进行初始化)
  2. 为子类静态属性分配内存并赋值 / 执行子类静态代码段 (按代码顺序)

b. 创建对象

  1. 为父类实例属性分配内存并赋值 / 执行父类非静态代码段 (按代码顺序)
  2. 执行父类构造器
  3. 为子类实例属性
  4. 执行子类构造函数
加载类的过程只会执行一次,因此,今天成员的初始化也只有一次,在此只会,再进行子类对象初始化,只会执行普通成员和构造函数的初始化。
用代码进行测试:
public class Father {
    Another a = new Another("father 普通成员");
    static Another a1 = new Another("father 静台成员");
    static {
        Another a2 = new Another("father static block");
    }

    public Father(){
        System.out.println("执行father构造");
    }
}

子类:

public class Son extends Father{

    static Another aa1 = new Another("son 静态成员");
    Another a2 = new Another("son 普通成员");

    static{
        Another a2 = new Another("son 静态代码块");
    }
    public Son(){
        System.out.println("执行Son构造函数");
    }

}

 

测试类:

public class Test {



    static {
        System.out.println("静态代码块执行");
    }


    public static void main(String[] args) {
        Son tn = new Son();

    }
}

输出为:

静态代码块执行
father 静台成员
father static block
son 静态成员
son 静态代码块
father 普通成员
执行father构造
son 普通成员
执行Son构造函数

参考:https://www.zhihu.com/question/49196023/answer/114859346

 

posted @ 2019-10-28 10:18  sliec  阅读(235)  评论(0编辑  收藏  举报