我在看下面的代码,发现有些奇怪:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
我预计这会产生编译错误,因为带有“y”的 System.out
不属于方法声明,而只是 { }
。为什么这是有效的?我看不出应该如何调用这段代码。
当运行它时,它也会产生 x y c g
,为什么 static { }
在序列构造函数之前被调用?
最佳答案
这个:
static {
System.out.print("x ");
}
是一个静态初始化 block ,在类加载时被调用。您可以在您的类(class)中拥有任意数量的它们,并且它们将按照它们的出现顺序(从上到下)执行。
这个:
{
System.out.print("y ");
}
是一个初始化 block ,代码被复制到类的每个构造函数的开头。因此,如果您的类有很多构造函数,并且它们都需要在开始时做一些共同的事情,那么您只需要编写一次代码并将其放入像这样的初始化 block 中。
因此您的输出非常有意义。
作为 Stanley评论如下,见the section in the Oracle tutorial describing initializaiton blocks了解更多信息。
关于java - 调用没有名称的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699075/