Полиморфизм против переопределения против перегрузки - PullRequest
327 голосов
/ 30 сентября 2008

С точки зрения Java, когда кто-то спрашивает:

что такое полиморфизм?

Будет ли перегрузка или переопределением приемлемым ответом?

Я думаю, в этом есть нечто большее.

ЕСЛИ у вас был абстрактный базовый класс, который определил метод без реализации, и вы определили этот метод в подклассе, он все еще переопределяется? Я думаю, перегрузка - это не правильный ответ.

Ответы [ 21 ]

0 голосов
/ 30 сентября 2008

Полиморфизм относится к способности языка одинаково обрабатывать различные объекты с помощью единого интерфейса; как таковой он связан с переопределением, поэтому интерфейс (или базовый класс) является полиморфным, а разработчик - это объект, который переопределяет (две грани одной медали)

в любом случае, разница между этими двумя терминами лучше объясняется с помощью других языков, таких как c ++: полиморфный объект в c ++ ведет себя как аналог java, если базовая функция виртуальная, но если метод не виртуальный, переход кода разрешено статически , а истинный тип не проверен во время выполнения, поэтому полиморфизм включает способность объекта вести себя по-разному в зависимости от интерфейса, используемого для доступа к нему; позвольте мне привести пример в псевдокоде:

class animal {
    public void makeRumor(){
        print("thump");
    }
}
class dog extends animal {
    public void makeRumor(){
        print("woff");
    }
}

animal a = new dog();
dog b = new dog();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

(предположим, что makeRumor НЕ является виртуальным)

java на самом деле не предлагает этот уровень полиморфизма (называемый также разрезанием объектов).

животное a = новая собака (); собака б = новая собака ();

a.makeRumor() -> prints thump
b.makeRumor() -> prints woff

в обоих случаях печатается только woff. так как А и В относятся к классу собаки

...