Java 语法问题

Java syntax question

提问人:Luchian Grigore 提问时间:7/28/2011 更新时间:7/22/2016 访问量:145

问:

有什么作用

static{
    //something
}

在类定义正文中声明是什么意思?

public class A extends B{
     static {
          C.register(new C(A.class,
                    (byte) D.x.getCode()) {
                         public DataSerializable newInstance() {
                              return new A();
                         }
                    }
               );
     }
 }
Java 语法

评论


答:

6赞 Jack Edmonds 7/28/2011 #1

该块称为“静态初始化块”。它与常规构造函数非常相似,只是它只能初始化静态变量。static

我发现当某些静态变量的初始化可能会引发您想要处理或至少记录的异常时,它很有用。它在静态最终变量的初始化中特别有用。

您可以在此处阅读有关静态初始化块的更多信息:初始化字段

3赞 Ilya Saunkin 7/28/2011 #2

它执行一个代码块,而不需要这个类的实例,即在类加载器加载该类时立即执行。

评论

0赞 Marcelo 7/28/2011
@Jack的答案加上你的答案将是最好的答案。
1赞 Nathan Hughes 7/28/2011 #3

它是一个静态初始值设定项。它允许您指定在创建任何实例之前加载类时发生的情况。

如果从静态初始值设定项抛出异常,则非常令人困惑,很难判断它来自哪里。在静态初始值设定项中执行的任何操作都应该有一个 try-catch,并记录异常。如果可以的话,这是一个很好的语言功能。

2赞 Dhruv Gairola 7/28/2011 #4

这变成了一个静态初始化块,可以写成一个静态方法。

2赞 Nicktar 7/28/2011 #5

它是一个静态初始值设定项。一旦类加载,它就会运行,其结果可以存储在静态成员中。它用于初始化需要比常规新 Xyz() 更多(如 Lists 或 Maps)的静态成员......

1赞 bobsv 7/28/2011 #6

这意味着您将拥有位于静态块内的这一部分,该部分在将类加载到 JVM 时首先扩展。

执行以下简单程序可能会使事情更清晰

public class Test123 {
  static{
    System.out.println("Hello from static block");
  }

  public static void main(String[] args) {
    System.out.println("In main");
  }
}

上述的输出将是

Hello from static block 
In main