Java对象初始化顺序

Posted sliec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Java对象初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

静态代码块构造代码块构造函数以及Java类初始化顺序

Java变量Java对象初始化顺序

静态代码块构造代码块构造函数以及Java类初始化顺序

java中的静态代码块、代码块、构造器的执行顺序是怎样呢,这三者有啥作用呢

导航上的片段生命周期重叠

java对象初始化的顺序