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