2017-01-16 5 views
0

У меня есть следующий код:Зачем переопределять метод суперкласса, а не давать ему другое имя?

class Primate { 
    public void sayType() { 
     System.out.println("I'm a Primate"); 
    } 
} 

class Human extends Primate { 
    public void sayType() { 
     System.out.println("I'm a Human!"); 
    } 
} 
public class TalkingPrimates { 

    public static void main(String args[]) { 
     Primate a = new Primate(); 
     Primate b = new Human(); 

     a.sayType(); 
     b.sayType(); 
    } 
} 

, который должен вывести:

 
I'm a Primate 
I'm a Human! 

Почему я не могу просто назвать метод sayType к humanHello, например, и избежать баловаться с @Override и запутанной позже ? Я новичок, и я привел этот пример где-то в другом месте, поэтому, возможно, для него есть более сложные способы, которые вы покажете мне

(Другое дело - строка Primate b = new Human(), это называется так называемая «отправка динамического метода»?)

+6

Это называется «Полиморфизм». Вы должны прочитать об этом. Это одна из важных особенностей объектно-ориентированного программирования. – RealSkeptic

+6

Полезность этого типа [полиморфизма] (https://en.wikipedia.org/wiki/Polymorphism_ (computer_science)) заключается в том, что вы можете написать код, который вызывает 'primate.sayType()', не зная его тип времени выполнения , и получить правильную реализацию этой функции. – khelwood

+0

Зачем использовать Java, если вас не интересует полиморфизм? – GhostCat

ответ

4

Если вы делаете то, что говорите, тогда вы не сможете воспользоваться Полиморфизмом, например.

for(Primate p : primateList){ 
    p.sayType(); // 
} 

С, что вы можете позволить объекты сделать реализацию Вашего предопределенным именем метода и быть уверенным, что это всегда то же самое имя.

+0

Спасибо! Я упомянул, что я новичок (не подозревая о полиморфизме), но теперь, когда вы упомянули об этом, я просмотрел несколько руководств, и теперь я понимаю это лучше! – comparter

1

Ну, вы могли бы, но тогда Primate b = new Human(); b.sayType(); вывел бы «Я примат». Кроме того, вы не сможете получить доступ к humanHello с помощью ссылки на Primate, если только вы не приняли неприятный ссылочный листинг, который не сработает, если ссылка не относится к экземпляру Human.

Переопределение полезно, если у вас есть контейнер ссылок на приматов (людей, гиббонов и т. Д.), И вы хотите получить доступ к правильному методу с помощью конкретной ссылки.

 Смежные вопросы

  • Нет связанных вопросов^_^