Java类初始化顺序说明

倖福魔咒の 提交于 2019-12-02 14:52:06

一个类会有如下几个内容,类在初始化时他们是有顺序的

  • 静态属性:static 开头定义的属性
  • 静态方法块: static {} 圈起来的方法块
  • 静态方法:static 修饰的方法(被调用才生效)
  • 普通属性: 未带static定义的属性
  • 普通方法块: {} 圈起来的方法块
  • 普通方法: 普通方法(被调用才生效)
  • 构造方法: 类名相同的方法

1.普通类

public class LifeCycle {
    // 静态属性
    private static String staticField = getStaticField();
    // 静态方法块
    static {
        System.out.println(staticField);
        System.out.println("静态方法块");
    }
    // 静态方法
    public static String getStaticField() {
        System.out.println("静态方法");
        return "静态属性";
    }
    // 普通属性
    private String field = getField();
    // 普通方法块
    {
        System.out.println(field);
        System.out.println("普通方法块");
    }
    // 普通方法
    public static String getField() {
        System.out.println("普通方法");
        return "普通属性";
    }
    // 构造方法
    public LifeCycle() {
        System.out.println("构造方法");
    }

    // 主函数
    public static void main(String[] argc) {
        new LifeCycle();
    }
}

在这里插入图片描述
初始化顺序如下

  • 静态属性
  • 静态方法块
  • 普通属性
  • 普通方法块
  • 构造方法

2.继承

public class LifeCycleFather {
    // 静态属性
    private static String staticField = getStaticField();
    // 静态方法块
    static {
        System.out.println(staticField);
        System.out.println("父类静态方法块");
    }
    // 静态方法
    public static String getStaticField() {
        System.out.println("父类静态方法");
        return "父类静态属性";
    }
    // 普通属性
    private String field = getField();
    // 普通方法块
    {
        System.out.println(field);
        System.out.println("父类普通方法块");
    }
    // 普通方法
    public static String getField() {
        System.out.println("父类普通方法");
        return "父类普通属性";
    }
    // 构造方法
    public LifeCycleFather() {
        System.out.println("父类构造方法");
    }
}

public class LifeCycle extends LifeCycleFather{
    // 静态属性
    private static String staticField = getStaticField();
    // 静态方法块
    static {
        System.out.println(staticField);
        System.out.println("静态方法块");
    }
    // 静态方法
    public static String getStaticField() {
        System.out.println("静态方法");
        return "静态属性";
    }
    // 普通属性
    private String field = getField();
    // 普通方法块
    {
        System.out.println(field);
        System.out.println("普通方法块");
    }
    // 普通方法
    public static String getField() {
        System.out.println("普通方法");
        return "普通属性";
    }
    // 构造方法
    public LifeCycle() {
        System.out.println("构造方法");
    }

    // 主函数
    public static void main(String[] argc) {
        new LifeCycle();
    }
}

在这里插入图片描述
初始化顺序

  • 父类静态属性
  • 父类静态代码块
  • 子类静态属性
  • 子类静态代码块
  • 父类普通属性
  • 父类普通代码块
  • 父类构造方法
  • 子类普通属性
  • 子类普通代码块
  • 子类构造方法
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!