我在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());
答案 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 ...