先看一段代码:
public class HelloB extends HelloA{
public HelloB(){
System.out.println("HelloB");
}
{
System.out.println("I am B class");
}
static{
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloA{
public HelloA(){
System.out.println("HelloA");
}
{
System.out.println("I am A class");
}
static {
System.out.println("static A");
}
}
请问输出的结果是啥?
答案:
static A
static B
I am A class
HelloA
I am B class
HelloB
java程序的初始化一般遵循以下三个原则,
①:静态对象(变量)优于非静态对象(变量),其中,静态变量只初始化一次,而非静态对象(变量)初始化多次。
②:父类优先于子类进行初始化。
③:按照成员变量定义顺序进行初始化,及时变量定义散布于块之中,他们依然在任何方法(包括构造方法)被调用之前初始化。
一般的,执行顺序如下:
父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造方法、
子类非静态变量、子类非静态代码块、子类构造方法。