口诀

由父及子、静态先行、自上而下

一、执行初始化方法

如果该类有父类,先执行父类的初始化方法,后执行子类初始化方法。
初始化方法主要涉及两个:
①静态显式赋值变量
②静态代码块

注: (1)①和②依据在代码中的顺序来执行,自上而下

二、执行实例化方法

实例化方法主要为四步:
super()(最前)
②非静态显式赋值变量
③非静态代码块
④无参构造方法(最后)

注: (1)②和③依据在代码中的顺序来执行。 (2)非静态方法调用时前面有一个this,this表示正在创建的对象,例如实例化子类的过程中,调用了父类的非静态方法,并且该方法被子类重写了,那么调用的其实是子类的实现。

三、示例代码

Father.class

  1. /**
  2. * 父类初始化<clinit>
  3. * 1、j = method()
  4. * 2、 父类的静态代码块
  5. *
  6. * 父类实例化方法:
  7. * 1、super()(最前)
  8. * 2、i = test() (9)
  9. * 3、子类的非静态代码块 (3)
  10. * 4、子类的无参构造(最后)(2)
  11. *
  12. *
  13. * 非静态方法前面其实有一个默认的对象this
  14. * this在构造器或<init> 他表示的是正在创建的对象,因为咱们这里是正在创建Son对象,所以
  15. * test()执行的就是子类重写的代码(面向对象多态)
  16. *
  17. * 这里i=test() 执行的就是子类重写的test()方法
  18. */
  19. public class Father {
  20. private int i = test();
  21. private static int j = method();
  22. static{
  23. System.out.println("(1)");
  24. }
  25. Father() {
  26. System.out.println("(2)");
  27. }
  28. {
  29. System.out.println("(3)");
  30. }
  31. public int test(){
  32. System.out.println("(4)");
  33. return 1;
  34. }
  35. public static int method() {
  36. System.out.println("(5)");
  37. return 1;
  38. }
  39. }

Son.class

  1. /**
  2. * 子类的初始化<clinit>
  3. * 1、j = method()
  4. * 2、子类的静态代码块
  5. *
  6. * 先初始化父类 (5)(1)
  7. * 初始化子类 (10) (6)
  8. *
  9. * 子类实例化方法:
  10. * 1、super()(最前
  11. * 2、i = test() (9)
  12. * 3、子类的非静态代码块 (8)
  13. * 4、子类的无参构造(最后)(7)
  14. */
  15. public class Son extends Father {
  16. private int i = test();
  17. private static int j = method();
  18. static {
  19. System.out.println("(6)");
  20. }
  21. Son() {
  22. super();
  23. System.out.println("(7)");
  24. }
  25. {
  26. System.out.println("(8)");
  27. }
  28. public int test(){
  29. System.out.println("(9)");
  30. return 1;
  31. }
  32. public static int method() {
  33. System.out.println("(10)");
  34. return 1;
  35. }
  36. public static void main(String[] args) {
  37. Son son = new Son();
  38. System.out.println();
  39. Son son1 = new Son();
  40. }
  41. }