1. 场景一:求b的值

    1. public class OrderDemo {
    2. private static int b=0;
    3. static {
    4. b=1;
    5. }
    6. public static void main(String[] args) {
    7. System.out.println(b);
    8. }
    9. }
  2. 场景二:求b的值

    1. public class OrderDemo {
    2. static {
    3. b=1;
    4. }
    5. private static int b=0;
    6. public static void main(String[] args) {
    7. System.out.println(b);
    8. }
    9. }
  3. 场景三:求a的值

    1. public class OrderDemo {
    2. private int a=0;
    3. {
    4. a=1;
    5. }
    6. public static void main(String[] args) {
    7. System.out.println(new OrderDemo().a);
    8. }
    9. }
  4. 场景四:求a的值

    1. public class OrderDemo {
    2. {
    3. a=1;
    4. }
    5. private int a=0;
    6. public static void main(String[] args) {
    7. System.out.println(new OrderDemo().a);
    8. }
    9. }
  5. 场景五:求a的值

    1. public class OrderDemo {
    2. public OrderDemo() {
    3. a = 10;
    4. }
    5. {
    6. a=1;
    7. }
    8. private int a=0;
    9. public static void main(String[] args) {
    10. System.out.println(new OrderDemo().a);
    11. }
    12. }

    总结

    • 成员变量赋值和代码块赋值,按顺序执行,写在后面的会覆盖前面的
    • 静态变量赋值和静态代码块赋值,同上逻辑
    • 构造器最后一个执行

      原理

      image.png
      在生成的字节码中,成员变量赋值和代码块的执行一定是在构造方法的操作前。
      image.png
      静态变量赋值和静态代码块会字节码会在方法中类构造方法中,先后顺序按照书写顺序。