我在看下面的代码,发现有些奇怪:
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 "); } }
我期望这样做会导致编译错误,因为System.out带有“ y”的不仅仅属于方法声明{ }。为什么这样有效?我不知道如何或应该调用此代码。
System.out
{ }
运行它时x y c g,它还会产生,为什么static { }在序列构造函数之前调用get?
x y c g
static { }
这个:
static { System.out.print("x "); }
是一个 静态初始化块 ,并在加载类时调用。您可以根据需要在类中添加任意数量的对象,它们将按照其出现顺序(从上到下)执行。
{ System.out.print("y "); }
是一个 初始化块 ,并将代码复制到该类的每个构造函数的开头。因此,如果您的类有许多构造函数,并且它们都需要在开始时做一些普通的事情,则只需编写一次代码,并将其放在这样的 初始化块中 。
因此,您的输出非常合理。
正如Stanley在下面评论的那样,有关更多信息,请参见Oracle教程中描述初始化块的部分。