簡體   English   中英

為什么這個Java代碼在花括號({})之外的方法?

[英]Why is this Java code in curly braces ({}) outside of a method?

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

我的問題是......在方法之外的花括號中編寫代碼是否有效? 這些(如果有的話)有什么影響?

借來自這里 -

通常,您可以使用代碼在構造函數中初始化實例變量。 使用構造函數初始化實例變量有兩種選擇:初始化塊和最終方法。 實例變量的初始化程序塊看起來就像靜態初始化程序塊,但沒有static關鍵字:

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

Java編譯器將初始化程序塊復制到每個構造函數中。 因此,該方法可用於在多個構造函數之間共享代碼塊。

您可能還想看看這里的討論。

這是一個初始化程序塊,在加載/創建類的實例時執行,用於初始化類的成員屬性(請參閱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

這是一個初始化塊 它用於設置實例變量。 在構造函數上使用初始化程序塊的動機是防止編寫冗余代碼。 Java編譯器將塊的內容復制到每個構造函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM