触发类的初始化,执行其中的 static 块

  1. 访问 static 字段
public class SomeClass {
    static {
        System.out.println("static block executed");
    }

    public static int num = 100;
}
int num = SomeClass.num;
  1. 访问 static 方法,可以使用空方法(推荐)
public class SomeClass {
    static {
        System.out.println("static block executed");
    }

    public static void init() {
    }
}
SomeClass.init();
  1. 创建实例
public class SomeClass {
    static {
        System.out.println("static block executed");
    }
}
SomeClass someClass = new SomeClass();
  1. 使用 Class.forName() 加载类
try {
    Class.forName("com.my.SomeClass");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

不会触发初始化的情况

  1. 访问 .class
public class SomeClass {
    static {
        System.out.println("static block executed");
    }
}
Class<?> clazz = SomeClass.class;
  1. 访问编译期常量(static final 基本类型或 static final String)
public class SomeClass {
    static {
        System.out.println("static block executed");
    }

    public static final int num = 100;
    public static final String str = "hello world";
}
int num = SomeClass.num;
String str = SomeClass.str;
  • 访问非编译期常量,可以触发类的初始化
public class SomeClass {
    static {
        System.out.println("static block executed");
    }

    public static final Object token = new Object();
}
Object token = SomeClass.token;

更多推荐