Java程序的初始化一般遵循3个原则(优先级依次递减):
- 静态对象(变量)优于非静态对象(变量)的初始化,其中,静态对象(变量)只初始化一次,非静态对象(变量)可能会初始化多次。
- 父类优先于子类进行初始化。
- 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,他们依然在任何方法(包括构造函数)被调用之前先初始化。
public class HelloA {
static {
System.out.println("HelloA:静态方法区");
}
public static int a = print("HelloA:静态变量");
{
System.out.println("HelloA:构造代码块");
}
public int b = print("HelloA:非静态变量");
public HelloA(){
super();
System.out.println("HelloA:构造类");
}
public static int print(String str){
System.out.println(str);
return 1;
}
}
main:
HelloA hel = new HelloA();
console:
HelloA:静态方法区
HelloA:静态变量
HelloA:构造代码块
HelloA:非静态变量
HelloA:构造类
修改顺序
public class HelloA {
public static int a = print("HelloA:静态变量");
static {
System.out.println("HelloA:静态方法区");
}
public int b = print("HelloA:非静态变量");
{
System.out.println("HelloA:构造代码块");
}
public HelloA(){
super();
System.out.println("HelloA:构造类");
}
public static int print(String str){
System.out.println(str);
return 1;
}
}
main:
HelloA hel = new HelloA();
console:
HelloA:静态变量
HelloA:静态方法区
HelloA:非静态变量
HelloA:构造代码块
HelloA:构造类
父子类比较
public class HelloB extends HelloA {
public static int c = print("HelloB:静态变量");
static {
System.out.println("HelloB:静态方法区");
}
public int d = print("HelloB:非静态变量");
{
System.out.println("HelloB:构造代码块");
}
public HelloB(){
super();
System.out.println("HelloB:构造类");
}
}
main:
HelloB he2 = new HelloB();
console:
HelloA:静态变量
HelloA:静态方法区
HelloB:静态变量
HelloB:静态方法区
HelloA:非静态变量
HelloA:构造代码块
HelloA:构造类
HelloB:非静态变量
HelloB:构造代码块
HelloB:构造类