Что такое полиморфизм в Java. Инкапсуляция, Наследование, Полиморфизм (Основы PHP - Урок из курса) 14 полиморфизм и его использование в программах

Полиморфизмом называется способность вещества одного и того же состава существовать исходя из внешних условий в нескольких кристаллических формах (полиморфных модификациях) с различной структурой (для простых веществ это явление иногда называют аллотропией).

Явление полиморфизма впервые было открыто немецким химиком и минерологом Э.Митчерлихом в 1821г. Полиморфизм широко распространен в природе и является одним из характерных свойств кристаллических веществ. Полиморфные модификации, отличаясь внутренней структурой, имеют в связи с этим и различные свойства. Поэтому изучение полиморфизма чрезвычайно важно для практики.

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

В различных полиморфных модификациях существуют углерод, кремний, фосфор, железо и другие элементы. Физические свойства различных модификаций одного и того же вещества могут значительно отличаться. Например модификации углерода, кристаллизующиеся в виде алмаза (кубическая сингония) или в виде графита (гексагональная сингония), резко отличаются друг от друга по физическим свойствам, несмотря на идентичность состава. Если полиморфное превращение сопровождается незначительными изменениями структуры, физические свойства вещества изменяются несущественно. Полиморфных модификаций у каждого конкретного вещества должна быть две, три и более. Различные модификации принято обозначать греческими буквами α, β, γ и т.д., причем первые буквы, как правило, относятся к модификациям, устойчивым при более высоких температурах.

При превращении высокотемпературной модификации в более низкотемпературную обычно первоначальная внешняя форма кристаллов сохраняется, в то время как внутренняя структура вещества претерпевает изменения. Такое сохранение внешней формы, не отвечающей вновь образованной структуре кристаллической решетки, получило название параморфозы. В природе известны параморфозы β -кварца (тригональная симметрия) по α -кварца (гексагональная симметрия), кальцита СаСО 3 (тригональная симметрия) по арагониту (ромбическая симметрия) и др.

Независимо от характера структурных изменений, происходящих при полиморфных превращениях, различают две их разновидности˸ энантиотропные (обратимые) и монотропные (необратимые) превращения.

Обратимое превращение одной модификации в другую, осуществляемое при постоянном давлении и определенной температуре (точке) перехода, при которой эти модификации находятся в состоянии равновесия, т.е. одинаково устойчивы, называется энантиотропным. Схематически это можно изобразить следующим образом˸

α ↔ β↔жидкость

т.е. перход α → β энантиотропен. Примерами энантиотропных полиморфных превращений являются превращения между полиморфными формами SiO 2 ˸

