2011-05-25 61 views
3

在下面的代碼中,應該在哪裏構造sc?如果沒有「sc = new SClass()」這一行,我會得到一個空指針異常,但我不確定它是否適合它。我試過使用靜態初始化塊,但是這給了我一個編譯器錯誤。應該在Java中構建靜態對象的位置?

第二個問題是,是否存在有關此類靜態初始化的文檔?我只能找到對靜態基元的引用,但不能找到靜態對象。

class A { 
    private class SClass{ 
     String s; 
     String t; 
    } 

    private static SClass sc; 

    public void StringTest() { 
     sc = new SClass(); 
     sc.s = "StringTest"; 
     System.out.println(sc.s); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     A a = new A(); 
     a.StringTest(); 
    } 
} 
+0

它總是一個好主意,說*你有哪些*編譯器錯誤,當你嘗試靜態初始化。然後,我們可以幫助解決問題的這一部分。 – 2011-05-25 04:03:53

+0

它與Eclipse Helios,Sun JDK 1.6兼容。 – Ravi 2011-05-25 04:12:51

+0

不是哪個編譯器,哪個編譯器錯誤。 – 2011-05-25 04:16:07

回答

5

如果你發現你有幾件事情是需要一些實例,或者如果你有不平凡的工作要做,因爲在這種情況下,你可以使用一個static initializer塊靜態的,他們是這個樣子:

class A { 

    static { 
     sc = new SClass(); 
     sc.s = "StringTest"; 
     System.out.println(sc.s); 
    } 

    //... 

您還可以定義它,你聲明它的簡單的情況:

private static SClass sc = new SClass(); 

此外,你有一個複雜的問題在這裏,因爲你不能去罰款SClass作爲一個靜態類,但你打算靜態使用它。內部類上應該有一個靜態的預選賽中,下面的代碼應工作:

class A { 
    private static class SClass{ 
     String s; 
     String t; 
    } 

    private static SClass sc; 

    static { 
     sc = new SClass(); 
     sc.s = "StringTest"; 
     System.out.println(sc.s); 
    } 
} 
+0

即使是單個項目的更復雜的初始化,靜態塊也是靜態函數的很好替代方案。 – 2011-05-25 04:04:03

+0

我嘗試了兩種方法,他們給我以下編譯器錯誤:不能訪問類型A的封閉實例。必須使用封閉的A型實例來限定分配(例如x.new A(),其中x是A的一個 實例)。 – Ravi 2011-05-25 04:06:18

+0

@suravi:對不起,在你的問題中錯過了那一點。您無法靜態訪問非靜態屬性(SClass類),因此,要使用它,您需要使用'static'限定符來定義它(請參閱我的更新後的工作示例答案) – 2011-05-25 04:12:51