为什么这个Java代码花括号({})在方法之外?

我准备参加一个javaauthentication考试,并且在练习testing中看到过这样的代码:

class Foo { int x = 1; public static void main(String [] args) { int x = 2; Foo f = new Foo(); f.whatever(); } { x += x; } // <-- what's up with this? void whatever() { ++x; System.out.println(x); } } 

我的问题是…在方法之外用花括号写代码有效吗? 这些(如果有的话)有什么影响?

从这里借来的 –

通常情况下,你会把代码初始化一个实例variables在构造函数中。 使用构造函数初始化实例variables有两种select:初始化块和最终方法。 实例variables的初始化块与静态初始化块相似,但没有static关键字:

 { // whatever code is needed for initialization goes here } 

Java编译器将初始化块复制到每个构造函数中。 因此,这种方法可以用来在多个构造函数之间共享一段代码。

你可能也想看看这里的讨论。

这是一个初始化块,在类的实例被加载/创build时执行,用于初始化类的成员属性(请参见Java http://download.oracle.com/javase/tutorial/java/javaOO /initial.html )。 您可以根据需要拥有尽可能多的块,并且会从顶部到底部实例化。

除了实例块之外,您还可以拥有任意数量的静态块,以便初始化静态成员。 他们将被宣布如下:

 public class Initialization { static int b = 10; int a = 5; static { b = -9; } { a += 2; } public static void main(String[] args) throws Exception { System.out.println(ClientVoting.b); System.out.println(new ClientVoting().a); System.out.println(ClientVoting.b); System.out.println(new ClientVoting().a); } static { b = 1; } { a++; } } 

当类被初始化时,静态成员“b”被初始化为10,然后第一个静态作用域将其值更改为-9,然后更改为1.这只在类加载时执行一次。 这在main方法的第一行的初始化之前执行。

另一方面,与你的类相似的例子是实例引用“a”。 A初始化为5,然后实例块将其更新为7,最后一个块为8.如预期的那样,静态成员只在该代码中初始化一次,而实例块在每次创build新实例时执行。

这个例子的输出是1 8 1 8

这是一个初始化块 。 它被用来设置实例variables。 在构造函数中使用初始化块的动机是为了防止编写冗余代码。 Java编译器将块的内容复制到每个构造函数中。