Polimorfismo, esta palabra al principio puede sonar algo difícil pero realmente no es asi. El polimorfismo se define como la capacidad de comportarse a un metodo de acuerdo a la instancia creada, para que entiendas te explicare con un ejemplo en la vida cotidiana.

El metodo se comporta de manera diferente dependiendo de la clase con la cual esta interactuando, debido a que cada clase implementa un comportamiento distinto.

Ejemplo:

supongamos que existe un metodo visitante(), este visitante tiene una serie de llamadas. Cuando te marca tu madre o padre te vas a comportar de manera educada al contestar el telefono. Sin embargo, cuando un amigo te marca te comportas de una manera no educada hablando no formal.

Digamos que tu madre y padre conforman una clase Padres y tu amigo esta dentro de una clase Amigos. El metodo visitante() se comporta de manera diferente de acuerdo a la clase referenciada.

Ahora te mostrare otro ejemplo en código para que esto quede mas claro:

package polimorfismo;

public abstract class Operaciones {
    
    protected int num1;
    protected int num2;
    
    public Operaciones() {
        num1 = 10;
        num2 = 5;
    }
    
    public abstract void operaciones();
    
}

La clase operación es nuestra superclase, dentro de ella definimos el metodo operaciones() como abstracto al definir un metodo de esta forma le indicamos que va a tener diferente comportamiento, importante mencionar que no siempre se utiliza abstract para hacer polimorfismo ya que puede estar presente simplemente utilizando herencia y re-escribiendo los metodos.

package polimorfismo;

public class Suma extends Operaciones {

    @Override
    public void operaciones() {
        int suma = num1 + num2;
        System.out.println("suma: " + suma);
    }
    
}

Nuestra clase suma debe heredar de Operaciones, aqui aplicamos la frase «es un«. ¿La suma es un? es una operación lo cual permite heredar de operaciones, cuando nosotros heredamos de esta clase automaticamente el compilador marca error y aparece debido a que en la clase padre se ha definido un metodo abstracto obligando a siempre re-escribir el metodo en nuestra subclase.

Lo explicado anteriormente puede aplicarse a una nueva clase en este caso llamada Multiplicación, podrás observar que sucede lo mismo que la clase Suma.

package polimorfismo;

public class Multiplicacion extends Operaciones {
    
    @Override
    public void operaciones() {
        int multiplicacion = num1 * num2;
        System.out.println("multiplicacion: " + multiplicacion);
    }
    
}

Debemos poner en uso lo creado anteriormente, para ello debemos hacerlo utilizando la claseMainOperaciones y haciendo referencia a las clases creadas:

package polimorfismo;

public class MainOperaciones {
    
    public static void main(String[] args) {
        Operaciones operacion;
        operacion = new Suma(); // aqui se esta aplicando el polimorfismo
        operacion.operaciones(); //operacion suma
        operacion = new Multiplicacion(); //polimorfismo
        operacion.operaciones(); //operacion multiplicacion
    }
    
}

Es importante mencionar que una clase abstracta e interfaz no pueden ser instanciadas. Por este motivo se ha creado una variable operación de tipo Operaciones (me refiero a la clase).

¿Como es posible crear una instancia?

Se puede lograr gracias al polimorfismo, como podrás observar la variable operación se comporta de manera diferente, debido a la referencia realizada con distintas clases.

operacion = new Suma();

La linea anterior le dice al metodo operaciones que va tener un comportamiento para realizar simplemente una suma. La instancia es posible, debido a que una Suma es una Operacion (Suma es de tipo operación porque hereda de esta clase).

operacion = new Multiplicacion();

Ahora se indica a la variable operación que tendra un comportamiento de tipo multiplicación y gracias a esto el metodo operaciones realiza dicha operación.

Como las variables num1 y num2 se han iniciado con valores 10 y 5, al ejecutar el metodo main nos muestra los siguientes resultados:

suma: 15
multiplicacion: 50

Al principio el polimorfismo puede sonar algo complejo, pero mediante practica y entendiendo el porque de las cosas veras lo facil de su implementación.