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

nai*_*aen 30 java syntax braces

我正在为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);  
    }  
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*aju 35

借来自这里 -

通常,您可以使用代码在构造函数中初始化实例变量.使用构造函数初始化实例变量有两种选择:初始化块和最终方法.实例变量的初始化程序块看起来就像静态初始化程序块,但没有static关键字:

{
    // whatever code is needed for initialization goes here
} 
Run Code Online (Sandbox Code Playgroud)

Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.

您可能还想看看这里的讨论.


Mar*_*les 12

这是一个初始化程序块,在加载/创建类的实例时执行,用于初始化类的成员属性(请参阅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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另一方面,类的类似示例是实例引用"a".A初始化为5,然后实例块将其更新为7,最后一个块更新为8.正如预期的那样,静态成员仅在此代码中初始化一次,而实例块在您创建新实例时执行.

此示例的输出为1 8 1 8


bla*_*mpe 7

这是一个初始化块.它用于设置实例变量.在构造函数上使用初始化程序块的动机是防止编写冗余代码.Java编译器将块的内容复制到每个构造函数中.