创建一个对象时,在一个类中的调用顺序:

    1. 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
    2. 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
    3. 调用构造方法。

    小结:

    调用顺序: 静态代码块、静态属性(按定义的顺序先后执行) > 普通代码块、普通属性(按定义的顺序先后执行) > 构造器

    1. package test;
    2. public class Main {
    3. public static void main(String[] args) {
    4. // (1) getN1被调用...
    5. // (2) A 静态代码块01
    6. // (3) getN2被调用...
    7. // (4) A 普通代码块01
    8. // (5) A() 构造器被调用
    9. A a = new A();
    10. }
    11. }
    12. class A {
    13. //无参构造器
    14. public A() {
    15. System.out.println("A() 构造器被调用");
    16. }
    17. //普通属性的初始化
    18. private int n2 = getN2();
    19. { //普通代码块
    20. System.out.println("A 普通代码块01");
    21. }
    22. //静态属性的初始化
    23. private static int n1 = getN1();
    24. static { //静态代码块
    25. System.out.println("A 静态代码块01");
    26. }
    27. public static int getN1() {
    28. System.out.println("getN1被调用...");
    29. return 100;
    30. }
    31. public int getN2() { //普通方法/非静态方法
    32. System.out.println("getN2被调用...");
    33. return 200;
    34. }
    35. }

    image.png