2016-07-05 8 views
2

これがなぜ機能しているのか理解できません。教えてください。Classを参照して静的フィールドへのアクセスを回避しますか?

Config CFIG = new Config(); 
Tile selectedTile = CFIG.tileGallery.get(1); 
System.out.println("This is the name:" + selectedTile.getName()); 
Feature selectedFeature = CFIG.featureGallery.get(3); 
System.out.println("This is the name:" + selectedFeature.getName()+ 
    " " + selectedFeature.getEffect(0)); 

I、クラスConfigtileGalleryのArrayListと​​のArrayListのメンバ変数の両方を設定するオブジェクトCFIGを初期化します。コードを実行すると、選択したテスト値が出力されます。しかし、NetBeansは、「クラスの参照と交換してください」のヒントを使用して

「静的フィールドへのアクセス」の警告を与え、宣言文の両方のために、それが文を変更します。

Tile selectedTile = Config.tileGallery.get(1); 
Feature selectedFeature = Config.featureGallery.get(3); 

私はそれを実行し、それはまだ動作します!

Question、Config。データを呼び出すConfigオブジェクトを識別していません。今はただ一つのConfigオブジェクトしか存在しませんが、2番目のConfigオブジェクトを初期化しても混乱しないように見えます。

ここでは何が起こっていますか?

編集:andihは、どのようなConfigクラスのコードを疑問に思った。私はそれを追加しなかった。なぜなら、それほど多くなかったし、問題に関係していたように簡単に想像することができたと思ったからだ。しかし、ここにあるのは、ちょうどその場合です。

public class Config { 
    public static ArrayList<Tile> tileGallery; 
    public static ArrayList<Feature> featureGallery; 

    public Config(){ 
     this.tileGallery = Tile.ReadTileXML(); 
     this.featureGallery = Feature.ReadFeatureXML(); 
    } 
} 
+0

なぜ機能しないのですか? –

+1

静的変数は、そのクラスのすべてのインスタンス間で共有されます。 'tileGallery'を' Config'クラスの特定のインスタンスにバインドする必要がある場合、 'static'アクセス指定子を作成します。 – SubOptimal

+0

ボーナスに関する質問は、CFIGではなくConfigを使用するようにすべてのステートメントを変更した後、「紹介」というだけの新しい「警告」が表示されます。Alt + Enterは追加情報を提供しません。 また、答えを出した人のおかげで、私はこれで何かを学びました。 – JamesA

答えて

1

この場合、すべてのConfigインスタンスは同じtitleGaleryを共有し、Config.titleGaleryでアクセスできます。

異なるConfigインスタンスの値が異なる場合は、独立したインスタンスフィールドを取得するためにstaticキーワードを削除する必要があります。

public class Config { 
     public Config() { 
     titleGallery = new ArrayList(); 
     titleGallery.add(new Title()); 
     } 

     // old: public static List<Title> titleGalery; 
     public List<Title> titleGalery; 
    } 
+0

Doh!私はそれが違ったものだと思った。 =) – JamesA

3

staticキーワードは、このフィールドがクラスのインスタンスよりもクラスに属することを意味します。 100個のオブジェクトを作成しても、このフィールドはそれらの間で共有されます。 これらの静的フィールド "tileGallery"と "featureGallery"は、それぞれのインスタンスからメモリ内の同じオブジェクトを指します。

静的変数は、クラスロード時にクラス領域内で1回だけメモリを取得します。それは言うのは難しいのですが、あなたのConfigクラスはヒントが言っていることだ

public class Config { 
     public Config() { 
     titleGallery = new ArrayList(); 
     titleTallery.add(new Title()); 
     } 

     public static List<Title> titleGalery; 
    } 

のような静的フィールドを使用していますように見えるあなたのConfigクラスの正確なコードなし

+1

非常に簡潔な答え、あなたのための投票。ありがとうございました! – JamesA

関連する問題