Según entiendo tanto en Polimorfismo como en Herencia las clases hijas pueden usar los métodos de la clase más genérica (Madre). Entonces ¿Cuál sería la diferencia?
Según entiendo tanto en Polimorfismo como en Herencia las clases hijas pueden usar los métodos de la clase más genérica (Madre). Entonces ¿Cuál sería la diferencia?
¡Hola! Te explico la diferencia entre herencia y polimorfismo en Java de una manera fácil de entender:
Imagina que tienes una familia compuesta por tu abuela, tu madre y tú. Tu abuela es la persona mayor y tiene ciertas características y habilidades, como experiencia y sabiduría, que tu madre y tú no tienes. Tu madre, por su parte, tiene algunas habilidades y características diferentes a las de tu abuela, como ser más activa y tener un trabajo. Y tú, como adolescente, tienes tus propias habilidades y características únicas, como ser bueno en los videojuegos y tener mucha energía.
La herencia en Java funciona de manera similar a como funciona la familia. Puedes pensar en la clase "Abuela" como la clase padre o superclase, que tiene ciertas propiedades y métodos. La clase "Madre" sería la subclase o clase hija que hereda esas propiedades y métodos de la clase padre, pero también puede agregar sus propias propiedades y métodos. Y finalmente, la clase "Tú" sería otra subclase que hereda de la clase madre y puede agregar aún más propiedades y métodos propios.
Por otro lado, el polimorfismo funciona como si tú y tu madre pudieran hacer las mismas cosas, como cocinar o conducir un coche. A pesar de que cada uno tiene habilidades y características únicas, pueden compartir algunas habilidades y comportarse de manera similar en ciertos casos. En Java, esto se logra mediante el uso de interfaces, que definen un conjunto de métodos que varias clases pueden implementar.
En resumen, la herencia en Java es como la relación entre los miembros de una familia que comparten ciertas características, mientras que el polimorfismo es como la capacidad de hacer cosas similares a pesar de tener habilidades y características únicas. Espero que esto te haya ayudado a entender la diferencia entre herencia y polimorfismo en Java.
¡Hola Walter!
Me sumo a la excelente explicación del compañero de más arriba con su analogía para darte ahora una mirada más técnica al respecto;
La Herencia y el Polimorfismo van de la mano. De hecho, el Polimorfismo no puede existir sin la Herencia.
Pero en estricto rigor, ¿Qué es la Herencia? La Herencia es un mecanismo para lograr establecer una relación de jerarquía entre clases que comparten la misma naturaleza.
Te pongo un ejemplo. Supongamos que tenemos las clases Animal, Perro y Gato.
Como Perro y Gato son animales, podemos inferir que hay una relación de jerarquía entre Animal y Perro, y Animal y Gato. Efectivamente, Animal es la clase padre, y perro y gato son sus clases hijas. Entonces, ¿Eso es Herencia? No todavía...
Veamos un ejemplo de la clase Animal:
public class Animal{ // Clase cuyo modificador de acceso es de tipo público
private String nombre; // Atributo global nombre, de tipo String, con modificador de acceso privado, encapsulado
private int edad; // Atributo global edad, de tipo String, con modificador de acceso privado, encapsulado
public Animal(){ // Constructor vacío, para poder instanciar objetos vacíos
}
public Animal(String nombre, int edad){ // Constructor con parámetros, para instanciar objetos con valores
this.nombre = nombre; // La palabra reservada this hace referencia al miembro de la clase, el atributo nombre
this.edad = edad; // La palabra reservada this hace referencia al miembro de la clase, el atributo edad
}
public void emitirSonido(){ // Método que no retorna valores, solo imprime por pantalla el sonido que emite el Animal.
System.out.println("Wrrraaaah!");
}
public String getNombre(){ // Método Getter del nombre, para acceder al atributo desde una clase externa
return this.nombre;
}
public void setNombre(String nombre){ // Método Setter del nombre, para establecer el atributo desde una clase externa
this.nombre = nombre;
}
public int getEdad(){ // Método Getter de la edad, para acceder al atributo desde una clase externa
return this.edad;
}
public void setEdad(int edad){ // Método Setter de la edad, para establecer el atributo desde una clase externa
this.edad = edad;
}
}
Entonces podemos ver que la clase padre, Animal, posee los atributos nombre y edad, porque todos los animales tendrán un nombre y una edad, sin importar qué tipo de animales sean. En realidad, esta clase debería ser una clase abstracta precisamente porque no sabemos qué tipo de Animal va a ser, pero la dejaremos como está por el momento, sin entrar todavía a clases abstractas.
Ahora, veamos un ejemplo de la clase Gato.
public class Gato extends Animal{ // La clase Gato extiende de la clase Animal, aquí se señala la Herencia
private String jugueteFavorito; // Atributo exclusivo de la clase Gato
public Gato(){ // Constructor vacío, para poder instanciar objetos vacíos
super(); // Método super que trae los atributos por Herencia de la clase padre, a esta clase, es decir; Nombre y edad.
}
@Override
public void emitirSonido(){ // Método de la clase Animal, sobre-escrito para esta clase, en lo que se conoce como Polimorfismo
System.out.println("Miau!");
}
public int getJugueteFavorito(){ // Método Getter del juguete favorito, para acceder al atributo desde una clase externa
return this.edad;
}
public void setJugueteFavorito(String jugueteFavorito){ // Método Setter del juguete favorito, para establecer el atributo desde una clase externa
this.edad = edad;
}
Entonces, de la clase Gato podemos inferir varias cosas:
Entonces, ya aclaramos la Herencia y de paso hemos visto el Polimorfismo. El Polimorfismo no es más que un mecanismo que permite que el comportamiento de una clase se vea modificado en otra por tu naturaleza.
Que buenas respuestas, muy claras y le dan mucho sentido a los conceptos. Ambas fueron bastante útiles para aclarar y amarrar bien mis ideas. Además, ahora tengo introducción a conceptos que sé que voy a ver más adelante. Muchas gracias.