码迷,mamicode.com
首页 > 编程语言 > 详细

Java对象初始化顺序

时间:2019-10-28 10:37:42      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:代码   初始化顺序   加载   end   www   实例化   先后   style   情况   

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

在这种情况下,顺序为:

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对象初始化顺序

标签:代码   初始化顺序   加载   end   www   实例化   先后   style   情况   

原文地址:https://www.cnblogs.com/shuhe-nd/p/11750740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!