让我们用一个更清楚的例子来表达:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}
并按如下方式进行测试:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
输出:
static initializer
instance initializer
constructor
instance initializer
constructor
静态初始化器仅在运行时执行一次,特别是在加载类期间。实例初始化程序在构造函数之前的每个实例化期间执行。
您可以拥有多个它们,它们将按照它们在编码中出现的顺序执行。
实例初始值设定项的主要好处是无论您使用哪个构造函数,它们都会被执行。它们适用于它们中的每一个,因此您无需对所有它们重复通用初始化。
静态初始化器的主要好处是它们在类加载期间只执行一次。一个众所周知的现实世界示例是 JDBC 驱动程序。当你这样做时
Class.forName("com.example.jdbc.Driver");
它只执行static 初始化程序,然后任何(体面的)JDBC 驱动程序将在DriverManager 中注册自己,如下所示
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
这样DriverManager 可以在getConnection() 期间找到正确的JDBC 驱动程序。