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);
}
}
主要是为什么这是一个有效的代码?它不会在静态类型punch(Batman b)
上查找Superhero
函数,并且由于没有完全匹配签名的函数,这不是编译时错误吗?根据它的作用,它在Superhero类上执行punch(Superhero a)
。
这导致
"I'M A SUPERHERO"
"BOOM I'M A SUPERHERO"
"BOOM BATMAN!
答案 0 :(得分:1)
蝙蝠侠是超级英雄,因此使用蝙蝠侠参数调用public void punch(Superhero a)
完全有效。
为了澄清,public void punch(Superhero a)
声明可以使用任何类型的超级英雄对象调用punch方法。由于所有属于超级英雄子类的类都是超级英雄,因此这种方法可以将任何超级英雄或超级英雄的任何子类型作为参数。