java 中的未知父变量问题

Unknown parent variable issue in java

最近我问了一个问题,为什么我在衍生物品中的所有变量都被设置为相同的伤害值(Java switch statements outputting the same numbers)并且该代码不是罪魁祸首,但是经过一些深入的调试我已经发现当生成一个物品时它会随机化伤害,然后出于某种原因将伤害设置为每个先前创建的相同类型的物品。

我有 'dagger' 和 'sword' class 扩展了我的 'item' class。这是我设置伤害的方式:

case 3: {Sword sword = new Sword(); World[X][Y].treasureName = "sword"; sword.setDamage(4); returnItem = sword; break;}

这是我的商品 class:

public abstract class Item {
//How much damage is added to the players attack.
static int damage = 0;
static int defence = 0;

public int getDefence() {
    return defence;
}

public void setDefence(int defenceValue) {
    defence = defenceValue;
}

public int getDamage() {
    return damage;
}

public void setDamage(int damageValue) {
    damage = damageValue;
}
}

还有我的剑class:

public class Sword extends Item { 
//How much damage is added to the players attack.
static int damage = 0;
static int defence = 0;

public int getDefence() {
    return defence;
}

public void setDefence(int defenceValue) {
 defence = defenceValue;
}

public int getDamage() {
    return damage;
}

public void setDamage(int damageValue) {
    damage = damageValue;
}
}

我不确定这个问题叫什么,也不确定 google 是什么,这仍然是一个相当新的问题。我试图覆盖该项目 class 但这并没有改变任何东西,我已经阅读了有关继承的内容,但我不明白是哪一部分将所有其他武器实例设置为相同的伤害。我想删除 'Item' class 中的方法以查看是否可以修复它,但是其他导致错误的代码阻止我在检查和添加 [= 的所有子项的损坏时执行此操作36=] - 这需要对 (Item) 进行转换,我不确定我还可以使用什么作为转换。

以下是对 'Item' 方法的引用:

if (((Item) World[k][i].treasure).getDamage() > 9)
                            {

如果没有转换,错误是:getDamage() 未定义对象类型。 和:

//Recalculates the players damage for recently equipped items.
        for (int i = 0; i < numItems; i++) {
            itemdamage += items[i].getDamage();
            System.out.println("You have a " + itemNames[i] + " giving you " + items[i].getDamage() + " extra damage.");
            }

怎么了?我想了解这一点,因此链接到有关原因和我做错了什么的有用信息会很好。谢谢。

static int damage = 0;

拥有静态成员意味着 class 的所有对象都具有相同的相同值。如果删除 static 关键字,每个对象将能够具有不同的损坏值。

至于所需的转换,World 似乎是 Object 类型的数组。所以World[k][i]Object类型,只能调用Objectclass基类的方法。如果要调用 Item class 中定义的方法,则必须将 Object 转换为 Item(假设 Object 的运行时类型是一个 Item)。

您将变量 damagedefence(此处拼写错误 - 顺便说一句)设置为 static。这意味着整个 class.

每个变量只有一个副本

在两个变量的声明之前删除 static 关键字 - 它将使任何新的剑实例(对象) - 携带自己的 damagedefence.

根据错误:

getDamage() is undefined for the type Object

我认为你是World数组,是Object数组而不是Item

你能告诉我们你是如何管理 World 数组的吗?

您的 damagedefense 变量不应该是 staticstatic 变量绑定到整个 class,而不绑定到 class 的任何一个实例。因此,当您调用 setDamage() 时,即使该方法是一个实例方法,它也会更新一个由每个现有实例共享的静态变量。

删除 static(您是要使用 protected 吗?)您将不会再看到 "for some reason sets that damage to every previously created item of the same type" 行为。

另见 What does the 'static' keyword do in a class? for more. Here's the official Java Language Specification on static fields

嘿嘿射流,

我自己对 Java 还是很陌生,但我认为你的问题是你的伤害变量设置为静态(而且我认为这个问题也会持续存在于你的防御统计数据中!)

我在学习用 C++ 开发时遇到了这个问题。我会改变我的一个构造函数的值,它引用了一个静态变量,所有的实例都会改变。它是属于 class 本身的常量,而不是对象。

那么发生了什么,就是当你改变伤害值时;正在更改使用该静态损坏变量的所有引用。

该网站提供了一些关于静态变量的见解! http://www.javatpoint.com/static-keyword-in-java

让我知道这是否有帮助!

安迪