java - 我用不同的参数执行哪种方法?

标签 java inheritance

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/

相关文章:

java - 生成 1 到无穷大之间的随机整数

c++ - 传递基类指针

c# - c#中的继承和c#中的对象创建

c++ - 从多重继承中确定模板包

Java:WatchService 在复制内容之前得到通知

java - 通过代码访问可绘制形状的属性

java - 使用 JSOUP 进行作者解析

java - ActionBar 向上按钮过渡效果

java - 如何在 Java 中正确重写?

c++ - 如何从一组派生类创建一个列表?