Java类的初始化顺序
(静态变量、静态代码块)> 类里的 main()(如果有的话) > (变量、初始化块) > 构造函数。
(父类 静态变量、静态代码块)> (子类 静态变量、静态代码块) > 子类main()(如果有的话) > (父类 变量、初始化块) > 父类构造函数 > (子类 变量、初始化块) > 子类 构造函数 。
其中:
- 静态变量与静态代码块 的顺序取决于代码中出现的顺序,变量与初始化块也一样。
- 子类加载的时候,如果发现有父类,则优先父类,父类还有父类以此递归,顺序按上面的初始化顺序。
示例代码:
public class JavaClassInitOrder {
public static String staticField = "静态变量";
public String field = "变量";
static {
System.out.println( staticField );
System.out.println( "静态初始化块" );
}
/* 初始化块 */
{
System.out.println( field );
System.out.println( "初始化块" );
}
/* 构造器 */
public JavaClassInitOrder() {
System.out.println( "构造器" );
}
public static void main( String[] args ) {
System.out.println( "main1" );
new JavaClassInitOrder();
System.out.println( "main2" );
}
}
输出:
- 静态变量
- 静态初始化块
- main1
- 变量
- 初始化块
- 构造器
- main2
继承代码示例:
public class ExtendsClassInitOrder extends Child{
public static String staticField = "子类-静态变量";
public String field = "子类-变量";
static {
System.out.println( staticField );
System.out.println( "子类-静态初始化块" );
}
/* 初始化块 */
{
System.out.println( field );
System.out.println( "子类-初始化块" );
}
/* 构造器 */
public ExtendsClassInitOrder(){
System.out.println( "子类-构造器" );
}
public static void main(String[] args){
System.out.println( "子类-main1" );
new ExtendsClassInitOrder();
System.out.println( "子类-main2" );
}
}
class Parent{
public static String P_staticField = "父父类-静态变量";
public String P_field = "父父类-变量";
static {
System.out.println( P_staticField );
System.out.println( "父父类-静态初始化块" );
}
/* 初始化块 */
{
System.out.println( P_field );
System.out.println( "父父类-初始化块" );
}
/* 构造器 */
public Parent() {
System.out.println( "父父类-构造器" );
}
}
class Child extends Parent{
public static String C_staticField = "父类-静态变量";
public String C_field = "父类-变量";
static {
System.out.println( C_staticField );
System.out.println( "父类-静态初始化块" );
}
/* 初始化块 */
{
System.out.println( C_field );
System.out.println( "父类-初始化块" );
}
/* 构造器 */
public Child() {
System.out.println( "父类-构造器" );
}
}
输出:
父父类-静态变量
父父类-静态初始化块
父类-静态变量
父类-静态初始化块
子类-静态变量
子类-静态初始化块
子类-main1
父父类-变量
父父类-初始化块
父父类-构造器
父类-变量
父类-初始化块
父类-构造器
子类-变量
子类-初始化块
子类-构造器
子类-main2