2016-07-05 3 views
2

Ich verstehe nicht, warum das funktioniert, bitte helfen Sie mir zu erziehen.Zugriff auf statisches Feld vermieden durch Verweis auf Klasse?

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)); 

ich initialisieren das Objekt CFIG, die beide legt die Membervariablen der Klasse ConfigtileGallery Arraylist und featureGallery Arraylist. Wenn ich den Code ausführe, funktioniert es und gibt die ausgewählten Testwerte aus. Doch für beide der deklarativen Anweisungen Netbeans eine Warnung von „Zugriff auf statische Feld“ gibt

Mit dem Hinweis auf „Ersetzen durch Klassenreferenz“, es ändert sich die Aussagen zu:

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

Wenn ich es laufen, es funktioniert noch!

Frage, Konfig. gibt nicht an, aus welchem ​​Config-Objekt Daten abgerufen werden sollen. Jetzt habe ich nur ein einziges Config-Objekt, aber selbst wenn ich ein zweites Config-Objekt initialisiere, erscheint es immer noch nicht verwirrt.

Was geht hier vor?

EDIT: Andih fragte sich, was der Code der Config-Klasse. Ich habe es nicht hinzugefügt, weil es nicht viel war, und ich dachte, Sie könnten leicht annehmen, was es getan hat, wenn es um das Problem geht. Aber hier ist es, nur für den Fall.

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

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

Warum sollte es nicht funktionieren? –

+1

Eine statische Variable wird von allen Instanzen dieser Klasse gemeinsam genutzt. Wenn 'tileGallery' an eine bestimmte Instanz der' Config'-Klasse gebunden werden soll, erstellen Sie den Zugriffsbezeichner 'static'. – SubOptimal

+0

Bonus Frage, nachdem alle Anweisungen geändert werden, um Config statt CFIG zu verwenden, wird eine neue "Warnung" angezeigt, die nur sagt "Einführung ..." Alt + Eingabe bietet keine zusätzlichen Informationen. Noch einmal, dank denen, die Antworten angeboten haben, habe ich etwas daraus gelernt. – JamesA

Antwort

1

Ohne den genauen Code Ihrer Config Klasse zu sagen, es ist hart, aber es sieht aus wie Ihre Config Klasse verwendet statische Felder wie

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

     public static List<Title> titleGalery; 
    } 

Das ist, was der Hinweis sagt.

In diesem Fall teilen alle Ihre Config Instanzen die selbe titleGalery und Sie können auf sie über zugreifen.

Wenn Sie verschiedene Config Instanzen mit unterschiedlichem Wert wünschen, müssen Sie das Schlüsselwort static entfernen, um unabhängige Instanzfelder zu erhalten.

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

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

Doh! Ich dachte, es bedeute etwas anderes. =) – JamesA

3

Das statische Schlüsselwort bedeutet, dass dieses Feld zu der Klasse als Instanz der Klasse gehört. Selbst wenn Sie hundert Objekte erstellen, wird dieses Feld unter ihnen geteilt. Diese statischen Felder "tileGallery" und "featureGallery" von jeder Instanz zeigen auf dasselbe Objekt im Speicher.

Die statische Variable erhält zum Zeitpunkt des Ladens der Klasse nur einmal Speicher im Klassenbereich.

+1

Sehr knappe Antwort, bis abstimmen für Sie. Vielen Dank! – JamesA