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修饰的变量或方法块早于实例变量或方法块的初始化
 - 父类实例初始化早于子类实例初始化,且普通方法块在对象每次初始化时都会执行
 
参考:
