我试图理解Head First Java书籍中的继承。在第193页上,我一切都正确,并且我试图调用具有不同参数的方法(重载方法),但是主类调用了从超类继承的方法。如何调用以下方法?
boolean frighten(byte b) {
System.out.println("a bite?");
return true;
}
我试图声明一个字节,但是没有帮助。 谢谢大家,以下是代码:
public class MonsterT {
public static void main(String[] args) {
Monster[] ma = new Monster[3];
ma[0] = new Vampire();
ma[1] = new Dragon();
ma[2] = new Monster();
for (int x=0; x < 3; x++) {
ma[x].frighten(x);
}
byte y = 2;
ma[0].frighten(y);
}
}
class Monster {
boolean frighten(int z) {
System.out.println("arrrgh");
return true;
}
}
class Vampire extends Monster {
boolean frighten(byte b) {
System.out.println("a bite?");
return true;
}
class Dragon extends Monster {
boolean frighten(int degree) {
System.out.println("breath fire");
return true;
}
输出为:arrrgh
breath fire
arrrgh
arrrgh
答案 0 :(得分:0)
您可以通过将ma[0]
强制转换为Vampire
:((Vampire)(ma[0])).frighten(y);
由于Method Invocation Conversion不能用当前的类和方法结构来实现,因为widening primitive conversion在用frighten()
参数对Vampire
对象调用byte
时适用:>
方法调用上下文允许使用以下之一:
身份转换(第5.1.1节)
不断扩大的原始转换(第5.1.2节)
扩展的参考转换(第5.1.5节)
装箱转换(第5.1.7节)(可选),然后加宽引用 转换
拆箱转换(第5.1.8节)(可选) 原始转换。
具体来说,在您的情况下,发生的是{{3}}:
- 字节为短,整数,长,浮点或双精度
(在您的情况下:从byte
到int
)
答案 1 :(得分:0)
尝试执行此操作,将Monster降为吸血鬼,因为ma[0]
上的对象是Monster引用的Vampire
。
((Vampire)ma[0]).frighten(y);
答案 2 :(得分:0)
这里的重点是重载和覆盖之间的区别-有关更多信息,请参见this answer。
所以您的类树如下所示:
Monster
| |
Vamire Dragon
这意味着
frighten(int z)
方法可以通过继承所有三个类来使用,并且可以重载(=同类型-与Dragon类一样)。
而
boolean frighten(byte b)
是一个替代参数(不是同一类型的参数),因此您可以调用
frighten(byte)
and
frighten(int)
在您的吸血鬼上。
发挥作用的另一个方面是object type casting。
因此,最后所有对象都是“怪物数组“ ma”中的怪物-会被视为怪物。
@The Scientific Method在其答案中演示的演员表将其更改为吸血鬼。
如果不进行强制转换,则该字节将被自动类型转换为int。