让我们用一个更清晰的例子来说明:
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")
如果只执行静态初始化程序,那么任何(好的)JDBC驱动程序将会按照以下方式在DriverManager
中注册自己。
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
这样DriverManager
可以在执行getConnection()
时找到正确的JDBC驱动程序。