Java. nameOfObject.equals(nameOfObject)

  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #21

можно вообще вот так:
Код:
Object obj;
obj = new Employee(...);
obj = new Manager(...)*

а суть заключается в том что ты можешь вызвать у объекта находящегося в переменной obj метод equals, т.к. этот метод описан в классе Object, от которого наследуются и Employee и Manager. При этом то, какой код будет выполнен будет зависеть от того какой именно объект находится в переменной.

Код:
Object obj;
obj = new Employee(...);
obj.equals(aaa);     // отработает метод Employee.equals
obj = new Manager(...)*
obj.equals(aaa);     // отработает метод Manager.equals

Если ты не перегружал equals в Employee и Manager, то будет вызван код, определенный в Object.equals. А если перегрузил, то будет вызван перегруженный тобой метод. Это и есть полиморфизм.
 
  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #22
Что я должен был понять в полиморфизме, хрен его знает.

вот вам полиморфизм на вашем примере. у вас есть класс Работник. у него, допустим, есть метод "уволить". создадим Работнику двух наследников - Менеджер и Уборщик. в каждом из этих классов переопределим метод "уволить". в классе Менеджер этот метод будет начислять работнику три оклада и давать путевку в Турцию. а в классе Уборщик метод "уволить" будет вычитать три оклада и давать путевку в Ад.

в какой-то момент вы решаете всех уволить. берете список всех работников, то есть список объектов класса Работник. неважно кто из них менеджер, а кто уборщик, просто List<Employee>. проходите по этому списку и вызываете метод "уволить". это можно сделать, поскльку такой метод есть в классе Работник. но в рантайме жава уже будет знать, кто из этих работников менеджер, а кто уборщик. соответственно, сама аккуратно вызовет переопределенные методы для каждого из них.

польза налицо - вам не пришлось выполнять никаких проверок собственноручно. более того, если завтра вы захотите добавить ещё один тип работника - ВкручивательЛампочек, например - вам ничего не нужно будет менять в коде, который увольняет по списку всех работников, потому что в нем нет никакой связи с конкретными реализациями класса Работник (который, кстати, может быть вообще абстрактным классом или интерфейсом).

в общем, это называется, добро пожаловать в ООП ))
 
  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #23
HelloWorld

Спасибо. Принцип понял. Разжевали очень доходчиво.

Только я не понял Klez(а)
Почему неизвестные классы? Догадываюсь, потому что хрен его знает, кто писал эти классы и какие они есть. Т.е. программисту-клиенту это не интересно, он не должен знать об этом.

P.S. В интернете есть видеоурок по Java, сделали какие-то ребята.

Как пример полиморфизма, они показывают переопределение метода. Из Вашего примера, это применить увольнение сотрудника с дополнительными условиями. Т.е. подкласс Менеджер имеет свои условия, Уборщики свои. Но это же не полиморфизм? Сам принцип тесно связан с ним, но увольнять какой-то подкласс можно вообще без какого-то переопределения.

Я понимаю так, что они не раскрыли определение полиморфизма.
 
Останнє редагування:
  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #24

мой пример - это и есть переопределение метода уволить() в классах-наследниках класса Работник. увольнение по списку я привел как пример полезности полиморфизма. кстати, что вы здесь называете условиями?


ну, как сказать.. если Работник - это реальный класс и у него реализован метод уволить(), то да, его можно не переопределять в классе Уборщик, например. и тогда при вызове этого метода у объекта класса Уборщик вызовется на самом деле метод из базового класса, т.е. Работник. но Работник может быть вообще интерфейсом, то есть, там не будет никакой реализации, будет только описано, что у класса, имплементирующего этот интерфейс, должен быть метод уволить(). и тогда вам уже будет необходимо его реализовать в наследниках.
 
  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #25
HelloWorld

Т.е. полиморфизм это переопределение метода? Можете сформулировать в одном предложении, что это?

Условиями? Т.е. переопределение метода для каждого класса своё.
из Вашего примера метод "уволить". в классе Менеджер этот метод будет начислять работнику три оклада и давать путевку в Турцию. а в классе Уборщик метод "уволить" будет вычитать три оклада и давать путевку в Ад.
увольняются сотрудники с разными условиями, т.е. метод по-разному замещается.

P.S. Чувствую, что если я не усвою это хорошо, дальше идти смысла нет. )))
 
  • 🟢 11:57 Відбій тривоги в м. Харків та Харківська територіальна громада.Слідкуйте за подальшими повідомленнями.#м_Харків_та_Харківська_територіальна_громада
  • #26

нет, это возможность использовать объект, зная от кого он унаследован, но не зная класс у этого объекта. Например метод equals может быть реализован по разному в разных классах. Но ты его можешь вызвать у объекта даже не зная класс этого объекта.