为什么这段Java代码用花括号({})括起来,但不在方法内?

31

我准备参加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);  
    }  
}

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


3
另请参阅 8.6 实例初始化器 - trashgod
Stephen,这可能是重复的话题,但我以完全不同的方式得到了它。 - nairdaen
3
是的,正如其他人指出的那样是正确的。但是,在您获得Java认证后的某个时候,您将编写程序。请不要在日常工作中使用这种结构。拜托了,请不要。我讨厌Java认证。它会教给你各种令人困惑并且有时非常微妙的方式来误导您的同事并引入错误。 - rfeak
@rfeak同意。它很难阅读,所以不要使用它,如果你使用了它,请提供大量的注释。 - Rob Grant
嗨,@nairdaen,我也想开始学习Java Oracle认证,你有任何笔记、练习测试和程序、问题、网站链接或其他学习材料吗?如果你能提供给我,那将非常有帮助。谢谢! - Arsh Kaushal
3个回答

37

这里借鉴而来 -

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

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

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

您还可以查看此处的讨论。


1
我有一个问题,为什么这段代码从未被执行过呢?{ System.out.println("com.test.BaseClazz. initial"); } - Omer

14

这是一个初始化块,它在类的实例被加载/创建时执行,并用于初始化类的成员属性(参见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


9

这是一个 初始化块,用于设置实例变量。使用初始化块而不是构造函数的动机是为了避免编写冗余代码。Java编译器将该块的内容复制到每个构造函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接