public class A {
private static String a = "父类静态变量";
static {
System.out.println(a);
a = "父类静态方法块";
System.out.println(a);
}
private String a1 = "父类实例成员变量";
{
System.out.println(a1);
a1 = "普通方法块";
System.out.println(a1);
}
public A() {
System.out.println("父类构造方法");
}
}
public class B extends A {
private static String b = "子类静态变量";
static {
System.out.println(b);
b = "子类静态方法块";
System.out.println(b);
}
private String b1 = "子类实例成员变量";
{
System.out.println(b1);
b1 = "子类方法块";
System.out.println(b1);
}
public B() {
super();
System.out.println("子类实例构造方法");
}
public static void main(String[] args) {
new B();
System.out.println("---------------------");
new B();
}
}
// output:
// 父类静态变量
// 父类静态方法块
// 子类静态变量
// 子类静态方法块
// 父类实例成员变量
// 普通方法块
// 父类构造方法
// 子类实例成员变量
// 子类方法块
// 子类实例构造方法
// ---------------------
// 父类实例成员变量
// 普通方法块
// 父类构造方法
// 子类实例成员变量
// 子类方法块
// 子类实例构造方法
由输出可以看出:
- 由static修饰的变量或方法块早于实例变量或方法块的初始化
- 父类实例初始化早于子类实例初始化,且普通方法块在对象每次初始化时都会执行
参考: