class Monster {
boolean frighten(int x) {
System.out.println("Monster");
return true;
}
}
class Vampire extends Monster {
boolean frighten(byte x) {
System.out.println("Vampire");
return true;
}
}
class Dragon extends Monster {
boolean frighten(int x) {
System.out.println("Dragon");
return true;
}
}
class Sample {
public static void main(String s[]) {
Monster[] inst = new Monster[3];
inst[0] = new Monster();
inst[1] = new Vampire();
inst[2] = new Dragon();
for (int i = 0; i < 3; i++) {
inst[i].frighten(i);
}
}
}
Когда я запускаю приведенный выше код с x
как int
в Monster
или Dragon
класса, код прекрасно работает так, как я ожидал. Тем не менее, когда я запускаю код путем изменения типа x
от int
к long
либо в Monster
или Dragon
классов, он печатает следующее:выход в случае цепочки наследования
Monster
Monster
Monster
Может кто-нибудь объяснить логику вывода?
'Vampire' не переопределяет' bighten (int) ', он определяет перегрузку. И вы меняете его на 'long' в классе' Monster', 'Dragon' тоже не переопределяет этот метод. Вот почему вы должны аннотировать метод '@ Override', если вы ожидаете, что метод будет переопределен. –
Я бы даже не назвал это наследование. Вы неправильно используете ключевое слово 'extends'. Чтобы уточнить, «Монстр» должен быть формой или планом для разных типов монстров. Этого не добиться. –