【问题标题】:why is it is printing "Large Rat" instead of "Rat" [duplicate]为什么打印的是“Large Rat”而不是“Rat”[重复]
【发布时间】:2015-07-26 20:28:17
【问题描述】:

我正在自学 java 中的类,并决定尝试制作自己的类并在程序中使用它。首先,我有以下代码:

public class Simulator {
    public static void main(String[] args){

        Creature rat = new Creature(1, 12, 3, 1, 2, 1, 3);
        Creature poisonRat = new Creature(2, 16, 5, 4, 3, 4, 5);
        Creature largeRat = new Creature(5, 24, 10, 7, 4, 7, 10);

        rat.setCreatureName("Rat");
        poisonRat.setCreatureName("poisonous Rat");
        largeRat.setCreatureName("Large Rat");

        System.out.println(rat.getCreatureName());
    }

}

由于某种原因,它正在打印“Large Rat”而不是“Rat”,我不知道为什么。我是处理课程的新手,所以我真的不知道自己在做什么。有什么想法吗?

好的,这里是生物类:

public class Creature {

    private String creatureName;
    private static int creatureLvl;
    private static double healthPoints;
    private static double strength;
    private static double magic;
    private static double defense;
    private static double magicDefense;
    private static double speed;

    public Creature (int lvl, double hp, double str, double mag, double def,      double magDef, double spd){
        creatureLvl = lvl;
        healthPoints = hp;
        strength = str;
        magic = mag;
        defense = def;
        magicDefense = magDef;
        speed = spd;
    }

    public String getCreatureName() {
        return creatureName;
    }

    public void setCreatureName(String creatureName) {
        creatureName = creatureName;
    }


}

【问题讨论】:

  • 每个“生物”的参数代表生物的属性,例如健康、等级、力量、防御等。
  • 你能显示Creature 类吗,可能会从那里返回相同的实例
  • 我怀疑静态字段(这意味着它是由类共享的),大多数初学者倾向于使他们的字段静态只是为了摆脱编译问题,他们被要求不要引用非静态内容从主要方法。顺便说一句,总是看到“Large Rat”可能还有其他原因,但如果没有看到您的代码,我们只能猜测。
  • 听起来很合理,可能 CreatureName 是静态的。
  • 不用看你的代码我就可以告诉你Creature 的名称存储在static 变量中,这意味着它在所有实例之间共享的Creature。将其设为非静态将解决此问题。

标签: java


【解决方案1】:

我认为您已将 Creature 类中的 creatureName 声明为 static 字段:

private static String creatureName;

这意味着它是一个在类的所有实例之间共享的字段;如果您通过一个实例更改该字段,它将在所有其他实例中更改。改为

private String creatureName;

你应该没事的。

编辑:

另外,在setter方法中,如果字段与参数同名,则需要使用this.

public void setCreatureName(String creatureName) {
    this.creatureName = creatureName;
}

【讨论】:

  • @vinayakj 静态字段也可以通过 non-static 函数访问。哎呀,即使setCreatureName 也可以被声明为静态函数。
  • @vinayakj 静态字段通过SomeClass.staticField 之类的类访问。您可以从任何地方评估该课程(假设它是公共课程)。您也可以尝试使用reference.staticField,但它与使用ClassOfReference.staticField 相同。
  • 我会告诉你生物类:
  • @LuisTorres 我希望你能用你的代码更新你的问题,而不是试图在某个答案下发表评论。让其他人以正确的形式看到它(cmets 不允许格式化)并让他们立即看到它(不要让回答者在答案下搜索重要信息 - 将它们放在你的问题中)。
  • 您的代码现在没有必要运行,但稍后您会遇到麻烦。请确保您了解实例成员和类成员之间的区别(例如,请参阅我的答案中的链接)。
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 2016-06-07
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2013-09-23
相关资源
最近更新 更多