Сегодня мне поставили этот вопрос в конце экзамена по открытой книге модуля, и я потерял себя. Я читал, Head first Java
и оба определения казались абсолютно одинаковыми. Мне просто интересно, какова ГЛАВНАЯ разница для моего собственного разума. Я знаю, что есть ряд подобных вопросов, но ни один из них, которые я видел, не дает однозначного ответа.
java
oop
inheritance
polymorphism
Даррен Берджесс
источник
источник
Ответы:
Наследование - это когда «класс» происходит от существующего «класса». Итак, если у вас есть
Person
класс, то у вас естьStudent
класс, который расширяетPerson
,Student
наследует все, чтоPerson
имеет. Есть некоторые подробности относительно модификаторов доступа, которые вы помещаете в поля / методы в Person, но это основная идея. Например, если у вас есть закрытое полеPerson
,Student
оно не будет отображаться, потому что его закрытые и закрытые поля не видны подклассам.Полиморфизм имеет дело с тем, как программа решает, какие методы она должна использовать, в зависимости от того, что она имеет. Если у вас есть метод
Person
, у которого естьread
метод, и у вас есть метод,Student
который расширяетPerson
, который имеет свою собственную реализациюread
, то какой метод вызывается, определяется для вас во время выполнения, в зависимости от того, есть ли у васPerson
илиStudent
. Это немного сложно, но если вы делаете что-то вродевызывается метод read для Student . Это полиморфизм в действии. Вы можете сделать это назначение, потому что a
Student
является aPerson
, но среда выполнения достаточно умна, чтобы знать, что фактическим типомp
является Student .Обратите внимание, что детали различаются для разных языков. Например, вы можете выполнять наследование в javascript, но оно совершенно отличается от того, как оно работает в Java.
источник
Person
«Sread
метод использует модификатор доступа общественности, не будутStudent
объекты быть в состоянии получить доступ к ним? и тогдаStudent s = new Student();
не будет ли легче? Я все еще не совсем понимаю преимущества полиморфизма.Person p = new Student();
вместоStudent p = new Student();
?Наследование относится к использованию структуры и поведения суперкласса в подклассе.
Полиморфизм относится к изменению поведения суперкласса в подклассе.
источник
m
(обаstatic
иinstance
) суперкласса, для которого ...» (с последующими подробностями о наследовании). Звучит как «повторное использование кода» для меня.import static
чтобы устранить это неправильное использование интерфейсов.) Для чистого полиморфизма в Java, инструмент, который нужно использовать, это интерфейсы, а не наследование классов.Полиморфизм : способность одинаково относиться к объектам разных типов. Пример: Жираф и Крокодил - это и животные, и животные могут
Move
. Если у вас есть экземпляр,Animal
вы можете позвонить,Move
не зная и не заботясь о том, что это за животное.Наследование : это один из способов достижения как полиморфизма, так и повторного использования кода одновременно.
Другие формы полиморфизма : есть другой способ достижения полиморфизма, такой как интерфейсы, которые обеспечивают только полиморфизм, но не повторное использование кода (иногда код совсем другой, например,
Move
для Snake будет совсем не так, какMove
для Dog, в этом случае Интерфейс был бы лучшим полиморфным выбором в этом случае.В других динамических языках полиморфизм может быть достигнут с помощью Duck Typing, то есть классам даже не нужно совместно использовать один и тот же базовый класс или интерфейс, им просто нужен метод с тем же именем. Или даже более динамичный, как Javascript, вам даже не нужны классы, просто объект с тем же именем метода можно использовать полиморфно.
источник
Основным отличием полиморфизма является специфический результат наследования. Полиморфизм - это то, где метод, который должен быть вызван, определяется во время выполнения на основе типа объекта. Это ситуация, которая возникает, когда один класс наследуется от другого и переопределяет определенный метод. Однако в обычном дереве наследования вам не нужно переопределять какие-либо методы, и поэтому не все вызовы методов должны быть полиморфными. Имеет ли это смысл? Это проблема, аналогичная тому, что все автомобили Ford - это автомобили, но не все автомобили являются Ford (хотя и не совсем ....).
Кроме того, полиморфизм имеет дело с вызовом метода, тогда как наследование также описывает элементы данных и т. Д.
источник
В Java эти два тесно связаны. Это связано с тем, что в Java используется метод вызова метода, который называется «динамическая диспетчеризация». Если бы у меня был
Затем мы видим, что B наследуется
spin
от A. Однако, когда мы пытаемся манипулировать объектом, как если бы это был тип A, мы все равно получаем поведение B дляdraw
.draw
Поведение является полиморфным.В некоторых языках полиморфизм и наследование не так тесно связаны. Например, в C ++ функции, не объявленные как виртуальные, наследуются, но не отправляются динамически, поэтому вы не получите такое полиморфное поведение даже при использовании наследования.
В JavaScript каждый вызов функции отправляется динамически, и у вас слабая типизация. Это означает, что вы можете иметь кучу не связанных между собой объектов, каждый со своим
draw
, иметь функцию, перебирать их и вызывать функцию, и каждый будет вести себя просто отлично. Вы бы получили свой собственный полиморфный рисунок без необходимости наследования.источник
Полиморфизм. Предположим, вы работаете в компании, которая продает ручки. Таким образом, вы создаете очень хороший класс под названием «Ручка», который обрабатывает все, что вам нужно знать о ручке. Вы пишете все виды классов для выставления счетов, доставки, создания счетов-фактур, все с использованием класса Pen. Приходит босс и говорит: «Отличная новость! Компания растет, и мы сейчас продаем книги и компакт-диски!» Не очень хорошая новость, потому что теперь вы должны изменить каждый класс, который использует Pen, чтобы также использовать Book & CD. Но что, если вы изначально создали интерфейс под названием «SellableProduct», а Pen реализовал этот интерфейс. Тогда вы могли бы написать все свои классы доставки, выставления счетов и т. Д., Чтобы использовать этот интерфейс вместо Pen. Теперь все, что вам нужно сделать, это создать новый класс Book & CompactDisc, который реализует интерфейс SellableProduct. Из-за полиморфизма все остальные классы могут продолжать работать без изменений! Есть смысл?
Таким образом, это означает использование Наследования, которое является одним из способов достижения полиморфизма.
Полиморфизм возможен в классе / интерфейсе, но наследование всегда между 2 ИЛИ более классами / интерфейсами. Наследование всегда соответствует отношениям "есть-а", тогда как оно не всегда соответствует полиморфизму (который может соответствовать отношениям "есть-а" / "имеет-а").
источник
Наследование - это скорее статическая вещь (один класс расширяет другой), в то время как полиморфизм - это динамическая вещь / среда выполнения (объект ведет себя в соответствии со своим динамическим типом / временем выполнения, а не статическим типом / типом объявления).
Например
-> Хотя статический / декларационный тип a равен A, фактический динамический тип / тип времени выполнения равен B, и поэтому a.foo () будет выполнять foo, как определено в B, а не в A.
источник
Полиморфизм - это подход к выражению общего поведения между типами объектов, имеющих сходные черты. Это также позволяет вариации этих черт быть созданы путем переопределения. Наследование - это способ достижения полиморфизма через иерархию объектов, где объекты выражают отношения и абстрактное поведение. Это не единственный способ достичь полиморфизма. Прототип - это еще один способ выражения полиморфизма, который отличается от наследования. JavaScript является примером языка, который использует прототип. Я полагаю, есть и другие способы.
источник
Наследование - это концепция, связанная с повторным использованием кода. Например, если у меня есть родительский класс say,
Animal
и он содержит определенные атрибуты и методы (для этого примера saymakeNoise()
иsleep()
), и я создаю два дочерних класса с именемDog
andCat
. Так как собаки и кошки идут спать в той же манере (я предполагаю) нет необходимости добавлять больше функциональных возможностей кsleep()
методу вDog
иCat
подклассы , предоставляемые родительского классаAnimal
. Тем не менее,Dog
лает иCat
мяукает так, хотяAnimal
у класса может быть метод создания шума, собака и кошка издают разные шумы относительно друг друга и других животных. Таким образом, существует необходимость переопределить это поведение для их конкретных типов. Таким образом, определение полиморфизма. Надеюсь это поможет.источник
Документация Oracle процитировала разницу точно.
наследование: класс наследует поля и методы от всех своих суперклассов, прямых или косвенных. Подкласс может переопределять методы, которые он наследует, или он может скрывать поля или методы, которые он наследует . (Обратите внимание, что скрытие полей - это вообще плохая практика программирования.)
полиморфизм: полиморфизм относится к принципу в биологии, в котором организм или вид может иметь много различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и, тем не менее, совместно использовать некоторые из тех же функций родительского класса.
полиморфизм не применим для полей.
Связанный пост:
Полиморфизм против переопределения против перегрузки
источник
Полиморфизм - это эффект наследования . Это может происходить только в классах, которые расширяют друг друга. Это позволяет вам вызывать методы класса, не зная точного типа класса. Кроме того, полиморфизм происходит во время выполнения .
Например, пример полиморфизма Java:
Наследование позволяет производным классам совместно использовать интерфейсы и код своих базовых классов. Это происходит во время компиляции .
Например, все классы в платформе Java являются потомками объекта (изображение любезно предоставлено Oracle):
Чтобы узнать больше о наследовании Java и Java полиморфизм
источник
Наследование - это когда класс A наследует все нестатические защищенные / публичные методы / поля от всех своих родителей до Object.
источник
Если вы используете JAVA, это так просто:
Полиморфизм использует унаследованные методы, но «переопределяет» их, чтобы сделать что-то другое (или то же самое, если вы называете super, так что технически это не будет полиморфным).
Поправьте меня если я ошибаюсь.
источник
Основное назначение полиморфизма : создание ссылочной переменной для суперкласса и удержание объекта подкласса => объект может выполнять несколько действий .
В наследство , подкласс наследует свойства суперкласса .
источник
наследование является своего рода полиморфизмом, именно на самом деле наследование является динамическим полиморфизмом. Таким образом, когда вы удаляете наследование, вы больше не можете переопределять.
источник
В Inheritance реализация определяется в суперклассе, поэтому поведение наследуется.
При использовании полиморфизма реализация определяется в подклассе, поэтому наследуется только интерфейс .
источник
Полиморфизм достигается путем наследования в
Java
.Hamster
класс наследует структуру изAnimal
,Herbivore
иPet
проявлять полиморфный бихевиоризм из домашнего животного.Cat
класс наследует структуру изAnimal
,Carnivore
аPet
также проявлять полиморфный бихевиоризм из домашнего животного.источник