任何人都可以告诉我,类中静态块的用途是什么?

public class myclass{ static{ //some statements here } //some variables declared here //some functions defined here } 

这是一个static初始化器。 类似于实例初始化程序(第8.6节 ),您可以使用它在加载时初始化class 。 它没有明确地“调用”; 它在文本顺序加载class时自动执行(文本中稍后出现的static初始化程序保证在初始化期间稍后执行)。

您可以使用static初始化程序:

  • 初始化一些static字段
  • 执行一些其他一次性计算,可能需要try-catch块,记录与class加载相关的事件,确保启用Java的断言等。

有一些警告,例如可以重新加载class ,并且通常有编写它的替代方法(例如,重构为private static命名方法),但使用static初始化程序是一种选择。

参考

  • JLS 8.7静态初始化器
  • JLS 12.4类和接口的初始化

相关问题

这些问题讨论了static和实例初始化器用法的各个方面:

  • Java中的静态初始化程序
  • 如何处理抛出已检查exception的静态最终字段初始值设定项
  • 为什么声明的顺序对静态初始化器很重要?
  • 在Java中使用Initializers与Constructors
  • Java静态初始化程序是否安全?

示例用法:要求启用断言

以下是“ 使用断言编程的Java语言指南 ”中规定的习惯用法,以确保在运行时启用断言:

要求断言已启用

某些关键系统的程序员可能希望确保在现场不禁用断言。 如果已禁用其断言,则以下静态初始化习惯用法可防止对类进行初始化:

 static { boolean assertsEnabled = false; assert assertsEnabled = true; // Intentional side effect!!! if (!assertsEnabled) throw new RuntimeException("Asserts must be enabled!!!"); } 

将此static初始化程序放在类的顶部。

通过将此代码段放在类的static初始化程序中,代码将是加载类时执行的第一个代码之一,然后才能创建类的任何实例。 代码本身检查是否启用了Java断言,如果不是,则抛出RuntimeException

也可以看看

  • 维基百科/断言(计算)

相关问题

  • 你使用断言吗?

加载类时会执行静态块,因此它们是初始化静态变量的好地方。 特别是需要比单线程更多逻辑的常量可以使用静态块来舒适地初始化:

 private static final String MY_CONSTANT; static{ // read properties from file MY_CONSTANT = properties.get("my.property.name"); } 

静态块用于初始化可能需要初始化实际代码的静态值。

例如,你想这样做

 static boolean firstBoolean = staticMethodThatGetBoolean(); static boolean secondBoolean = staticMethodThatGetAnotherBoolean(); static int i = //if firstBoolean is true i = 1, if secondBoolean is true i = 2, if firstBoolean and secondBoolean are true i = 3; 

要么你做这样的事情:

 static boolean firstBoolean = staticMethodThatGetBoolean(); static boolean secondBoolean = staticMethodThatGetAnotherBoolean(); static int i = (firstBoolean && secondBoolean)?3:(secondBoolean)?2:(firstBoolean)?1:0; 

或者你创建一个静态集团来处理所有这些。

另一个例子是处理staticMethodThatGetBoolean()或staticMethodThatGetAnotherBoolean()抛出的exception

注意,静态块是静态上下文中的初始化块。 您必须使用它们仅初始化静态变量。 即使你可以在这里调用实际代码,这也是一个非常糟糕的做法。

加载类时执行静态循环。 因此,如果不创建对象,我们就可以执行此循环。

 public class Test { static int a=3; static int b; static void meth(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } static { System.out.println("Static block initialized."); b = a * 4; System.out.println("a = " + a); System.out.println("b = " + b); } public static void main(String args[]) { meth(42); } } 

输出将 –

 Static block initialized. a = 3 b = 12 x = 42 a = 3 b = 12