快捷搜索:

Java类的完整构造执行顺序

这里只说一个完备的结果,至于为什么是这样的顺序,可以参考我曩昔的文章:深入剖析java类的构造要领

假如父类有静态成员赋值或者静态初始化块,履行静态成员赋值和静态初始化块

假如类有静态成员赋值或者静态初始化块,履行静态成员赋值和静态初始化块

将类的成员付与初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;工具类型的初始值为null)

假如构造措施中存在this()调用(可所以其它带参数的this()调用)则履行之,履行完毕落后入第7步继承履行,假如没有this调用则进行下一步。(这个有可能存在递归调用其它的构造措施)

履行显式的super()调用(可所以其它带参数的super()调用)或者隐式的super()调用(缺省构造措施),此步骤又进入一个父类的构造历程并不停上推至Object工具的构造。

履行类申明中的成员赋值和初始化块。

履行构造措施中的其它语句。

此中第4步是对照麻烦的,由于this调用实际上会调用类的别的一个构造措施,终极应该是履行类的某个构造措施,它可能会显示的调用super,然则无论是否调用super,终极都是履行super的,也便是父类的构造措施并不停这样递归到Object,以是在子类和父类的构造中,首先构造或者说履行的是父类的构造,然则它是由子类的构造措施调用的,先于构造措施的措施体里面的内容,这个是由编译器抉择的。以是我感到简单直不雅一些的顺序表述应该是:

假如父类有静态成员赋值或者静态初始化块,履行静态成员赋值和静态初始化块

假如类有静态成员赋值或者静态初始化块,履行静态成员赋值和静态初始化块

将类的成员付与初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;工具类型的初始值为null)

履行构造措施,并可能递归调用this(),终极先履行父类的构造措施并不停递归到Object的构造措施的履行

父类的构造措施履行完成后,履行类申明中的成员赋值和初始化块。

履行构造措施中的其它语句。

终极的简化顺序版本是:

父类的静态成员赋值和静态块

子类的静态成员和静态块

父类的构造措施

父类的成员赋值和初始化块

父类的构造措施中的其它语句

子类的成员赋值和初始化块

子类的构造措施中的其它语句

2006年11月16日更新:

针对留言中提到的那个文章中的问题发明这个顺序也是有不够的环境,这个顺序是一样平常的顺序,然则有可能被突破,留言中的那篇文章便是一个例子,由于在履行静态初始化块的时刻先履行了类的构造,突破了这个一样平常顺序。以是这个顺序有个条件便是静态赋值和初始化块中没有对本类的实例化语句。

对付那个文章中的问题,作者着末的办理措施可行,然则不见得是最好的,可以简单的改动静态赋值和静态初始化块的顺序,改动后的代码片断为:

public class CachingEnumResolver {

private static Map CODE_MAP_CACHE;

/*MSGCODE->Category内存索引*/

static {

CODE_MAP_CACHE = new HashMap();

//为了阐明问题,我在这里初始化一条数据

CODE_MAP_CACHE.put("0","北京市");

}

//单态实例 统统问题皆由此行引起

private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = newCachingEnumResolver();

您可能还会对下面的文章感兴趣: