【问题标题】:Accessing static field avoided by referencing Class?通过引用类避免访问静态字段?
【发布时间】:2016-11-06 18:49:18
【问题描述】:

我不明白为什么这是有效的,请帮助教育我。

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,它设置了ConfigtileGalleryArrayList 和featureGalleryArrayList 类的成员变量。当我运行代码时,它可以工作,输出选定的测试值。但是对于这两个声明性语句,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();
    }
}

【问题讨论】:

  • 为什么它不能工作?
  • 一个静态变量在该类的所有实例之间共享。如果tileGallery 应该绑定到Config 类的特定实例,则使用static 访问说明符。
  • 额外问题,在将所有语句更改为使用 Config 而不是 CFIG 后,会显示一个新的“警告”,仅显示“Introduce ...” Alt+Enter 不提供任何附加信息.再次感谢那些提供答案的人,我从中学到了一些东西。

标签: java static class-reference


【解决方案1】:

static 关键字表示该字段属于类而不是类的实例。即使你创建了一百个对象,这个字段也会在它们之间共享。 每个实例中的这些静态字段“tileGallery”和“featureGallery”将指向内存中的同一个对象。

静态变量在类加载时只在类区域中获取一次内存。

【讨论】:

    【解决方案2】:

    如果没有您的 Config 类的确切代码,很难说,但看起来您的 Config 类使用静态字段,如

       public class Config {
          public Config() { 
             titleGallery = new ArrayList();
             titleTallery.add(new Title());
          }
    
          public static List<Title> titleGalery;
        }
    

    提示是这样说的。

    在这种情况下,您的所有Config 实例共享相同的titleGalery,您可以通过Config.titleGalery 访问它们。

    如果您想要具有不同值的不同 Configinstances,则必须删除 static 关键字才能获得独立的实例字段。

    public class Config {
          public Config() { 
             titleGallery = new ArrayList();
             titleGallery.add(new Title());
          }
    
          // old: public static List<Title> titleGalery;
          public List<Title> titleGalery;
        }
    

    【讨论】:

    • 噢!我以为这意味着一些不同的东西。 =)
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多