Hoy me presentaron esta pregunta en un examen de libro abierto al final del módulo y me encontré perdido. Estaba leyendo Head first Java
y ambas definiciones parecían ser exactamente las mismas. Me preguntaba cuál era la diferencia PRINCIPAL para mi propia mentalidad. Sé que hay varias preguntas similares a esto, pero no he visto ninguna que proporcione una respuesta definitiva.
java
oop
inheritance
polymorphism
Darren Burgess
fuente
fuente
Respuestas:
La herencia es cuando una 'clase' deriva de una 'clase' existente. Entonces, si tiene una
Person
clase, entonces tiene unaStudent
clase que se extiendePerson
,Student
hereda todas las cosas quePerson
tiene. Hay algunos detalles sobre los modificadores de acceso que pones en los campos / métodos en Persona, pero esa es la idea básica. Por ejemplo, si tiene un campo privado activadoPerson
,Student
no lo verá porque sus campos privados y privados no son visibles para las subclases.El polimorfismo se ocupa de cómo el programa decide qué métodos debe usar, según el tipo de cosa que tenga. Si tiene un
Person
, que tiene unread
método, y tiene unoStudent
que se extiendePerson
, que tiene su propia implementaciónread
, el método de ejecución determina el método al que llama, dependiendo de si tiene aPerson
o aStudent
. Se pone un poco complicado, pero si haces algo comose llama al método de lectura en Student . Eso es el polimorfismo en acción. Puede hacer esa tarea porque a
Student
es aPerson
, pero el tiempo de ejecución es lo suficientemente inteligente como para saber que el tipo realp
es Student .Tenga en cuenta que los detalles difieren entre los idiomas. Puede hacer herencia en JavaScript, por ejemplo, pero es completamente diferente de la forma en que funciona en Java.
fuente
Person
elread
método está usando un modificador de acceso público, ¿no podrán losStudent
objetos acceder a ellos? y entoncesStudent s = new Student();
no será más fácil? Todavía no obtengo los beneficios del polimorfismo.Person p = new Student();
lugar deStudent p = new Student();
?La herencia se refiere al uso de la estructura y el comportamiento de una superclase en una subclase.
El polimorfismo se refiere a cambiar el comportamiento de una superclase en la subclase.
fuente
m
(ambosstatic
yinstance
) de la superclase para la cual ..." (seguido de detalles sobre la herencia). Suena como "reutilización de código" para mí.import static
para eliminar este mal uso de las interfaces.) Para el polimorfismo puro en Java, la herramienta a utilizar es interfaces, no herencia de clase.Polimorfismo : la capacidad de tratar objetos de diferentes tipos de manera similar. Ejemplo: la jirafa y el cocodrilo son animales, y los animales pueden
Move
. Si tiene una instancia de unAnimal
, puede llamarMove
sin saber o preocuparse de qué tipo de animal es.Herencia : esta es una forma de lograr tanto el polimorfismo como la reutilización de código al mismo tiempo.
Otras formas de polimorfismo : hay otra forma de lograr el polimorfismo, como las interfaces, que solo proporcionan polimorfismo pero no reutilizan el código (a veces, el código es bastante diferente, por ejemplo,
Move
para una Serpiente sería muy diferente deMove
para un Perro, en cuyo caso Una interfaz sería la mejor opción polimórfica en este caso.En otros lenguajes dinámicos, se puede lograr el polimorfismo con Duck Typing, que es que las clases ni siquiera necesitan compartir la misma clase base o interfaz, solo necesitan un método con el mismo nombre. O incluso más dinámico como Javascript, ni siquiera necesita clases, solo un objeto con el mismo nombre de método puede usarse polimórficamente.
fuente
La principal diferencia es que el polimorfismo es un resultado específico de la herencia. El polimorfismo es donde el método a invocar se determina en tiempo de ejecución en función del tipo de objeto. Esta es una situación que se produce cuando una clase hereda de otra y anula un método en particular. Sin embargo, en un árbol de herencia normal, no tiene que anular ningún método y, por lo tanto, no todas las llamadas a métodos deben ser polimórficas. ¿Tiene sentido? Es un problema similar a todos los vehículos Ford que son automóviles, pero no todos los automóviles son Ford (aunque no del todo ...).
Además, el polimorfismo se ocupa de la invocación de métodos, mientras que la herencia también describe miembros de datos, etc.
fuente
En Java, los dos están estrechamente relacionados. Esto se debe a que Java utiliza una técnica para invocar métodos llamada "despacho dinámico". Si tengo
Entonces vemos que hereda B
spin
de A. Sin embargo, cuando tratamos de manipular el objeto como si se tratara de un tipo A, todavía nos llegan comportamiento de B paradraw
. Eldraw
comportamiento es polimórfico.En algunos idiomas, el polimorfismo y la herencia no están tan estrechamente relacionados. En C ++, por ejemplo, las funciones no declaradas virtuales se heredan, pero no se enviarán dinámicamente, por lo que no obtendrá ese comportamiento polimórfico incluso cuando use la herencia.
En javascript, todas las llamadas a funciones se envían dinámicamente y tiene una escritura débil. Esto significa que podría tener un montón de objetos no relacionados, cada uno con los suyos
draw
, tener una función iterar sobre ellos y llamar a la función, y cada uno se comportaría bien. Tendría su propio dibujo polimórfico sin necesidad de herencia.fuente
Polimorfismo: suponga que trabaja para una empresa que vende bolígrafos. Así que haces una clase muy agradable llamada "Bolígrafo" que maneja todo lo que necesitas saber sobre un bolígrafo. Usted escribe todo tipo de clases para facturación, envío, creación de facturas, todo utilizando la clase Pluma. Un día llega el jefe y dice: "¡Buenas noticias! ¡La compañía está creciendo y ahora estamos vendiendo libros y CD!" No son buenas noticias porque ahora tienes que cambiar cada clase que usa Pen para usar también Book & CD. Pero, ¿qué pasaría si originalmente hubiera creado una interfaz llamada "SellableProduct" y Pen implementara esta interfaz? Entonces podría haber escrito todas sus clases de envío, facturación, etc. para usar esa interfaz en lugar de Pen. Ahora todo lo que tendría que hacer es crear una nueva clase llamada Book & CompactDisc que implemente la interfaz SellableProduct. ¡Debido al polimorfismo, todas las otras clases podrían continuar trabajando sin cambios! ¿Tener sentido?
Entonces, significa usar Herencia, que es una de las formas de lograr el polimorfismo.
El polimorfismo puede ser posible en una clase / interfaz pero la herencia siempre entre 2 o más clases / interfaces. La herencia siempre conforma la relación "es-a" mientras que no siempre es con el polimorfismo (que puede conformar ambas relaciones "es-a" / "tiene-a".
fuente
La herencia es más una cosa estática (una clase se extiende a otra) mientras que el polimorfismo es una cosa dinámica / tiempo de ejecución (un objeto se comporta de acuerdo con su tipo dinámico / tiempo de ejecución no a su tipo estático / declaración).
P.ej
-> Aunque el tipo estático / declaración de a es A, el tipo dinámico / tiempo de ejecución real es B y, por lo tanto, a.foo () ejecutará foo como se define en B y no en A.
fuente
El polimorfismo es un enfoque para expresar un comportamiento común entre tipos de objetos que tienen rasgos similares. También permite que se creen variaciones de esos rasgos mediante la anulación. La herencia es una forma de lograr el polimorfismo a través de una jerarquía de objetos donde los objetos expresan relaciones y comportamientos abstractos. Sin embargo, no es la única forma de lograr el polimorfismo. El prototipo es otra forma de expresar el polimorfismo que es diferente de la herencia. JavaScript es un ejemplo de un lenguaje que usa prototipos. Me imagino que también hay otras formas.
fuente
La herencia es un concepto relacionado con la reutilización de código. Por ejemplo, si tengo una clase principal, digamos,
Animal
y contiene ciertos atributos y métodos (para este ejemplo, dimakeNoise()
ysleep()
) y creo dos clases secundarias llamadasDog
yCat
. Dado que tanto los perros como los gatos se duermen de la misma manera (supongo) no hay necesidad de agregar más funcionalidad alsleep()
método en las subclasesDog
yCat
proporcionadas por la clase principalAnimal
. Sin embargo, unDog
ladrido y una clase pueden tener un método para hacer ruido, un perro y un gato hacen ruidos diferentes entre sí y con otros animales. Por lo tanto, existe la necesidad de redefinir ese comportamiento para sus tipos específicos. De ahí la definición de polimorfismo. Espero que esto ayude.Cat
maúlla, aunque elAnimal
fuente
La documentación de Oracle cita la diferencia con precisión.
herencia: una clase hereda campos y métodos de todas sus superclases, ya sean directas o indirectas. Una subclase puede anular los métodos que hereda o puede ocultar los campos o métodos que hereda . (Tenga en cuenta que ocultar campos es generalmente una mala práctica de programación).
polimorfismo: el polimorfismo se refiere a un principio en biología en el que un organismo o especie puede tener muchas formas o etapas diferentes. Este principio también se puede aplicar a la programación orientada a objetos y lenguajes como el lenguaje Java. Las subclases de una clase pueden definir sus propios comportamientos únicos y, sin embargo, compartir parte de la misma funcionalidad de la clase principal.
el polimorfismo no es aplicable para campos.
Publicación relacionada:
Polimorfismo vs anulación vs sobrecarga
fuente
El polimorfismo es un efecto de la herencia . Solo puede suceder en clases que se extienden entre sí. Le permite llamar a métodos de una clase sin saber el tipo exacto de la clase. Además, el polimorfismo ocurre en tiempo de ejecución .
Por ejemplo, ejemplo de polimorfismo de Java:
La herencia permite que las clases derivadas compartan interfaces y códigos de sus clases base. Sucede en tiempo de compilación .
Por ejemplo, todas las clases en la plataforma Java son descendientes de objetos (imagen cortesía de Oracle):
Para obtener más información sobre la herencia de Java y el polimorfismo de Java
fuente
La herencia es cuando la clase A hereda todos los métodos / campos públicos / protegidos no estáticos de todos sus padres hasta Object.
fuente
Si usa JAVA es tan simple como esto:
El polimorfismo está utilizando métodos heredados, pero "anularlos" para hacer algo diferente (o lo mismo si lo llamas super, técnicamente no sería polimórfico).
Corrígeme si me equivoco.
fuente
El objetivo principal del polimorfismo : crear una variable de referencia para la superclase y mantener la subclase object => un objeto puede realizar múltiples comportamientos .
En herencia , la subclase hereda las propiedades de la superclase .
fuente
La herencia es una especie de polimorfismo. De hecho, la herencia es el polimorfismo dinámico. Entonces, cuando eliminas la herencia, ya no puedes anularla.
fuente
Con Herencia, la implementación se define en la superclase, por lo que el comportamiento se hereda.
Con Polymorphism, la implementación se define en la subclase, por lo que solo se hereda la interfaz .
fuente
El polimorfismo se logra por herencia en
Java
.Hamster
clase hereda la estructura deAnimal
,Herbivore
yPet
exhibir el conductismo polimórfica de una mascota doméstica.Cat
clase hereda la estructura deAnimal
,Carnivore
yPet
que también exhiben conductismo polimórfica de una mascota doméstica.fuente