声明类Java实例的奇怪运行时错误

时间:2014-07-17 18:37:29

标签: java class instance

我在java中制作一个游戏并且一致地得到了最奇怪的bug。我有一个叫做武器的课。然后我创建一个名为primary的实例。在我创建一个实例并将其称为辅助实例之后。由于一些奇怪的原因,初级被二级值所覆盖。我的导师和我都看着它,无法弄明白。这是代码:

public class weapon {
        static String type;
        static String name;
        static int weight;
        static int damage;
        static int dodge;
        weapon(String c, String n, int w, int da, int dod) {

                type = c;
                name = n;
                weight = w;
                damage = da;
                dodge = dod;

        }
        //getters
        String getType(){
                return type;
        }
        String getName(){
                return name;
        }
        Integer getWeight(){
                return weight;
        }
        Integer getDamage(){
                return damage;
        }
        Integer getDodge(){
                return dodge;
        }
        //setters
        void setType(String c){
                c=type;
        }
        void setName(String n){
                n=name;
        }
        void setWeight(Integer w){
                w=weight;
        }
        void setDamage(Integer da){
                damage=da;
        }
        void setDodge(Integer dod){
                dodge=dod;
        }
}

/*At the top of my main class I create both instances like this because the instances are created in if statements and I need to access them.*/
weapon primary;
weapon secondary;
//I create primary like this earlier in the code like this
primary = new weapon("primary","sword", 8, 6, -1);
//and then when I run this I get the output "sword" "Heavy Sword".
System.out.println(primary.getName());
secondary = new weapon("secondary", "huge sword", 9, 7, -2);
System.out.println(primary.getName());

4 个答案:

答案 0 :(得分:4)

所有成员变量都定义为static:

    static String type;
    static String name;
    static int weight;
    static int damage;
    static int dodge;

这就是为什么第二个实例的值覆盖第一个的原因(因为静态成员是类变量 - 它们在类的所有实例中都有一个副本)。

删除static关键字可以解决问题。

答案 1 :(得分:3)

Weapon类的所有属性都是 static ,这意味着它们在您创建的所有实例之间共享。

删除 static 以使它们成为实例变量,你应该没问题。

答案 2 :(得分:0)

所有成员变量都声明为static。将成员变量声明为static时,该类的所有对象都共享这些变量的相同副本。如果一个对象改变了一个变量的值,它也会改变其他对象。

只需删除static关键字。

Weapon似乎是一个bean类,如果与private成员变量和public getter / setter一起正确封装,最好是封装。

答案 3 :(得分:0)

您创建了一个具有类范围变量的类,而不是为每个创建的对象创建不同的变量。

改为使用:

public class weapon {
        private String type;
        private String name;
        private int weight;
        private int damage;
        private int dodge;
        weapon(String c, String n, int w, int da, int dod) {

我建议你在定义类时使用以下模式来帮助确保你的“类字段”和“对象字段”得到很好的描述

public class <name-of-class> {
// Class fields
    <private|public|protected> [final] static ....
// Object fields
     private ...