class test {
test() {
System.out.println("Constructor");
}
{
System.out.println("Hai");
}
}
public class sample {
public static void main(String [] a) {
test t = new test();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,为什么在执行构造函数之前,在大括号((即)"Hai")中给出的语句是Printed.
Bal*_*usC 34
让我们用更清晰的例子来表达:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}
Run Code Online (Sandbox Code Playgroud)
并测试如下:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
static initializer
instance initializer
constructor
instance initializer
constructor
Run Code Online (Sandbox Code Playgroud)
静态初始值设定项仅在运行时执行一次,特别是在加载类时.实例初始值设定项在构造函数之前的每个实例化期间执行.
您可以拥有多个,它们将按照编码中的顺序执行.
实例初始化程序的主要好处是无论您使用哪种构造函数,它们都会被执行.它们适用于每一个,因此您不需要在所有这些上复制常见的初始化.
静态初始化程序的主要好处是它们在类加载期间只执行一次.一个众所周知的现实世界的例子是JDBC驱动程序.当你这样做
Class.forName("com.example.jdbc.Driver");
Run Code Online (Sandbox Code Playgroud)
只执行static初始化程序,然后任何(正常的)JDBC驱动程序将在DriverManager如下注册自己
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
Run Code Online (Sandbox Code Playgroud)
这样就DriverManager可以找到合适的JDBC驱动程序getConnection().