2012-04-17 53 views
5

我剛剛進行了試驗,發現當我運行滾動代碼時,它不能編譯,我找不到原因。Java - 對靜態字段列表進行靜態引用

我的IDE說「無法對非靜態字段列表進行靜態引用」,但我不太明白這是什麼或爲什麼。此外還有什麼它適用於,即:它只是私有變量和方法,或者過於爲什麼?:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 

然而,當我將其更改爲以下,它的工作:

public class MyList { 

    private List list; 

    public static void main (String[] args) { 
     new MyList().exct(); 
    } 

    public void exct() { 
     list = new LinkedList(); 
     list.add("One"); 
     list.add("Two"); 
     System.out.println(list); 
    } 

} 
+2

主要方法是靜態的。它只能訪問靜態成員變量和封閉類的函數。這個錯誤非常明顯。 – Perception 2012-04-17 23:43:11

+0

從你的代碼看起來你正在試圖創建一個單身工廠。如果這是你的目標,你應該改變'私人列表清單; '到'私人靜態列表列表;' – 2012-04-17 23:45:02

+0

@Perception:所以如果他改變'私人列表列表;'到'私人靜態列表列表;'在第一個代碼,它應該工作? – noMAD 2012-04-17 23:45:15

回答

4

靜態字段是在類的所有實例之間共享的字段。
非靜態/成員字段特定於該類的一個實例。

例子:

public class Car { 
    static final int tireMax = 4; 
    int tires; 
} 

這是有道理的,任何給定的車可以有任意數量的輪胎,但最大數量是所有汽車一樣。
如果我們使tireMax變化可變,修改該值意味着所有的汽車現在可以有更多(或更少)的輪胎。

你的第二個例子工作的原因是你正在檢索新的MyList實例的list。在第一種情況下,您處於靜態上下文中,而不是在特定實例的上下文中,因此變量list不可訪問。

+0

應該不是隻讀的 – Lucas 2012-04-18 00:05:50

0

在第一個示例中,您從靜態內容調用非靜態字段,這是不可能的。 在第二個中,您正在MyList對象上調用ext函數,該對象可以訪問該字段。