2016-07-05 76 views
2

我不明白爲什麼這個工作,請幫助教育我。訪問通過引用類避免的靜態字段?

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

我初始化對象CFIG,其同時設置該級ConfigtileGallery ArrayList和​​的ArrayList成員變量。當我運行代碼時,它可以工作,輸出選定的測試值。然而,對於這兩個聲明語句的Netbeans的賦予「訪問靜態字段」

使用的「與類引用替換」的提示的警告,它改變了語句:

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

當我運行它,它仍然有效!

問題,配置。沒有標識哪個Config對象從中調用數據。現在我只有一個Config對象,但即使我初始化第二個Config對象,它仍然不會出現混淆。

這是怎麼回事嗎?

編輯:andih想知道什麼是配置類的代碼。我沒有添加它,因爲它並不多,並且認爲你可以很容易地假設它做了什麼,因爲它涉及到這個問題。但是,這是爲了以防萬一。

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

Bonus問題,在更改所有使用Config而不是CFIG的語句後,會顯示一個新的「警告」,其中只顯示「介紹...」Alt + Enter不提供任何其他信息。 再次感謝那些提供答案的人,我從中學到了一些東西。 – JamesA

回答

1

沒有你Config類的確切的代碼很難說,但它看起來像你的Config類使用靜態字段,如

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

     public static List<Title> titleGalery; 
    } 

這就是暗示說什麼。

在這種情況下,您所有的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關鍵字表示該字段屬於該類而不是類的實例。即使您創建了數百個對象,該字段也會在他們之間共享。 這些來自每個實例的靜態字段「tileGallery」和「featureGallery」將指向內存中的相同對象。

靜態變量在類加載時只在類區域中獲得一次內存。

+1

非常簡潔的答案,投票給你。謝謝! – JamesA

相關問題