Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';不要在类中调用方法_Java_Inheritance - Fatal编程技术网

Java Can';不要在类中调用方法

Java Can';不要在类中调用方法,java,inheritance,Java,Inheritance,我目前正在做一些学校项目;我们正在开发一个简单的RPG,但我似乎在质疑我的一些Java代码 我有一个名为Item的Abstract类,然后我有Armor和Armor类,它们都是从Item继承的。装甲和武器都有一些物品没有的属性 因此,在我的数据库包装器中,我有一个loaditem方法,它获取统计数据并创建我的类的实例(阅读代码中的注释): 我可以将武器或装甲的实例设置为item,但它在类中找不到方法 我真的需要创建武器和装甲对象,并在类型后返回吗?是的,如果要调用实例方法,方法调用的“目标”表达

我目前正在做一些学校项目;我们正在开发一个简单的RPG,但我似乎在质疑我的一些Java代码

我有一个名为
Item
Abstract
类,然后我有
Armor
Armor
类,它们都是从
Item
继承的。
装甲
武器
都有一些
物品
没有的属性

因此,在我的数据库包装器中,我有一个
loaditem
方法,它获取统计数据并创建我的类的实例(阅读代码中的注释):

我可以将
武器
装甲
的实例设置为item,但它在类中找不到方法


我真的需要创建武器和装甲对象,并在类型后返回吗?

是的,如果要调用实例方法,方法调用的“目标”表达式必须具有编译时类型,已知该类型具有适当的方法。编译器需要在编译时解析方法调用。(任何重载解析都是在编译时完成的;实际实现当然是在执行时根据多态性决定的。)

不清楚为什么您首先需要
变量。听起来你应该有:

if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    return weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    return armor;
}
这是假设您希望立即返回—您的代码被截断,因此不清楚。如果您确实需要
项目
变量,您可以将
武器
装甲
分配给
项目
,我在上面有返回语句

编辑:听起来是这样的,所以你应该:

// I'd still declare `item` as late as possible, i.e. here rather than
// outside the `try` block, unless you *also* need it outside the try block...
Item item;
if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    item = weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    item = armor;
}
// Other code using `item` here
事实上,您可能希望将初始化武器的代码放入一个单独的方法中。然后你可以使用:

String type = rs.getString("type");
Item item = type.equals("weapon")) ? createWeapon() : createArmor();

您可以这样做:

    if (...) {
      Weapon w = new Weapon();
      // SetDamage is unique to Weapon, and setDefense to armor  
      w.setDamage();
      item = w;
    } else {
      ...
    }

在这之后,如果块/序列,您可以在返回之前使用
。但您只能在其上调用
类的方法。类似地,
loadItem
方法的调用方只能对返回的值使用
Item
类中的方法,除非他们小心地使用强制转换。

为了调用“武器”特有的方法,必须将项目指针强制转换为武器,因此:

Weapon weaponPointer = (Weapon)item;
weaponPointer.setDamage();
item=new武器()将使物品引用武器实例,但物品不会成为武器,为了引用装甲武器方法,您可以执行以下操作之一:

if (rs.getString("type").equals("weapon")) { 
   Weapon weapon = new Weapon();
   weapon.setDamage();
   return weapon;
} else {
   Armor armor = new Armor();
   armor.setDefense();
   return armor;
}


返回项

要区分实例类型和引用类型

Item myItem = new Weapon();
实例类型:武器 参考类型:项目

所以,若您在myItem上调用一个方法,它可能是Item类的唯一方法。因为您的引用类型是Item

在您的情况下,您希望调用武器的方法,因此您的引用类型也必须是武器

Weapon myWeapon = new Weapon();
item.setDamage(); // method of Weapon class, it's ok
注意引用类型和实例类型

我认为这个答案是最好的:(感谢乔恩·斯基特)


考虑到它是在前一行中构造的,这里不需要强制转换,只需要使用一个单独的变量。是的,但它在一般情况下工作,其他人则不工作。因为如果我在if中创建一个实例,我只能在那里使用它。该项本身有大量的统计数据,因此如果我使用你的示例,我必须在if和else中编写10个setter。这看起来很愚蠢。但如果没有办法的话。:)@MartinElvarJensen:如果你真的在
if
语句之后使用
item
显示其他代码,我会写不同的答案。我猜不出您既没有显示也没有描述的代码@MartinElvarJensen:好的,谢谢你的更新-看看我更新的答案。谢谢你,Jon,你帮了我很大的忙:)。同样,在你的第二个例子中,你真的在铸造它吗?
Item myItem = new Weapon();
Weapon myWeapon = new Weapon();
item.setDamage(); // method of Weapon class, it's ok
// I'd still declare `item` as late as possible, i.e. here rather than
// outside the `try` block, unless you *also* need it outside the try block...
Item item;
if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    item = weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    item = armor;
}
// Other code using `item` here