我不明白为什么会这样,请帮助教育我。
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
,它设置了类Config
tileGallery
ArrayList和featureGallery
ArrayList的成员变量。当我运行代码时,它可以工作,输出所选的测试值。然而,对于这两个声明性陈述,Netbeans发出警告"访问静态字段"
使用"替换为类引用",它将语句更改为:
Tile selectedTile = Config.tileGallery.get(1);
Feature selectedFeature = Config.featureGallery.get(3);
当我运行它时,它仍然有效!
问题,配置。没有标识从哪个Config对象调用数据。现在我只有一个Config对象,但即使我初始化第二个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 :(得分:3)
static关键字表示该字段属于类而不是类的实例。即使您创建了100个对象,也会在这些字段中共享该字段。 每个实例的这些静态字段“tileGallery”和“featureGallery”将指向内存中的同一对象。
静态变量在类加载时只在类区域中获取一次内存。
答案 1 :(得分: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;
}