public class myclass{
static{
//some statements here
}
//some variables declared here
//some functions defined here
}
答案 0 :(得分:12)
这是static
初始值设定项。类似于实例初始化程序(§8.6),您可以使用它在加载时初始化class
。明确地 NOT “调用”;它是在加载class
时自动执行的,文本顺序(static
初始化程序在文本中稍后发生,保证在初始化期间稍后执行。)
您可以使用static
初始化程序:
static
字段try-catch
块,记录与加载class
相关的事件,确保启用Java的断言等。有一些警告,例如可以重新加载class
,并且通常可以选择编写它(例如,重构为private static
命名方法),但使用static
初始化程序是一种选择。
这些问题讨论了static
和实例初始化器用法的各个方面:
以下是Java Language Guide for Programming With Assertions中规定的惯用语,以确保在运行时启用断言:
要求断言已启用
某些关键系统的程序员可能希望确保在现场禁用断言。如果已禁用其断言,则以下静态初始化习惯用法可防止对类进行初始化:
static { boolean assertsEnabled = false; assert assertsEnabled = true; // Intentional side effect!!! if (!assertsEnabled) throw new RuntimeException("Asserts must be enabled!!!"); }
将此
static
- 初始化程序放在班级的顶部。
通过将此代码段放在类的static
初始值设定项中,代码将是加载类时执行的第一个代码之一,然后才能创建类的任何实例。代码本身检查Java断言是否已启用,如果不是,则抛出RuntimeException
。
答案 1 :(得分:5)
加载类时会执行静态块,因此它们是初始化静态变量的好地方。特别是需要比单线程更多逻辑的常数可以使用静态块来舒适地初始化:
private static final String MY_CONSTANT;
static{
// read properties from file
MY_CONSTANT = properties.get("my.property.name");
}
答案 2 :(得分:1)
静态块用于初始化可能需要初始化实际代码的静态值。
例如,您想要这样做
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()
抛出的异常。小心,静态块意味着在静态上下文中是初始化方块。您必须使用它们来初始化您的静态变量。即使您可以在此处调用实际代码,这也是一种非常糟糕的做法。
答案 3 :(得分:0)
加载类时执行静态循环。 因此,如果不创建对象,我们就可以执行此循环。
答案 4 :(得分:-2)
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