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

时间:2018-10-12 10:39:50

标签: java inheritance parameters arguments invoke

我试图理解Head First Java书籍中的继承。在第193页上,我一切都正确,并且我试图调用具有不同参数的方法(重载方法),但是主类调用了从超类继承的方法。如何调用以下方法?

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

3 个答案:

答案 0 :(得分:0)

您可以通过将ma[0]强制转换为Vampire((Vampire)(ma[0])).frighten(y);

为什么它当前不起作用?

由于Method Invocation Conversion不能用当前的类和方法结构来实现,因为widening primitive conversion在用frighten()参数对Vampire对象调用byte时适用:

  

方法调用上下文允许使用以下之一:

     
      
  • 身份转换(第5.1.1节)

  •   
  • 不断扩大的原始转换(第5.1.2节)

  •   
  • 扩展的参考转换(第5.1.5节)

  •   
  • 装箱转换(第5.1.7节)(可选),然后加宽引用   转换

  •   
  • 拆箱转换(第5.1.8节)(可选)   原始转换。

  •   

具体来说,在您的情况下,发生的是{{3}}:

  
      
  • 字节为短,整数,长,浮点或双精度
  •   

(在您的情况下:从byteint

答案 1 :(得分:0)

尝试执行此操作,将Monster降为吸血鬼,因为ma[0]上的对象是Monster引用的Vampire

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

答案 2 :(得分:0)

这里的重点是重载和覆盖之间的区别-有关更多信息,请参见this answer

所以您的类树如下所示:

 Monster
|       |
Vamire  Dragon

这意味着

frighten(int z)

方法可以通过继承所有三个类来使用,并且可以重载(=同类型-与Dragon类一样)。

boolean frighten(byte b) 

是一个替代参数(不是同一类型的参数),因此您可以调用

frighten(byte) 
   and 
frighten(int) 

在您的吸血鬼上。

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

因此,最后所有对象都是“怪物数组“ ma”中的怪物-会被视为怪物。

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

如果不进行强制转换,则该字节将被自动类型转换为int。