Nai*_*ain -2 java inheritance casting
class Monster {
boolean frighten(int x) {
System.out.println("Monster");
return true;
}
}
class Vampire extends Monster {
boolean frighten(byte x) {
System.out.println("Vampire");
return true;
}
}
class Dragon extends Monster {
boolean frighten(int x) {
System.out.println("Dragon");
return true;
}
}
class Sample {
public static void main(String s[]) {
Monster[] inst = new Monster[3];
inst[0] = new Monster();
inst[1] = new Vampire();
inst[2] = new Dragon();
for (int i = 0; i < 3; i++) {
inst[i].frighten(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行与上面的代码x作为int在Monster或Dragon类,代码工作在我所期望的方式很好.但是,当我通过将xfrom 的类型更改为in 或classes int来运行代码时,它将打印以下内容: longMonsterDragon
Monster
Monster
Monster
Run Code Online (Sandbox Code Playgroud)
有人可以解释输出背后的逻辑吗?
你没有传递byte给你的实例Vampire; 你正在传递int你的循环.因为Monster接受int,它就是所谓的.
实际上,您正在重载方法,而不是覆盖它 - 您有一个具有相同名称和两个相同签名的方法.
在覆盖方法时,你真的应该使用同类型,这样你就不会遇到这样的问题.有效地:改变frightenin 的签名Vampire来接受int而不是a byte.
使用注释方法@Override将让编译器帮助选择这样的东西.
// Would cause a compilation error since the method isn't overridden
@Override
public boolean frighten(byte x) {
return true;
}
Run Code Online (Sandbox Code Playgroud)