调用具有不同参数类型的方法
Invoking method with different argument type
我正试图从 Head First Java 一书中理解继承。在第 193 页,我做对了一切,我试图调用一个带有不同参数的方法(一个重载方法),但是主 class 调用从 superclass 继承的那个。如何调用以下方法?
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
您可以通过将 ma[0]
转换为 Vampire
来做到这一点:((Vampire)(ma[0])).frighten(y);
为什么它目前不起作用?
你不能用 类 的当前结构和方法来做到这一点,因为 Method Invocation Conversion,当你用 [=15] 在 Vampire
对象上调用 frighten()
时应用=] 参数:
Method invocation contexts allow the use of one of the following:
an identity conversion (§5.1.1)
a widening primitive conversion (§5.1.2)
a widening reference conversion (§5.1.5)
a boxing conversion (§5.1.7) optionally followed by widening reference
conversion
an unboxing conversion (§5.1.8) optionally followed by a widening
primitive conversion.
具体来说,您的情况是 widening primitive conversion:
- byte to short, int, long, float, or double
(在你的情况下:从 byte
到 int
)
试试这个,将 Monster 转换为 vampire ,因为 ma[0]
处的对象是 Monster 引用的 Vampire
。
((Vampire)ma[0]).frighten(y);
这里的重点是重载和覆盖之间的区别 - 请参阅 this answer 了解更多信息。
因此您的 class 树如下所示:
Monster
| |
Vamire Dragon
这意味着
frighten(int z)
方法可通过继承所有三个 classes 并且可以重载(=相同类型 - 就像在 Dragon class 中一样)。
而
boolean frighten(byte b)
是一个overriding(不是同一类型的参数),所以可以调用
frighten(byte)
and
frighten(int)
在你的吸血鬼身上。
另一个发挥作用的方面是object type casting。
所以最后你所有的对象都是 "Monsters in the monster array "ma" - 并且会被视为怪物。
这将被 @The Scientific Method 在其答案中展示的演员表更改为吸血鬼。
如果没有强制转换,字节将被自动类型转换为 int。
我正试图从 Head First Java 一书中理解继承。在第 193 页,我做对了一切,我试图调用一个带有不同参数的方法(一个重载方法),但是主 class 调用从 superclass 继承的那个。如何调用以下方法?
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
您可以通过将 ma[0]
转换为 Vampire
来做到这一点:((Vampire)(ma[0])).frighten(y);
为什么它目前不起作用?
你不能用 类 的当前结构和方法来做到这一点,因为 Method Invocation Conversion,当你用 [=15] 在 Vampire
对象上调用 frighten()
时应用=] 参数:
Method invocation contexts allow the use of one of the following:
an identity conversion (§5.1.1)
a widening primitive conversion (§5.1.2)
a widening reference conversion (§5.1.5)
a boxing conversion (§5.1.7) optionally followed by widening reference conversion
an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.
具体来说,您的情况是 widening primitive conversion:
- byte to short, int, long, float, or double
(在你的情况下:从 byte
到 int
)
试试这个,将 Monster 转换为 vampire ,因为 ma[0]
处的对象是 Monster 引用的 Vampire
。
((Vampire)ma[0]).frighten(y);
这里的重点是重载和覆盖之间的区别 - 请参阅 this answer 了解更多信息。
因此您的 class 树如下所示:
Monster
| |
Vamire Dragon
这意味着
frighten(int z)
方法可通过继承所有三个 classes 并且可以重载(=相同类型 - 就像在 Dragon class 中一样)。
而
boolean frighten(byte b)
是一个overriding(不是同一类型的参数),所以可以调用
frighten(byte)
and
frighten(int)
在你的吸血鬼身上。
另一个发挥作用的方面是object type casting。
所以最后你所有的对象都是 "Monsters in the monster array "ma" - 并且会被视为怪物。
这将被 @The Scientific Method 在其答案中展示的演员表更改为吸血鬼。
如果没有强制转换,字节将被自动类型转换为 int。