Java类的初始化顺序

作者: 第四单元 | 来源:发表于2017-11-03 15:21 被阅读13次

这票文章主要想来说一下Java类各部分(非静态字段初始化、非静态块、静态字段初始化、静态块、构造函数)的执行顺序。

1.不考虑继承的情况

写了一个demo来验证。构造了一个包含上述各个部分的类,观察在new一个这个类的对象时的输出。代码如下:

public class LoadOrderHelp {
    static {
        System.out.println("1:静态块");
        b = 1;
        //这一句报错(Illegal forward reference ),即不能在b没有声明初始化前输出,到可以赋值。咦!
        //System.out.println(b); 
    }
    public static int b = 10;  //静态字段初始化
    static {
        System.out.println("2: 静态块 static b = " + b);
        b = 5;
    }

    private int a = 1;//非静态字段初始化
    {
        System.out.println("3:非静态块 a = " + a + " b = " + b);
    }

    {
        System.out.println("4:非静态块 a = " + a);
    }

    public LoadOrderHelp() {
        System.out.println("5:构造函数 a = " + a +" b = " + b);
    }

    public static void main(String[] args) {
        LoadOrderHelp loadOrderHelp = new LoadOrderHelp();
    }
}

输出如下:

1:静态块
2: 静态块 static b = 10
3:非静态块 a = 1 b = 5
4:非静态块 a = 1
5:构造函数 a = 1 b = 5

从输出可以看出,总体上以静态内容->非静态内容->构造函数的顺序执行。

分析:

静态块和静态字段初始化是在类加载的时候就进行的,而非静态字段和块是在实例化对象时进行的,而构造函数又在字段和块之后执行,所以总体上呈现了上述顺序。

总结:
  • 静态字段只在类第一次加载时初始化一次。
  • 创建一个新对象new Dog()时,先在堆上为对象分配足够的内存,然后将这片内存清零(数字为0,布尔为false)引用为null。然后执行所有非静态字段的初始化(静态字段的初始化这时已经完成了),然后执行构造函数。
  • 注意:java鼓励使用变量之前进行初始化,不应该依赖与默认的初始值。好的做法时总是对变量进行初始化。

2. 考虑带父类的情况

有人总结为:父类静态变量——父类静态代码块——子类静态代码块——父类非静态变量——父类非静态代码块——父类构造函数——子类非静态变量——子类非静态代码块——子类构造函数
总体上呈先静态后非静态,先父类后子类,构造函数最后的顺序。

相关文章

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • JAVA的类加载顺序

    理解关于java类的加载顺序 首先来捋一捋java类的加载顺序吧 父类静态代码块 》》静态代码初始化,静态属性(带...

  • Java类的初始化顺序

    Java类的初始化顺序 (静态变量、静态代码块)> 类里的 main()(如果有的话) > (变量、初始化块) >...

  • Java类加载与初始化

    今天复习了一下java类加载时的初始化顺序,先记录一下心得,代码后续补上。 类加载时的初始化顺序 1、一般来说,类...

  • Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ...

  • java构造器初始化与清理

    java构造器初始化先后顺序: 若此类继承于某基类,则先初始化基类,以此类推,找到最基本的父类,先对基类进行初始化...

  • 设计模式——工厂,策略,建造者

    Java 类初始化顺序基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量对于块顺序,静态...

  • java 类初始化 顺序

    Java 类初始化介绍 java语言在使用过程中最先开始就是初始化,在工作中如果遇到什么问题需 要定位往往到最后也...

  • java类初始化顺序

    1.静态代码块,静态变量,按代码顺序先后执行.2.构造代码块,成员变量,按代码顺序先后执行.3.先执行构造块或成员...

网友评论

    本文标题:Java类的初始化顺序

    本文链接:https://www.haomeiwen.com/subject/kwqtmxtx.html