Дело здесь в разнице между перегрузкой и переопределением - см. этот ответ для получения дополнительной информации.
Итак, ваше дерево классов выглядит следующим образом:
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.