在JAVA中何时使用静态初始块?

在JAVA中何时使用静态初始块?,java,Java,有人能解释一下我们在哪种情况下使用静态初始块吗?最常见的情况是在类加载时加载一些资源,例如,为JNI加载库,另一个常见的是当您需要用来创建静态的一些代码抛出异常时。您可以将它用作类中静态数据的构造函数。例如,常见的情况可能是设置一个特殊单词列表: private static final Set<String> special = new HashSet<String>(); static { special.add("Java"); special.ad

有人能解释一下我们在哪种情况下使用静态初始块吗?

最常见的情况是在类加载时加载一些资源,例如,为JNI加载库,另一个常见的是当您需要用来创建静态的一些代码抛出异常时。

您可以将它用作类中静态数据的构造函数。例如,常见的情况可能是设置一个特殊单词列表:

private static final Set<String> special = new HashSet<String>();
static {
    special.add("Java");
    special.add("C++");
    ...
}

之后可以使用这些来检查字符串是否与感兴趣的内容匹配。

我一直使用它们来初始化列表和映射

List<String> myList = new ArrayList<String>(){{
    add("blah");
    add("blah2");
}};
for(String s : myList){
    System.out.println(s);
}

另一个例子是java.lang.Object

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
...

他在问关于静态初始化器的问题。这是一个实例非静态初始值设定项的示例。这是一个很好的实例初始值设定项示例,对于匿名内部类中的设置非常有用,正如您所演示的。请注意,这实际上创建了ArrayList的子类!我知道。据我所知,这也不是内存效率最高的东西。创建ArrayList的子类肯定会让人不悦。通常,更可取的方法是:List myList=Arrays.asListblah,blah2;这里唯一的问题是你不能控制列表的类型,如果这对你很重要的话。