2011-04-05 91 views
3

編譯器在;{期望之後在new Stock[2];處顯示錯誤。簡單的Java「新」概念問題

public class TestStockUI { 
    Stock[] stock = new Stock[2]; 
    stock[0] = new Stock("Microsoft", "MSFT", 15.69); 
    stock[1] = new Stock("Google", "GOGL", 323.98); 

    public TestStockUI() { } 

} 

然後我改變了它,就像下面導致相同的錯誤。

public class TestStockUI { 
    Stock[] stock = new Stock[2]; 
    stock[0] = new Stock("Microsoft", "MSFT", 15.69); 
    stock[1] = new Stock("Google", "GOGL", 323.98); 

} 

這解決了這個問題,但我不知道爲什麼。

public class TestStockUI { 
    Stock[] stock = new Stock[2]; 
    { 
     stock[0]=new Stock("Microsoft","MSFT",15.69); 
     stock[1]=new Stock("Google","GOGL",323.98); 
    } 

} 

回答

13
{ 
    stock[0]=new Stock("Microsoft","MSFT",15.69); 
    stock[1]=new Stock("Google","GOGL",323.98); 
} 

這將創建一個initialization block,在這些語句是合法的。前兩個例子中他們不合法。

+2

(+1)或者,他可以將它們移動到構造函數 – 2011-04-05 18:05:16

+0

或者,將stock [0]和stock [1]的初始化移動到構造函數中。 – justkt 2011-04-05 18:05:30

+0

@Brian,@Justkt - 是的,這是大多數Java開發人員可能期望的。 – 2011-04-05 18:07:42

4

您不能在類定義主體中執行代碼。

您必須聲明屬性或方法。另外(如你的情況),你可以創建自由浮動塊,你可以在可以執行的代碼,這就是爲什麼前兩個沒有工作,但第三個沒有。

class A { 
    private int i; 
    i = 10; // illegal 
} 

class A { 
    private int i; 
    { i = 10; } // ok, free floating code 
} 

創建實例時將執行自由浮動代碼塊。大多數時候這是不需要的,因爲這種類型的初始化在類構造函數中更好。

如果與靜態修飾符一起使用,它將在類加載時執行。

它的一個常見用途是將匿名類用作構造函數的替代品,例如在Swing中,這在創建原型時有點常見。

JPanel p = new JPanel(){{ //<-- free floating code aka double initialization idiom. 
    add(new JLabel("A")); 
    add(new JLabel("B")); 
}}; 
0

如前所述,初始化在方法構造之外或在塊之外無效,因爲這違反了編程語法。請參閱任何好的java書。