我正准备参加java认证考试,我在其中一个练习测试中看到了类似的代码:
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);
}
}
我的问题是......在方法外的花括号中编写代码是否有效?这些(如果有的话)有什么影响?
答案 0 :(得分:33)
借鉴here -
通常,您可以使用代码初始化a中的实例变量 构造函数。使用构造函数有两种选择 初始化实例变量:初始化块和最终方法。 实例变量的初始化程序块看起来就像静态 初始化块,但没有static关键字:
{ // whatever code is needed for initialization goes here }
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
您可能还想查看讨论here。
答案 1 :(得分:10)
这是一个初始化程序块,在加载/创建类的实例时执行,并用于初始化类的成员属性(请参阅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.正如预期的那样,静态成员仅在此代码中初始化一次,而实例块在您创建新实例时执行。
此示例的输出为1 8 1 8
答案 2 :(得分:7)
这是initializer block。它用于设置实例变量。在构造函数上使用初始化程序块的动机是防止编写冗余代码。 Java编译器将块的内容复制到每个构造函数中。