public class Superhero {
String s;
public Superhero() {
s = "I'M A SUPERHERO";
System.out.println(s);
}
public void punch() {
System.out.println("Punch! Punch!");
}
public void punch(Superhero a) {
System.out.println("BOOM" + s);
}
}
public class Batman extends Superhero {
String s;
public Batman() {
s = "NANANANANA";
}
public Batman(String s) {
this.s = s;
System.out.println(this.s);
}
public void punch(Superhero v) {
s = "BATMAN!";
super.punch(v);
System.out.println("BOOM " + s);
}
public void punch(Batman b) {
System.out.println("Wat.");
}
public static void main(String[] args) {
Superhero superhero = new Batman();
superhero.punch( (Batman) superhero);
}
}
总的来说,为什么这是一个有效的代码?它不会在 Superhero
静态类型上寻找 punch(Batman b)
函数吗,因为没有函数与签名完全匹配,这不是一个编译时错误?根据它所做的,它在 Superhero 类上执行 punch(Superhero a)
。
这导致
"I'M A SUPERHERO"
"BOOM I'M A SUPERHERO"
"BOOM BATMAN!
最佳答案
bat 侠 是 super 英雄 所以public void punch(Superhero a)
使用 Batman 参数调用是完全有效的。
为了澄清,public void punch(Superhero a)
说明可以使用任何类型的 Superhero 对象调用 punch 方法。由于所有属于 Superhero 子类型的类本身都是 Superheros,因此此方法可以将任何 Superhero 或 Superhero 的任何子类型作为参数。
关于java - 我用不同的参数执行哪种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976914/