Java:什么是static {}?

Omu*_*Omu 6 java static-initializer

有人可以解释一下以下是什么吗?

public class Stuff
{
    static
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch ( ClassNotFoundException exception )
        {
            log.error( "ClassNotFoundException " + exception.getMessage( ) );
        }
...
}
Run Code Online (Sandbox Code Playgroud)

这静态{...}做了什么?

我知道来自C++的静态变量,但这是一个静态块还是什么?

什么时候这个东西会被执行?

Chi*_*hii 14

静态块称为类静态初始化程序 - 它在第一次加载类时运行(并且它是唯一一次运行[脚注]).

该特定块的目的是检查MySQL驱动程序是否在类路径上(如果不是则抛出/记录错误).


[脚注]每个加载类的类加载器运行一次静态块(所以如果你有多个彼此不同的类加载器(例如,不委托),它将被执行一次.


小智 8

静态初始化程序块的主要用途是执行各种初始化,这些初始化可能不适合构造函数,因此构造函数和初始化程序将新创建的对象放在一个完全一致的状态下使用.

例如,与构造函数不同,静态初始值设定项不会被继承,并且只在JRE加载和初始化类时才执行一次.在上面的示例中,一旦初始化完成,类变量foo将具有值998877.

另请注意,静态初始化程序按它们在源文件中以文本方式显示的顺序执行.此外,对于其中一个块内部无法执行的操作存在许多限制,例如不使用已检查的异常,不使用return语句或this和super关键字.