1. public class A {
    2. private static String a = "父类静态变量";
    3. static {
    4. System.out.println(a);
    5. a = "父类静态方法块";
    6. System.out.println(a);
    7. }
    8. private String a1 = "父类实例成员变量";
    9. {
    10. System.out.println(a1);
    11. a1 = "普通方法块";
    12. System.out.println(a1);
    13. }
    14. public A() {
    15. System.out.println("父类构造方法");
    16. }
    17. }
    18. public class B extends A {
    19. private static String b = "子类静态变量";
    20. static {
    21. System.out.println(b);
    22. b = "子类静态方法块";
    23. System.out.println(b);
    24. }
    25. private String b1 = "子类实例成员变量";
    26. {
    27. System.out.println(b1);
    28. b1 = "子类方法块";
    29. System.out.println(b1);
    30. }
    31. public B() {
    32. super();
    33. System.out.println("子类实例构造方法");
    34. }
    35. public static void main(String[] args) {
    36. new B();
    37. System.out.println("---------------------");
    38. new B();
    39. }
    40. }
    41. // output:
    42. // 父类静态变量
    43. // 父类静态方法块
    44. // 子类静态变量
    45. // 子类静态方法块
    46. // 父类实例成员变量
    47. // 普通方法块
    48. // 父类构造方法
    49. // 子类实例成员变量
    50. // 子类方法块
    51. // 子类实例构造方法
    52. // ---------------------
    53. // 父类实例成员变量
    54. // 普通方法块
    55. // 父类构造方法
    56. // 子类实例成员变量
    57. // 子类方法块
    58. // 子类实例构造方法

    由输出可以看出:

    • 由static修饰的变量或方法块早于实例变量或方法块的初始化
    • 父类实例初始化早于子类实例初始化,且普通方法块在对象每次初始化时都会执行

    参考: