非静态初始化块会在每个对象生成时被执行一次,可以初始化类的实例变量。
非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。
静态初始化块会在对象装载到系统的时候执行一次,它仅能初始化类变量,即static修饰的数据成员。
class HelloA {
public HelloA() {
System.out.println("HelloA");
}
public HelloA(int a){
System.out.println("HelloA(int a)=》a:"+a);
}
{ System.out.println("I'm A class"); }
static { System.out.println("static A"); }
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
public HelloB(int a){
System.out.println("HelloB(int a)=》a:"+a);
}
{System.out.println("I'm B class"); }
static { System.out.println("static B"); }
public static void main(String[] args){
//new HelloB();
new HelloB(1);
}
}
/* new HelloB()初始化顺序:
* 父类静态初始化块->子类静态初始化块->父类非静态初始化块->父类无参构造方法->子类非静态初始化块->子类无参构造方法
* output:
static A
static B
I'm A class
HelloA
I'm B class
HelloB
*new HelloB(1)初始化顺序:
父类静态初始化块->子类静态初始化块->父类非静态初始化块->父类无参构造方法->子类非静态初始化块->子类有参构造方法
output:
static A
static B
I'm A class
HelloA
I'm B class
HelloB(int a)=》a:1
~*/