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

2022-09-01 10:33:15

我正在为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);  
    }  
}

我的问题是...在方法外部用大括号编写代码是否有效?这些(如果有的话)有什么影响?


答案 1

从这里借来的 -

通常,您会将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种替代方法:初始值设定项块和 final 方法。实例变量的初始值设定项块看起来就像静态初始值设定项块,但没有 static 关键字:

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

Java 编译器将初始值设定项块复制到每个构造函数中。因此,此方法可用于在多个构造函数之间共享一个代码块。

您可能还想查看此处的讨论。


答案 2

这是一个初始值设定项块,在装入/创建类的实例时执行,用于初始化类的成员属性(请参见 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