Java基础知识的澄清?

Har*_*aji 10 java

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().


Bom*_*mbe 6

是.这是一个实例初始化器.一旦实例化它就会运行它.

  • 因为有许多人不理解它和/或因为10K +代表的人"必须"是正确的. (5认同)
  • 为什么在编辑之前将其提升为超出我的范围. (3认同)
  • 那么static关键字是可选的吗? (2认同)