最近我问了一个问题,为什么我所生成的项目中的所有变量都被设置为相同的伤害值(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.");
}
出了什么问题?我想理解这一点,所以链接到有用的信息,为什么,以及我做错了什么都是好的。感谢。
答案 0 :(得分:5)
static int damage = 0;
拥有静态成员意味着该类的所有对象具有相同的值。如果您删除static
关键字,则每个对象都可以拥有不同的损坏值。
对于所需的强制转换,似乎World
是Object
类型的数组。因此World[k][i]
属于Object
类型,您只能在其上调用基础Object
类的方法。如果要调用Item
类中定义的方法,则必须将Object
强制转换为Item
(假设Object
的运行时类型为{{1} }})。
答案 1 :(得分:4)
您的damage
和defense
变量不应为static
。 static
变量与整个类绑定,而不是与该类的任何一个实例绑定。因此,当您调用setDamage()
时,即使该方法是实例方法,它也会更新由每个现有实例共享的静态变量。
删除static
(您的意思是使用protected
吗?)并且由于某种原因您无法看到&#34;对每个先前创建的项目造成损害类型&#34;行为了。
有关详情,请参阅What does the 'static' keyword do in a class?。这里也是官方Java Language Specification on static
fields。
答案 2 :(得分:2)
您设置变量damage
和defence
(此处拼写错误 - 顺便说一下)为static
。这意味着整个班级的每个变量只有一个副本。
在声明两个变量之前删除static
关键字 - 并且它会生成任何新的剑实例(对象) - 携带自己的damage
和defence
。
答案 3 :(得分:2)
Heyhey Fluidic,
我自己还不熟悉Java,但我认为你的问题是你的伤害变量设置为静态(我认为问题会在你的防御统计数据中持续存在!)
我在学习使用C ++开发时遇到了这个问题。我会更改一个引用静态变量的构造函数的值,并且所有实例都会更改。它是属于类本身的常量,而不是对象。
所以,当你改变伤害值时,发生了什么;所有使用该静态损坏变量的引用都在被更改。
这个网站提供了一些关于静态变量的见解! http://www.javatpoint.com/static-keyword-in-java
Lemme知道这是否有帮助!
安迪
答案 4 :(得分:1)
根据错误:
对于Object 类型,未定义getDamage()
我认为你世界数组,是一个对象的数组,而不是项目
您能否告诉我们您如何管理 World 数组?