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!

最佳答案

蝙蝠侠是超级英雄,因此public void punch(Superhero a)完全有效,可以通过Batman参数进行调用。

为了明确起见,public void punch(Superhero a)声明可以用任何类型的Superhero对象调用punch方法。由于所有属于Superhero子类型的类本身都是Superheros,因此此方法可以将任何Superhero或Superhero的任何子类型作为参数。

10-08 11:09