Fui apresentado com essa pergunta em um exame de livro aberto do final do módulo hoje e me vi perdida. Eu estava lendo Head first Java
e as duas definições pareciam exatamente as mesmas. Eu só estava me perguntando qual era a principal diferença para o meu próprio estado de espírito. Eu sei que há várias perguntas semelhantes a isso, mas nenhuma que eu tenha visto fornece uma resposta definitiva.
java
oop
inheritance
polymorphism
Darren Burgess
fonte
fonte
Respostas:
A herança é quando uma 'classe' deriva de uma 'classe' existente. Então, se você tem uma
Person
classe, então você tem umaStudent
classe que se estendePerson
,Student
herda todas as coisas quePerson
possui. Existem alguns detalhes sobre os modificadores de acesso que você coloca nos campos / métodos em Person, mas essa é a ideia básica. Por exemplo, se você tiver um campo privadoPerson
,Student
não o verá porque seus campos privado e privado não são visíveis para subclasses.O polimorfismo lida com a forma como o programa decide quais métodos ele deve usar, dependendo do tipo de coisa que possui. Se você tiver um
Person
, que possui umread
método, e umStudent
que se estendePerson
, cuja implementação é própriaread
, qual método é chamado, é determinado pelo tempo de execução, dependendo se você tem umPerson
ou aStudent
. Fica um pouco complicado, mas se você fizer algo comoo método de leitura no Student é chamado. Esse é o polimorfismo em ação. Você pode fazer essa tarefa porque a
Student
é aPerson
, mas o tempo de execução é inteligente o suficiente para saber que o tipo realp
é Aluno .Observe que os detalhes diferem entre os idiomas. Você pode fazer herança em javascript, por exemplo, mas é completamente diferente da maneira como funciona em Java.
fonte
Person
oread
método estiver usando o modificador de acesso público, osStudent
objetos não poderão acessá-los? e entãoStudent s = new Student();
não será mais fácil? Na verdade, ainda não recebo os benefícios do polimorfismo.Person p = new Student();
vez deStudent p = new Student();
?Herança refere-se ao uso da estrutura e comportamento de uma superclasse em uma subclasse.
Polimorfismo refere-se à alteração do comportamento de uma superclasse na subclasse.
fonte
m
(ambosstatic
einstance
) da superclasse para os quais ..." (seguidos de detalhes sobre herança). Soa como "reutilização de código" para mim.import static
para eliminar esse uso indevido de interfaces.) Para o polimorfismo puro em Java, a ferramenta a ser usada é interfaces, não herança de classe.Polimorfismo : a capacidade de tratar objetos de diferentes tipos de maneira semelhante. Exemplo: Girafa e Crocodilo são ambos Animais, e os animais podem
Move
. Se você tiver uma instância de umAnimal
, poderá ligarMove
sem saber ou se importar com o tipo de animal que é.Herança : Essa é uma maneira de obter o polimorfismo e a reutilização de código ao mesmo tempo.
Outras formas de polimorfismo : Há outra maneira de obter polimorfismo, como interfaces, que fornecem apenas polimorfismo, mas não reutilizam código (às vezes o código é bem diferente, como
Move
para uma cobra seria bem diferente deMove
um cachorro, nesse caso uma interface seria a melhor escolha polimórfica neste caso.Em outras linguagens dinâmicas, o polimorfismo pode ser alcançado com o Duck Typing, ou seja, as classes nem precisam compartilhar a mesma classe ou interface base, apenas precisam de um método com o mesmo nome. Ou ainda mais dinâmico, como o Javascript, você nem precisa de classes, apenas um objeto com o mesmo nome de método pode ser usado polimorficamente.
fonte
A principal diferença é que o polimorfismo é um resultado específico da herança. Polimorfismo é o local em que o método a ser chamado é determinado em tempo de execução com base no tipo do objeto. Essa é uma situação que resulta quando você tem uma classe herdando de outra e substituindo um método específico. No entanto, em uma árvore de herança normal, você não precisa substituir nenhum método e, portanto, nem todas as chamadas de método precisam ser polimórficas. Isso faz sentido? É um problema semelhante ao de todos os veículos Ford serem automóveis, mas nem todos os automóveis são Ford (embora não exatamente ...).
Além disso, o polimorfismo lida com a invocação de método, enquanto a herança também descreve membros de dados, etc.
fonte
Em Java, os dois estão intimamente relacionados. Isso ocorre porque o Java usa uma técnica para chamada de método chamada "despacho dinâmico". Se eu tiver
Então vemos que B herda
spin
de A. No entanto, quando tentamos manipular o objeto como se fosse um tipo A, ainda temos o comportamento de B paradraw
. Odraw
comportamento é polimórfico.Em algumas línguas, polimorfismo e herança não são tão intimamente relacionados. No C ++, por exemplo, funções não declaradas virtuais são herdadas, mas não serão despachadas dinamicamente, portanto você não terá esse comportamento polimórfico, mesmo quando usar a herança.
Em javascript, todas as chamadas de funções são despachadas dinamicamente e você tem digitação fraca. Isso significa que você pode ter um monte de objetos não relacionados, cada um com o seu
draw
, ter uma função iterar sobre eles e chamar a função, e cada um se comportaria bem. Você teria seu próprio desenho polimórfico sem precisar de herança.fonte
Polimorfismo: Suponha que você trabalhe para uma empresa que vende canetas. Então você cria uma classe muito boa chamada "Caneta" que lida com tudo o que você precisa saber sobre uma caneta. Você escreve todos os tipos de classes para cobrança, remessa, criação de faturas, todas usando a classe Caneta. Um chefe do dia chega e diz: "Ótimas notícias! A empresa está crescendo e estamos vendendo livros e CDs agora!" Não é uma ótima notícia, porque agora você precisa alterar todas as classes que usam a Caneta para também usar o Livro e o CD. Mas e se você tivesse criado originalmente uma interface chamada "SellableProduct", e Pen implementasse essa interface. Então você poderia ter escrito todas as suas classes de remessa, faturamento etc. para usar essa interface em vez da Caneta. Agora tudo o que você precisa fazer é criar uma nova classe chamada Book & CompactDisc, que implementa a interface SellableProduct. Por causa do polimorfismo, todas as outras classes poderiam continuar trabalhando sem alterações! Faz sentido?
Então, isso significa usar a Herança, que é uma das formas de alcançar o polimorfismo.
Polimorfismo pode ser possível em uma classe / interface, mas Herança sempre entre 2 OU mais classes / interfaces. A herança sempre conforma a relação "é-a", enquanto nem sempre é com o polimorfismo (que pode conformar a relação "é-a" / "tem-a").
fonte
A herança é mais uma coisa estática (uma classe se estende a outra), enquanto o polimorfismo é uma coisa de dinâmica / tempo de execução (um objeto se comporta de acordo com seu tipo de dinâmica / tempo de execução e não com seu tipo de declaração / estática).
Por exemplo
-> Embora o tipo estático / de declaração de a seja A, o tipo dinâmico / de tempo de execução real é B e, portanto, a.foo () executará foo conforme definido em B e não em A.
fonte
Polimorfismo é uma abordagem para expressar um comportamento comum entre tipos de objetos que possuem características semelhantes. Ele também permite que variações dessas características sejam criadas por meio de substituição. A herança é uma maneira de obter polimorfismo por meio de uma hierarquia de objetos em que os objetos expressam relacionamentos e comportamentos abstratos. Porém, não é a única maneira de obter polimorfismo. Protótipo é outra maneira de expressar polimorfismo diferente de herança. JavaScript é um exemplo de uma linguagem que usa protótipo. Eu imagino que existem outras maneiras também.
fonte
Herança é um conceito relacionado à reutilização de código. Por exemplo, se eu tiver uma classe pai say
Animal
e ela contiver certos atributos e métodos (neste exemplo, saymakeNoise()
andsleep()
) e eu criar duas classes filho chamadasDog
eCat
. Como cães e gatos dormem da mesma maneira (eu diria), não há necessidade de adicionar mais funcionalidade aosleep()
método nas subclassesDog
e nasCat
subclasses fornecidas pela classe paiAnimal
. No entanto, umDog
latido e umCat
miado, embora oAnimal
A classe pode ter um método para fazer barulho, um cachorro e um gato fazem barulhos diferentes em relação um ao outro e a outros animais. Portanto, é necessário redefinir esse comportamento para seus tipos específicos. Assim, a definição de polimorfismo. Espero que isto ajude.fonte
A documentação da Oracle citou a diferença com precisão.
herança: Uma classe herda campos e métodos de todas as suas superclasses, sejam diretas ou indiretas. Uma subclasse pode substituir os métodos herdados ou ocultar campos ou métodos herdados . (Observe que ocultar campos geralmente é uma prática ruim de programação.)
polimorfismo: polimorfismo refere-se a um princípio em biologia no qual um organismo ou espécie pode ter muitas formas ou estágios diferentes. Esse princípio também pode ser aplicado à programação orientada a objetos e linguagens como a linguagem Java. As subclasses de uma classe podem definir seus próprios comportamentos exclusivos e ainda compartilhar algumas das mesmas funcionalidades da classe pai.
polimorfismo não é aplicável a campos.
Post relacionado:
Polimorfismo vs Substituição vs Sobrecarga
fonte
Polimorfismo é um efeito de herança . Isso só pode acontecer em classes que se estendem. Ele permite que você chame métodos de uma classe sem saber o tipo exato da classe. Além disso, o polimorfismo acontece em tempo de execução .
Por exemplo, exemplo de polimorfismo Java:
A herança permite que classes derivadas compartilhem interfaces e códigos de suas classes base. Isso acontece no momento da compilação .
Por exemplo, todas as classes na plataforma Java são descendentes de objetos (imagem cortesia da Oracle):
Para saber mais sobre herança e polimorfismo Java
fonte
A herança é quando a classe A herda todos os métodos / campos públicos / não estáticos protegidos de todos os seus pais até Obj.
fonte
Se você usa JAVA, é tão simples quanto isto:
O polimorfismo está usando métodos herdados, mas "sobrescrevendo" eles para fazer algo diferente (ou o mesmo se você chamar de super, não seria tecnicamente polimórfico).
Corrija-me se eu estiver errado.
fonte
O principal objetivo do polimorfismo : Criar variável de referência para superclasse e manter o objeto da subclasse => um objeto pode executar vários comportamentos .
Na herança , a subclasse herda as propriedades da superclasse .
fonte
herança é uma espécie de polimorfismo; exatamente, de fato, herança é o polimorfismo dinâmico. Portanto, quando você remove a herança, não pode mais substituir.
fonte
Com Herança, a implementação é definida na superclasse - portanto, o comportamento é herdado.
Com o polimorfismo, a implementação é definida na subclasse - portanto, apenas a interface é herdada.
fonte
O polimorfismo é obtido pela herança em
Java
.Hamster
classe herda a estrutura deAnimal
,Herbivore
ePet
para expor o behaviorismo polimórfica de um animal doméstico.Cat
classe herda a estrutura deAnimal
,Carnivore
ePet
para também apresentam behaviorismo polimórfica de um animal doméstico.fonte