Полиморфизм - понятие и виды. Классификация и особенности категории "Полиморфизм" 2015, 2017-2018.

  • - Полиморфизм индивидов

    Человеческие индивиды, обладая рядом общих свойств, в то же время не тождественны друг с другом по видовым качествам. Они различаются один от другого и физически, и психически, и социально. Такими различиями являются рост, цвет кожи и волос, внешний вид индивида, походка,... .


  • - Дизруптивный благоприятствует сохранению крайних типов и элиминации промежуточных. Приводит к сохранению и усилению полиморфизма.

  • - Внутривидовая дифференцировка человечества. Расы как выражение генетического полиморфизма человечества. Видовое единство человечества.

    ВНУТРИВИДОВАЯ ДИФФЕРЕНЦИАЦИЯ ЧЕЛОВЕЧЕСТВА: С момента возникновения Н. sapiens социальное в человеке стало его сущностью и биологическая эволюция видоизменялась, проявляясь в возникновении широкого генетического полиморфизма. Генетическое разнообразие на уровне... .


  • ПОЛИМОРФИЗМ в генетике (греч, polymorphos многообразный) - термин, обозначающий проявление индивидуальной, прерывистой изменчивости живых организмов. Первоначально он широко использовался для обозначения любой прерывистой изменчивости внутри вида (напр., каст общественных насекомых, возрастных отличий в окраске, полового диморфизма и др.), однако позже такие различия стали называть полифенизмом, а термином «полиморфизм» в соответствии с определением, данным английским генетиком Фордом (E. В. Ford), обозначать наличие в одной и той же популяции двух или более хорошо различимых форм, способных появляться в потомстве одной самки и встречающихся с частотой, достаточно высокой для того, чтобы исключить поддержание самой редкой из них повторно возникающими мутациями. Понятие «полиморфный» следует также отличать от понятия «политипический», к-рое обозначает сложные таксономические категории (напр., политипический вид - вид, представленный двумя или более подвидами, и т. п.).

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

    П. затрагивает любые особенности фенотипа на любом уровне, в т. ч. на клеточном и молекулярном. Напр., хорошо известен П. эритроцитарных антигенов у человека (группы крови), структуры хромосом - инверсии, дупликации, добавочные хромосомы (см. Хромосомный полиморфизм).

    В конце 60-х - начале 70-х гг. 20 в. благодаря разработке чувствительных методов, гл. обр. различных методов электрофореза (см.), в популяциях животных и человека обнаружен еще более широкий П. по генам, ответственным за синтез белков крови и других тканей, который присущ почти трети всех изученных генных локусов, кодирующих синтез белков как ферментной, так и неферментной природы (см. Изоферменты).

    Биол, значение такой широкой наследственной изменчивости популяций и видов до конца не расшифровано, и по этому вопросу существует две точки зрения. Согласно одной из них биохим. П. поддерживается в популяциях благодаря отбору, т. е. имеет приспособительное значение, согласно другой - биохим. П. должен быть отнесен к категории селективно-нейтральной изменчивости. Тем не менее существует множество достоверных фактов, свидетельствующих об исключительном значении явления генетического П. для биологии и медицины. Постоянное присутствие в популяции с достаточно высокой частотой двух или более дискретных форм - генотипов (см.) - означает, что такой П. поддерживается за счет преимущественного отбора гетерозигот. Примером этого может служить полиморфизм гемоглобина, широко распространенный в популяциях людей азиатского и африканского происхождения и приводящий к заболеванию, известному под названием серповидно-клеточной анемии (см.). Анемия связана с гомозиготностью по гену s, который обусловливает образование аномального гемоглобина. Гомозиготы ss погибают вскоре после рождения. Однако стало известно, что высокая частота этого гена в популяциях сохраняется благодаря тому, что гетерозиготы Ss менее поражаются малярией, чем гомозиготы SS. В условиях постоянного присутствия в окружающей среде возбудителя малярии в популяциях поддерживается устойчивое соотношение всех трех генотипов - SS, Ss и ss, так наз. сбалансированный полиморфизм.

    Аналогичный или похожий механизм лежит в основе поддержания П. групп крови и различных белков в популяциях человека, что наряду с другими доказательствами подтверждается также открытием корреляции (ассоциаций) между той или иной группой крови и устойчивостью к определенным заболеваниям. Напр., среди больных язвой желудка и двенадцатиперстной кишки группа крови О встречается соответственно на 10 и 17% чаще, чем среди остальной части популяции. Частота группы крови А достоверно выше у больных нек-рыми формами анемии и сахарного диабета. Недавно показана также определенная роль полиморфизма тканевых антигенов в устойчивости организма человека к нек-рым заболеваниям.

    Каждый индивидуум обладает уникальным генотипом в отношении групп крови и белков, и эта уникальность отражается на его физических и физиол, особенностях, в т. ч. и на устойчивости к заболеваниям как экзогенной, так и эндогенной природы. Очевидно, что связь между полиморфным состоянием гена и его функциональной ролью не всегда носит столь ярко выраженный специфический характер, как в случае серповидноклеточной анемии, а гораздо чаще определяется некоей интегральной структурой генотипа по совокупности многих полиморфных генов, контролирующих неспецифическую биол, устойчивость организма.

    Т. о., хотя не все в явлении генетического П. окончательно выяснено, его анализ позволяет изучать генетические процессы в популяциях различных видов животных и человека и решать важные вопросы, связанные с их происхождением, эволюцией и адаптацией к окружающей среде. Генетический П. позволяет также использовать группы крови и электрофоретические варианты белков в качестве генетических маркеров для решения ряда задач судебной медицины (напр., при идентификации генотипов с помощью исследования образцов крови и других биол, жидко-тей, при доказательстве монозигот-ности близнецов, при решении вопросов о спорном отцовстве и др.), для составления оптимальных схем трансплантации органов и тканей, для обнаружения связей между генотипом и устойчивостью к различным заболеваниям. Следует, однако, указать, что генетическое «содержание» вида не сводится к одной лишь изменчивости и что наряду с П. необходимо учитывать явление генетического мономорфизма, когда вид в целом представлен лишь одним, преобладающим генотипом, а частота вариантных форм не превышает вероятности повторного мутирования.

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

    ПОЛИМОРФИЗМ в патологии

    ПОЛИМОРФИЗМ в патологии (греч. polymorphos многообразный) - многообразие структурных проявлений патологического процесса в органах, тканях и клетках.

    В общей патологии П. наблюдается при компенсаторно-приспособительных процессах, возникающих на различных этапах развития болезни. Компенсаторные процессы (см.) весьма разнообразны и обычно развиваются в отдельных системах, органах и тканях организма. Напр., при регенерации костной ткани в зоне перелома костная мозоль может быть представлена как волокнистой соединительной тканью, так и костно-хрящевыми структурами. Кроме того, П. отмечается при метаплазии тканей (см. Метаплазия) и в процессе организации (см.). В частной патологии П. проявляется в изменчивости морфол, картины ряда заболеваний (туберкулеза, крупозной пневмонии и др.) под влиянием естественных и индуцированных факторов (см. Патоморфоз). В частности, течение крупозной пневмонии может начинаться со стадии красного опеченения или серого опеченения, а в нек-рых случаях она носит мигрирующий характер. Чаще понятие «полиморфизм» используют для морфол, характеристики опухолевого роста.

    Различают тканевой, клеточный и ядерный П. Тканевой П., характеризующийся различным соотношением паренхимы и стромы, встречается, напр., в условиях хрон, воспаления, при к-ром вследствие дистрофии (см. Дистрофия клеток и тканей) и регенерации (см.) выявляются разнообразные клеточные элементы, большее или меньшее количество сосудов различного калибра. Тканевой П., напр, при циррозе печени, проявляется развитием неравномерных прослоек фиброзной ткани, среди к-рых располагаются скопления гепатоцитов различной величины и формы. При микроскопическом исследовании опухолей, напр, аденокарциномы, обнаруживают железистые комплексы различной величины и формы. Так, при раке предстательной железы величина железистых комплексов варьирует в широких пределах, форма их разнообразна, часто с фестончатыми очертаниями и многочисленными бухтообразными выпячиваниями. Значительным разнообразием величины и формы обладают тяжи и гнезда опухолевых клеток при плоскоклеточном раке.

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

    Для ядерного П. характерно появление ядер различной величины и формы, различных патол, форм кариокинеза. Так, в опухолевых клетках ядро может занимать почти всю цитоплазму или в части случаев бывает резко уменьшено в размерах. В связи с нарушениями митоза (см.) возникают гигантские многоядерные клетки. Ядра нек-рых клеток интенсивно окрашиваются, становятся гиперхромными. При гидропической дистрофии ядра клеток увеличены в объеме, округлой формы, с разреженной нуклеоплазмой. Иногда в ядрах имеют место признаки пикноза (см.). В условиях регенерации ядра могут приобретать неправильные очертания, в них отмечается перераспределение хроматина (см.). Часто в условиях регенерации и патологии обнаруживается П. внутриклеточных структур, таких как митохондрии (см.), эндоплазматическая сеть, лизосомы (см.).

    ПОЛИМОРФИЗМ в химии

    ПОЛИМОРФИЗМ в химии (греч. polymorphous многообразный) - способность одного и того же химического соединения или элемента образовывать в зависимости от внешних условий (температуры, давления и др.) различные кристаллические формы (модификации). П. объясняют способностью одних и тех же атомов или молекул образовывать различные кристаллические решетки, отличающиеся своей устойчивостью. Явление П. в химии открыто Мичерлихом (E. Mitscherlich) в 1821 г. П. наблюдается для простых веществ (так наз. аллотропия), для многих органических и неорганических соединений, а также для минералов. Примерами аллотропных простых веществ могут служить алмаз и графит, белый и фиолетовый (красный) фосфор и др. Примером П. хим. соединений могут служить кальцит и арагонит - полиморфные модификации карбоната кальция. Известны два основных вида П.: энантиотро-пия (обратимые превращения) и мо-нотропия (необратимые превращения).

    Вещества, находящиеся в различных полиморфных модификациях, обладают разными физ.-хим. свойствами и разной биол, активностью; напр., рост гемофильных бактерий на синтетической среде, заменяющей кровь, происходит при наличии в среде гамма-Fe 2 O 3 , а в присутствии aльфа-Fe 2 O 3 бактерии погибают.

    Библиография:

    полиморфизм в генетике

    Алтухов Ю. П. и Рычков Ю. Г. Генетический мономорфизм видов и его возможное биологическое значение, Журн. общ. биол., т. 33, № 3, с. 281, 1972; Бочков Н. П. Генетика человека, М., 1978; Майр Э. Популяции, виды и эволюция, пер. с англ., М., 1974; Харрис Г. Основы биохимической генетики человека, пер. с англ., М., 1973; Эрлих П. и Холм Р. Процесс эволюции, пер. с англ., М., 1966; С a v а 1 1 i - S f о г z a L. L. a. Bod- ш e г W. F. The genetics of human populations, San Francisco, 1971; Ford E. B. Polymorphism and taxonomy, в кн.: The new systematics, ed. by J. Huxley, p. 493, L., 1941.

    полиморфизм в патологии

    Давыдовский И. В. Общая патология человека, с. 506, М., 1969; С т р у к о в А. И. и Серов В. В. Патологическая анатомия с. 159, М., 1979.

    полиморфизм в химии

    Некрасов Б. В. Учебник общей химии, с. 382, М., 1981; Не-н и ц e с к у К. Общая химия, пер. с румын., с. 130, М., 1968.

    Ю. П. Алтухов (полиморфизм в генетике), Г. М. Могилевский (полиморфизм в патологии),

    Объектно-ориентированное программирование (ООП) – подход к созданию программ, основанный на использовании классов и объектов, взаимодействующих между собой.

    Класс (java class) описывает устройство и поведение объектов. Устройство описывается через набор характеристик (свойств), а поведение – через набор доступных для объектов операций (методов). Классы можно создавать на основе уже имеющихся, добавляя или переопределяя свойства и методы.

    Классы представляют шаблоны, по которым строятся объекты. Объекты – это элементы программы, обладающие схожим набором характеристик и поведением (т.е это элементы, построенные на основе одного класса). Каждый объект имеет некоторое состояние, оно определяется значением всех его свойств. В одной программе могут существовать несколько классов, а объекты разных классов могут взаимодействовать между собой (через методы).

    Наследование, extends

    Наследование является неотъемлемой частью Java. При использовании наследования принимается во внимание, что новый класс, наследующий свойства базового (родительского) класса имеет все те свойства, которым обладает родитель. В коде используется операнд extends , после которого указывается имя базового класса. Тем самым открывается доступ ко всем полям и методам базового класса.

    Используя наследование, можно создать общий "java class", который определяет характеристики, общие для набора связанных элементов. Затем можно наследоваться от него и создать дополнительные классы, для которых определить дополнительные уникальные для них характеристики.

    Главный наследуемый класс в Java называют суперклассом super . Наследующий класс называют подклассом . Таким образом подкласс - это специализированная версия суперкласса, которая наследует все свойства суперкласса и добавляет свои собственные уникальные элементы.

    Рассмотрим пример описания java class"a студента Student, который имеет имя, фамилию, возраст, и номер группы. Класс студента будем создавать на основе super класса пользователя User, у которого уже определены имя, фамилия и возраст:

    Public class User { int age; String firstName; String lastName; // Конструктор public User(int age, String firstName, String lastName) { this.age = age; this.firstName = firstName; this.lastName = lastName; } }

    Теперь создаем отдельный класс Student, наследующего свойства super класса. При наследовании класса необходимо также переопределить и конструкторы родительского класса:

    Public class Student extends User { int group; // Конструктор public Student(int age, String firstName, String lastName) { super(age, firstName, lastName); } boolean isMyGroup(int g) { return g == group; } }

    Ключевое слово extends показывает, что мы наследуемся от класса User.

    Ключевое слово super

    В конструкторе класса Student мы вызываем конструктор родительского класса через оператор super , передавая ему весь необходимой набор параметров. В Java ключевое слово super обозначает суперкласс, т.е. класс, производным от которого является текущий класс. Ключевое слово super можно использовать для вызова конструктора суперкласса и для обращения к члену суперкласса, скрытому членом подкласса.

    Рассмотрим как происходит наследование с точки зрения создания объекта:

    Student student = new Student(18, "Киса", "Воробьянинов", 221);

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

    У суперкласса могут быть несколько перегруженных версий конструкторов, поэтому можно вызывать метод super() с разными параметрами. Программа выполнит тот конструктор, который соответствует указанным аргументам.

    Вторая форма ключевого слова super действует подобно ключевому слову this , только при этом мы всегда ссылаемся на суперкласс подкласса, в котором она использована. Общая форма имеет следующий вид:

    Здесь член может быть методом либо переменной экземпляра. Подобная форма подходит в тех случаях, когда имена членов подкласса скрывают члены суперкласса с такими же именами.

    Class A { int i; } // наследуемся от класса A class B extends A { int i; // имя переменной совпадает и скрывает переменную i в классе A B(int a, int b) { super.i = a; // обращаемся к переменной i из класса A i = b; // обращаемся к переменной i из класса B } void show() { System.out.println("i из суперкласса равно " + super.i); System.out.println("i в подклассе равно " + i); } } class MainActivity { B subClass = new B(1, 2); subClass.show(); }

    В результате в консоли мы должны увидеть:

    I из суперкласса равно 1 i в подклассе равно 2

    Переопределение методов, Override

    Если в иерархии классов имя и сигнатура типа метода подкласса совпадает с атрибутами метода суперкласса, то метод подкласса переопределяет метод суперкласса. Когда переопределённый метод вызывается из своего подкласса, он всегда будет ссылаться на версию этого метода, определённую подклассом. А версия метода из суперкласса будет скрыта.

    Если нужно получить доступ к версии переопределённого метода, определённого в суперклассе, то необходимо использовать ключевое слово super .

    Не путайте переопределение с перегрузкой. Переопределение метода выполняется только в том случае, если имена и сигнатуры типов двух методов идентичны. В противном случае два метода являются просто перегруженными.

    В Java SE5 появилась анотация @Override; . Если необходимо переопределить метод, то используйте @Override, и компилятор выдаст сообщение об ошибке, если вместо переопределения будет случайно выполнена перегрузка.

    В Java можно наследоваться только от одного класса.

    Инкапсуляция

    В информатике инкапсуляцией (лат. en capsula) называется упаковка данных и/или функций в единый объект.

    Основой инкапсуляции в Java является класс. Инкапсуляция означает, что поля объекта недоступны его клиентам непосредственно - они скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным.

    Модификаторы доступа

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

    Открытые члены класса составляют внешнюю функциональность, которая доступна другим классам. Закрытыми (private) обычно объявляются независимые от внешнего функционала члены, а также вспомогательные методы, которые являются лишь деталями реализации и неуниверсальны по своей сути. Благодаря сокрытию реализации класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы.

    Желательно использовать доступ к свойствам класса только через его методы (принцип bean классов, "POJO"), который позволяет валидировать значения полей, так как прямое обращение к свойствам отслеживать крайне сложно, а значит им могут присваиваться некорректные значения на этапе выполнения программы. Такой принцип относится к управлению инкапсулированными данными и позволяет быстро изменить способ хранения данных. Если данные станут храниться не в памяти, а в файлах или базе данных, то потребуется изменить лишь ряд методов одного класса, а не вводить эту функциональность во все части системы.

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

    Пример простого описания робота

    Public class Robot { private double x = 0; // Текущая координата X private double y = 0; // Текущая координата Y private double course = 0; // Текущий курс (в градусах) public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public double getCourse() { return course; } // Определение курса public void setCourse(double course) { this.course = course; } // Передвижение на дистанцию distance public void forward(int distance) { // Обращение к полю объекта X x = x + distance * Math.cos(course / 180 * Math.PI); // Обращение к полю объекта Y y = y + distance * Math.sin(course / 180 * Math.PI); } // Печать координат робота public void printCoordinates() { System.out.println(x + "," + y); } }

    В представленном примере робота используются наборы методов, начинающие с set и get . Эту пару методов часто называют сеттер/геттер. Данные методы используются для доступа к полям объекта. Наименования метода заканчиваются наименованием поля, начинающееся с ПРОПИСНОЙ буквы.

    В методах set мы передаем значение через формальный параметр во внутрь процедуры. В коде процедуры мы присваиваем значение переменной объекта/класса с использованием ключевого слова this .

    This.course = course ...

    Использование ключевого слова this необходимо, т.к. наименование формального параметра совпадает с наименованием переменной объекта. Если бы наименования отличались бы, то можно было бы this не использавать.

    Полиморфизм, polymorphism

    Полиморфизм является одним из фундаментальных понятий в объектно-ориентированном программировании наряду с наследованием и инкапсуляцией. Слово полиморфизм греческого происхождения и означает "имеющий много форм". Чтобы понять, что означает полиморфизм применительно к объектно-ориентированному программированию, рассмотрим пример создания векторного графического редактора, в котором необходимо использовать ряд классов в виде набора графических примитивов - Square , Line , Circle , Triangle , и т.д. У каждого из этих классов необходимо определить метод draw для отображения соответствующего примитива на экране.

    Очевидно, придется написать некоторый код, который для изображения рисунка будет последовательно перебирать все примитивы, которые необходимо вывести на экран, и вызывать метод draw у каждого из них.

    Человек, незнакомый с полиморфизмом, вероятнее всего создаст несколько массивов: отдельный массив для каждого типа примитивов и напишет код, который последовательно переберет элементы из каждого массива и вызовет у каждого элемента метод draw. В результате получится примерно следующий код:

    // Определение массивов графических примитивов Square s = new Square ; Line l = new Line ; Circle c = new Circle ; Triangle t = new Triangle; // Заполнение всех массивов соответствующими объектами. . . // Цикл с перебором всех ячеек массива. for (int i = 0; i < s.length; i++){ // вызов метода draw() в случае, если ячейка не пустая. if (s[i] != null) s.draw(); } for(int i = 0; i < l.length; i++){ if (l[i] != null) l.draw(); } for(int i = 0; i < c.length; i++){ if (c[i] != null) c.draw(); } for(int i = 0; i < t.length; i++){ if (t[i] != null) t.draw(); }

    Недостатком написанного выше кода является дублирование практически идентичного кода для отображения каждого типа примитивов. Также неудобно то, что при дальнейшей модернизации нашего графического редактора и добавлении возможности рисовать новые типы графических примитивов, например Text, Star и т.д., при таком подходе придется менять уже существующий код и добавлять в него определения новых массивов, а также обработку элементов, содержащихся в них.

    Используя полиморфизм, можно значительно упростить реализацию подобной функциональности. Прежде всего, создадим общий родительский класс Shape для всех наших классов.

    Public class Shape { public void draw() { System.out.println("Заглушка"); } }

    После этого мы создаем различные классы-наследники: Square (Квадрат), Line (Линия), Сircle (круг) и Triangle (Треугольник):

    Public class Point extends Shape { public void draw() { System.out.println("Квадрат"); } } public class Line extends Shape { public void draw() { System.out.println("Линия"); } } public class Сircle extends Shape { public void draw() { System.out.println("Круг"); } } public class Triangle extends Shape { public void draw() { System.out.println("Треугольник"); } }

    В наследниках у нас переопределен метод draw. В результате получили иерархию классов, которая изображена на рисунке.

    Теперь проверим удивительную возможность полиморфизма:

    // Определение и инициализация массива Shape a = new Shape {new Shape(), new Triangle(), new Square(), new Сircle()}; // Перебор в цикле элементов массива for(int i = 0; i < a.length; i++) { a[i].draw(); }

    В консоль будут выведены следующие строки:

    Заглушка Треугольник Квадрат Круг

    Таким образом каждый класс-наследник вызвал именно свой метод draw, вместо того, чтобы вызвать метод draw из родительского класса Shape.

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

    Перегрузка метода, overload

    В процедурном программировании тоже существует понятие полиморфизма, которое отличается от рассмотренного механизма в ООП. Процедурный полиморфизм предполагает возможность создания нескольких процедур или функций с одинаковым именем, но разными количеством или типами передаваемых параметров. Такие одноименные функции называются перегруженными, а само явление - перегрузкой (overload). Перегрузка функций существует и в ООП и называется перегрузкой методов. Примером использования перегрузки методов в языке Java может служить класс PrintWriter , который используется в частности для вывода сообщений на консоль. Этот класс имеет множество методов println, которые различаются типами и/или количеством входных параметров. Вот лишь несколько из них:

    Void println() // переход на новую строку void println(boolean x) // выводит значение булевской переменной (true или false) void println(String x) // выводит строку - значение текстового параметра

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

    Собственно, представим себе рядом стакан, кружку, чайник, кофемашину, велосипед и скейт. Что между ними всеми общего? Ну как минимум то, что они есть. То есть это - объекты, которые были созданы. Но как они были созданы? Скорее всего на заводе производителя по чертежам. Ок, чертежём назовём конструктор. Ну а класс? А что это такое? А его нет в нашей вселенной - эта сущность есть абстракция, что живёт лишь в наших мыслях. В реальном мире её нет и никогда не будет, такова уж физика - ей по барабану, что птицы и млекопитающие имеют дальних родственников - она лишь обеспечивает возможность естесственного отбора. А уж родственников друг другу находим мы, люди.

    С объектами и классами разобрались, а что же там с нашими стаканами и велосипедами. Мы уже поняли, что всё это объект, то есть грубо можно все объекты наследовать от какого-нибудь суперпредка, суперкласса, что и реализовано в некоторых языках. Но что другого общего между скейтом и стаканом, например? Конечно, можно углубляться и считать, что они все из молекул, и они все из твёрдых веществ. Однако это всё бред и СПГС , так что ответ прост - да ничего. То есть это совершенно разные объекты с совершенно разным функционалом. Более того - естесственно компьютерные модели и иерархии будут сильно отличатся от физик и химий. И это нормально, вопрос об адекватностях моделей ставиться лишь когда модель неадекватна, а до тех пор пилить можно что угодно, лишь бы работало.

    Вот. У нас есть супер-предок Object, от которого дефолтно наследуются все объекты. Допустим, то что объекты состоят из атомов и есть то, что наследуют все объекты. Но все дополнения и правки - полиморфизм. Так, из атомов мы слепили колёса и приделали на доску - ок, это скейт. На него можно встать и катиться, а сильно извернувшись и полетать в трёх метрах над землёй, прямо таки излучая своё яркое эго. В то время как стакан - это мы слепили из атомов плотную ёмкость, из которой вода не выливается под действием силы тяжести. И прямое применение стакана - налив воды опрокинуть его над ртом, чтобы вода вытекла прямо в желудок. Так делают настоящие пацаны, не заботясь об икоте или страхе утонуть, так что вот - полиморфизм.

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

    Тут мы подошли к абстракции. Вот такое иерархическое наследование приводит нас к, возможно главной, идее ООП. Вот мы взяли и выделили всё, куда можно налить воду в отдельный класс, нарисовали общий чертёж, но специально не доделали его, оставив зазор для будущих творцов, и назвали чертёж - ёмкость. Тысячи лет изобретатили всех миров создают свои ёмкости, одна лучше другой. Для разных людей - по разному, конечно. Но каждый раз группировать молекулы стекла определённым образом - непростая задача. Поэтому ремесленники пошли на хитрость, они создали тайный совет ремесленников мира и решили делиться друг с другом своими наработками. То есть создавать мелкие чертежи и объявлять классом, например, извлистой ручки в форме ленты Мёбиуса, например. Возможно такая ручка удобно только инопланетным существам, но чертёж создан и к нему можно ссылаться при создании своего чертежа. Таким образом мы абстрагируемся от низкоуровневой задачи "формирования ёмкостей посредством перемещения молекул" к "конструированию ёмкости посредством совмещения деталей, элементов". Это и есть абстракция.

    Но мы подошли к последнему пункту - инкапсуляция. Она неразрывна с абстракцией, и по сути благодаря ей она и работает. Инкапсуляция - это своеборазный клей (или синяя изолента), которым склеивают разные чертежи в один. То есть совмещение деталей для создания своей - это и есть инкапсуляция. Причём при совмещении мы можем не описывать детали этого совмещения (то есть члены класса могут быть приватными), таким образом помогая абстрагироваться тем, кто этот чертёж использует. Вот посмотрим на чайник - что это такое? Это стакан (или кружка) к которому снизу (а может внутри по середине?) приклеен нагревательный элемент. Пустив по нему ток, согласно инкапсулированному в нагревательный элемент закону Ома, будет выделяться тепло и нагреваться вода. А кофемашина? Это куда более сложное устройство, с множеством насосов, ёмкостей, шлюзов, измельчителей и чайников. И всё склееное клеем. А может синей изолентой. Это снова инкапсуляция.

    Таким образом, абстракция невозможна без инкапсуляции и наследовании, как невозможен полиморфизм без, собственно, наследования. Ну а полиморфизм невозможен ещё и без инкапсуляции, которая банально бесполезна без наследования и полиморфизма. Вот такие тут треугольники с пирогами. Жаль только про пирог наврали. И про день рожденье.