2012-04-17 20 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

+0

コードからは、シングルトンファクトリを作成しようとしているようです。それがあなたの目標なら、あなたは 'プライベートリストリストを変更する必要があります。 ''プライベート静的リストリスト '; –

+0

@Perception:もし彼が 'プライベートリストリスト'を 'プライベート静的リストリスト'に変更すれば、最初のコードでは、それはうまくいくはずですか? – noMAD

答えて

4

staticフィールドは、クラスのすべてのインスタンスで共有されるフィールドです。
非静的/メンバーフィールドは、クラスのインスタンスに固有です。

例:

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

ここでは、任意の車がタイヤの任意の数を持つことができるという意味になりますが、最大数は、すべての車で同じです。
tireMax変数を変更可能にすると、値を変更すると、すべての車に現在より多くの(または少ない)タイヤが追加できるようになります。

2番目の例が機能する理由は、新しいMyListインスタンスのlistを取得しているためです。最初のケースでは、特定のインスタンスのコンテキストではなく静的コンテキストにあるため、変数listにはアクセスできません。

+0

は 'final'は読み取り専用でなければなりません – Lucas

0

最初の例では、静的コンテンツから非静的フィールドを呼び出していますが、これは不可能です。 2番目のフィールドでは、そのフィールドにアクセスできるMyListオブジェクトでext関数を呼び出しています。

関連する問題