类是java中重要的引用数据类型,了解类的初始化顺序对正确设计程序逻辑具有重要的指导作用。本文主要从创建对象角度分析类的初始化顺序,主要包含两个方面内容:一是创建对象时各成员的初始化顺序。二是创建子类对象时各成员的初始化顺序。
一、创建对象时初始化顺序
类中具有普通成员变量、静态成员变量、普通初始化代码块、静态代码块、构造函数,在一个类中它们的执行初始化顺序是:静态成员、静态代码块、普通成员变量、普通初始化代码块、构造函数。示例如下:
图1 Parent类定义
图2类初始化顺序
如果同一个类创建多个对象时,普通初始化代码块会执行多次,静态代码块执行一次。如下图3所示:
图3创建同一个类多个对象时执行情况
二、父类及子类初始化顺序
定义一个Parent的子类Child如下图4所示:
图4 Child类定义
子类对象创建时,初始化顺序是:父类静态成员、父类静态代码块、子类静态成员、子类静态代码块、父类普通成员变量、父类普通初始化代码块、父类构造函数、子类普通成员变量、子类普通初始化代码块、子类构造函数。创建一个子类对象的初始化顺序如下图5所示:
图5创建一个子类对象时初始化顺序
创建多个子类对象时,如图6所示,类的初始化顺序是: 父类普通成员变量、父类普通初始化代码块、父类构造函数、子类普通成员变量、子类普通初始化代码块、子类构造函数,从以上可以看出父类及子类的代码块只执行了一次。
图6创建多个子类对象时执行情况