java中的未知父变量问题

时间:2015-04-16 05:35:22

标签: java inheritance

最近我问了一个问题,为什么我所生成的项目中的所有变量都被设置为相同的伤害值(Java switch statements outputting the same numbers),并且该代码不应该受到责备,但经过一些深度调试后我才会这样做。 ; ve发现当一个物品产生时,它随机化了伤害,然后由于某种原因设置了对同一类型的每个先前创建的物品的伤害。

我有匕首'和剑'扩展我的项目的课程'类。这就是我设置伤害的方法:

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

这是我的项目类:

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;
}
}

我的剑类:

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;
}
}

我不确定这个问题是什么,也不确定谷歌还有什么相当新的。我试图覆盖项目类,但是没有改变任何内容,而且我已经阅读了关于继承的内容,而且我不明白哪个部分将其他武器实例设置为相同的损坏。我想删除'项目中的方法。类,看看是否会修复它,但是其他导致错误的代码阻止我在检查并添加“项目”的所有孩子的损害时这样做。 - 这需要一个(项目)的演员阵容,我不知道我还能用什么作为演员。

以下是'项目'的推荐。方法:

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

没有强制转换,错误是:对于Object类型,未定义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.");
            }

出了什么问题?我想理解这一点,所以链接到有用的信息,为什么,以及我做错了什么都是好的。感谢。

5 个答案:

答案 0 :(得分:5)

static int damage = 0;

拥有静态成员意味着该类的所有对象具有相同的值。如果您删除static关键字,则每个对象都可以拥有不同的损坏值。

对于所需的强制转换,似乎WorldObject类型的数组。因此World[k][i]属于Object类型,您只能在其上调用基础Object类的方法。如果要调用Item类中定义的方法,则必须将Object强制转换为Item(假设Object的运行时类型为{{1} }})。

答案 1 :(得分:4)

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

删除static(您的意思是使用protected吗?)并且由于某种原因您无法看到&#34;对每个先前创建的项目造成损害类型&#34;行为了。

有关详情,请参阅What does the 'static' keyword do in a class?。这里也是官方Java Language Specification on static fields

答案 2 :(得分:2)

您设置变量damagedefence(此处拼写错误 - 顺便说一下)为static。这意味着整个班级的每个变量只有一个副本。

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

答案 3 :(得分:2)

Heyhey Fluidic,

我自己还不熟悉Java,但我认为你的问题是你的伤害变量设置为静态(我认为问题会在你的防御统计数据中持续存在!)

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

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

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

Lemme知道这是否有帮助!

安迪

答案 4 :(得分:1)

根据错误:

  对于Object

类型,未定义

getDamage()

我认为你世界数组,是一个对象的数组,而不是项目

您能否告诉我们您如何管理 World 数组?