Solucionado (ver solución)
Solucionado
(ver solución)
3
respuestas

¿Cuál es la diferencia entre Polimorfismo y Herencia?

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?

3 respuestas

¡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.

solución!

¡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:

  • La clase Gato es clase Hija de la clase Animal. Podemos ver esto porque en la firma de la clase la palabra reservada extends acompaña a la clase Animal.
  • Los atributos nombre y edad de la clase Animal se heredan a la clase hija a través del constructor, a través del método super().
  • El método emitirSonido se sobre-escribe en esta clase para que en vez de imprimir "Wrrraaaah" como un animal genérico, esta vez imprimir "Miau" como lo haría un Gato. Esto es Polimorfismo.

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.