Java初始化顺序
父类静态变量
\(\rightarrow\)父类静态代码块
\(\rightarrow\)子类静态变量
\(\rightarrow\)子类静态代码块
\(\rightarrow\)父类非静态变量
\(\rightarrow\)父类非静态代码块
\(\rightarrow\)父类构造器
\(\rightarrow\)子类非静态变量
\(\rightarrow\)子类非静态代码块
\(\rightarrow\)子类构造器
Java程序初始化一般遵循3个原则:
- 静态对象(变量)先于非静态对象(变量)初始化。其中静态对象(变量)只初始化一次,因为
static
在JVM中只有一块区域存储——方法区(Method Area),之所以被称为静态是因为从程序创建到死亡,它的地址值都不会改变,其只在Class类对象初次加载时初始化,因此static只需要初始化一次,而非静态对象(变量)可能会初始化很多次。 - 如果类之间存在继承关系,那么父类优先于子类进行初始化。
- 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法之中,它们依然在任何方法(包括构造函数)被调用前先初始化。