调用具有不同参数类型的方法

Invoking method with different argument type

我正试图从 Head First Java 一书中理解继承。在第 193 页,我做对了一切,我试图调用一个带有不同参数的方法(一个重载方法),但是主 class 调用从 superclass 继承的那个。如何调用以下方法?

boolean frighten(byte b) {
    System.out.println("a bite?");
    return true;
}

我试图声明一个字节,但没有帮助。 谢谢大家,代码如下:

public class MonsterT {
    public static void main(String[] args) {
        Monster[] ma = new Monster[3];
        ma[0] = new Vampire();
        ma[1] = new Dragon();
        ma[2] = new Monster();
        for (int x=0; x < 3; x++) {
            ma[x].frighten(x);
        }

        byte y = 2;

        ma[0].frighten(y);
    }
}

class Monster {
    boolean frighten(int z) {
        System.out.println("arrrgh");
        return true;
    }
}

class Vampire extends Monster {
    boolean frighten(byte b) {
        System.out.println("a bite?");
        return true;
    }


class Dragon extends Monster {
    boolean frighten(int degree) {
        System.out.println("breath fire");
        return true;
    }

输出为:arrrgh breath fire arrrgh arrrgh

您可以通过将 ma[0] 转换为 Vampire 来做到这一点:((Vampire)(ma[0])).frighten(y);

为什么它目前不起作用?

你不能用 类 的当前结构和方法来做到这一点,因为 Method Invocation Conversion,当你用 [=15] 在 Vampire 对象上调用 frighten() 时应用=] 参数:

Method invocation contexts allow the use of one of the following:

  • an identity conversion (§5.1.1)

  • a widening primitive conversion (§5.1.2)

  • a widening reference conversion (§5.1.5)

  • a boxing conversion (§5.1.7) optionally followed by widening reference conversion

  • an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.

具体来说,您的情况是 widening primitive conversion

  • byte to short, int, long, float, or double

(在你的情况下:从 byteint

试试这个,将 Monster 转换为 vampire ,因为 ma[0] 处的对象是 Monster 引用的 Vampire

((Vampire)ma[0]).frighten(y);

这里的重点是重载和覆盖之间的区别 - 请参阅 this answer 了解更多信息。

因此您的 class 树如下所示:

 Monster
|       |
Vamire  Dragon

这意味着

frighten(int z)

方法可通过继承所有三个 classes 并且可以重载(=相同类型 - 就像在 Dragon class 中一样)。

boolean frighten(byte b) 

是一个overriding(不是同一类型的参数),所以可以调用

frighten(byte) 
   and 
frighten(int) 

在你的吸血鬼身上。

另一个发挥作用的方面是object type casting

所以最后你所有的对象都是 "Monsters in the monster array "ma" - 并且会被视为怪物。

这将被 @The Scientific Method 在其答案中展示的演员表更改为吸血鬼。

如果没有强制转换,字节将被自动类型转换为 int。