单个类中的加载顺序

使用之前

main方法为空:

  1. public class Test {
  2. //准备阶段直接赋值a=常量
  3. public static final String a = "常量";
  4. //准备阶段设置默认值 b=null,初始化阶段设置b=静态变量
  5. public static String b = "静态变量";
  6. //构造时赋值
  7. public String c = "变量";
  8. static {
  9. System.out.println(a);
  10. System.out.println(b);
  11. System.out.println("静态代码块");
  12. }
  13. {
  14. System.out.println(c);
  15. System.out.println("代码块");
  16. }
  17. public Test() {
  18. System.out.println("构造器");
  19. }
  20. public static void main(String[] args) {
  21. }
  22. }

结果:

  1. 常量
  2. 静态变量
  3. 静态代码块

总结:

  1. 常量最先被加载赋值,在链接-准备阶段直接赋值
  2. 静态变量在准备阶段设置默认值,在初始化阶段设置值
  3. 静态块在静态变量初始化之后执行

    使用之后

    main方法new了一个对象:

    1. public static void main(String[] args) {
    2. new Test();
    3. }

    结果:

    1. 常量
    2. 静态变量
    3. 静态代码块
    4. 变量
    5. 代码块
    6. 构造器

    总结:
    new之后,成员变量初始化,代码块执行,构造方法执行

    父类子类中的加载顺序

    使用之前

    main方法为空: ```java public class Parent { public static String b = “父类静态变量”; public String c = “父类变量”;

    static {

    1. System.out.println(b);
    2. System.out.println("父类静态代码块");

    }

    {

    1. System.out.println(c);
    2. System.out.println("父类代码块");

    }

    public Parent() {

    1. System.out.println("父类构造器");

    } }public class Parent { public static String b = “父类静态变量”; public String c = “父类变量”;

    static {

    1. System.out.println(b);
    2. System.out.println("父类静态代码块");

    }

    {

    1. System.out.println(c);
    2. System.out.println("父类静态代码块");

    }

    public Parent() {

    1. System.out.println("父类构造器");

    } }

public class Test extends Parent{ public static String b = “子类静态变量”; public String c = “子类变量”;

  1. static {
  2. System.out.println(b);
  3. System.out.println("子类静态代码块");
  4. }
  5. {
  6. System.out.println(c);
  7. System.out.println("子类代码块");
  8. }
  9. public Test() {
  10. System.out.println("子类构造器");
  11. }
  12. public static void main(String[] args) {
  13. }

}

  1. 结果:
  2. ```java
  3. 父类静态变量
  4. 父类静态代码块
  5. 子类静态变量
  6. 子类静态代码块

使用之后

main方法new了一个子类对象:

  1. public static void main(String[] args) {
  2. new Test();
  3. }

结果:

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类变量
  6. 父类代码块
  7. 父类构造器
  8. 子类变量
  9. 子类代码块
  10. 子类构造器

main方法new了一个父类对象:

  1. public static void main(String[] args) {
  2. new Parent();
  3. }

结论:

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类变量
  6. 父类代码块
  7. 父类构造器