Вызов метода с другим типом аргумента - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь понять наследование из книги 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 голосов
/ 12 октября 2018

Попробуйте, бросив Monster на вампира, потому что объект на ma[0] является Vampire, на который ссылается Monster.

((Vampire)ma[0]).frighten(y);
0 голосов
/ 12 октября 2018

Дело здесь в разнице между перегрузкой и переопределением - см. этот ответ для получения дополнительной информации.

Итак, ваше дерево классов выглядит следующим образом:

 Monster
|       |
Vamire  Dragon

Thisозначает, что метод

frighten(int z)

доступен по наследству всем трем классам и может быть перегружен (= те же типы, что и в классе Dragon).

В то время как

boolean frighten(byte b) 

Является переопределением (не того же типа параметра), так что вы можете вызвать

frighten(byte) 
   and 
frighten(int) 

на вашем вампире.

Еще один аспект, который вступает в игру, это приведение типа объекта .

Таким образом, в конце все ваши объекты будут "Monsters in the monster array" ma "- и будут рассматриваться как монстры.

Это будетизменен на вампира актером, который @The Scientific Method продемонстрировал в своем ответе.

Без этого акта байт будет автоматически приведен к типу int.

0 голосов
/ 12 октября 2018

Вы можете сделать это, приведя ma[0] к Vampire: ((Vampire)(ma[0])).frighten(y);

Почему это не работает в настоящее время?

Вы не можете сделать это с текущей структурой классови методы из-за преобразования вызова метода , применяемого при вызове frighten() объекта Vampire с аргументом byte:

Контексты вызова метода позволяют использовать один изследующее:

  • преобразование идентичности (§5.1.1)

  • преобразование расширяющегося примитива (§5.1.2)

  • преобразование эталона с расширением (§5.1.5)

  • преобразование бокса (§5.1.7), за которым необязательно следует расширение эталонного преобразования

  • преобразование распаковки (§5.1.8), за которым может последовать расширение примитивного преобразования.

В частности, что происходит в вашем случае, это расширяющее примитивное преобразование :

  • байт в short, int, long, float или double

(в вашем случае: от byte до int)

...