Aportación Java México - PCJ - Polimorfismo

Pues bien, en este post voy a mostrar un ejemplo de cómo implementar el polimorfismo, ya que considero que es un tema relevante a la hora de programar, y la razón es que es muy importante el no solo dominar el lenguaje sino también el concepto de lo que es la POO.

Pero que es el polimorfismo. Una definición seria: La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Según la Wikipedia, polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta; con esta definición también haremos referencia al encapsulamiento, ya que el polimorfismo como tal también involucra de cierta manera este concepto, y esque cuando alguien te dice como lograr el encapsulamiento hace referencia a poner métodos privados y solo alguno getter para obtener datos de una clase pero en este ejemplo veremos de la misma manera que el manejo del polimorfismo como es que se da el encapsulamiento de una manera mas clara y tratando de explotar dicha definición.

Ahora veamos el siguiente escenario:

Propongo el siguiente escenario (muy genérico para demostrar lo comentado el polimorfismo).

Tenemos una clase la cual llamaremos Transporte con un método llamado avanzar de esta manera:

public class Transporte {
       
        public void avanzar() {
                System.out.println("Estoy avanzando, soy un transporte");
        }

        public void mostrarVelocidad() {
               
        }
}

Ahora haremos 2 clases mas que heredaran de transporte y sobrescribirán el método avanzar() de esta manera:

La clase auto:

public class Auto extends Transporte{
       
        public Auto() {
        }
       
        public void avanzar() {
                System.out.println("Estoy avanzando como auto");
        }
}

Y la clase Bicicleta:

public class Bicicleta extends Transporte{

        public Bicicleta() {   
        }
       
        public void avanzar() {
                System.out.println("Estoy avanzando como bicicleta");
        }
}

Como vemos en el ejemplo, tenemos una clase Transporte que jerárquicamente esta sobre Auto y Bicicleta, porque ambos son transportes, pero en nuestra clase Transporte que es la que jerárquicamente esta sobre las otras puede definir comportamientos que podrían tener todas las clases que hereden de esta, sin embargo la clase hija pueden tener comportamientos que no necesariamente pueden tener las demás clases.

Ahora, veamos como implementar el polimorfismo. Crearemos una clase nueva desde la cual vamos a crear el trasporte que vamos a utilizar, lo haremos de esta manera:

public class MiTransporte {

        public static void main(String a[]) {
                Bicicleta miBici;
                Transporte tr;
               
                miBici = new Bicicleta();
               
                tr = (Transporte)miBici;
                tr.avanzar();
        }
}

¿Que mensaje creen que va a mostrar a la hora de compilar nuestro programa si estamos usando el método avanzar de una instancia de la clase Transporte?

Posiblemente pensemos que al hacer el casting a la clase Transporte el mensaje que se mostraría seria el de dicha clase, es decir “Estoy avanzando, soy un transporte”, seria algo lógico, pero aquí es donde entra el concepto de polimorfismo. Un “algo” que puede actuar de diferentes formas, “muchas formas” y lo vemos con este ejemplo, la clase Transporte esta actuando de 2 formas distintas, una como Auto y también como bicicleta. En este caso muestra el mensaje “Estoy avanzando como bicicleta”.

Si en la clase MiTransporte ponemos el sig. código:

miAuto = new Auto();
               
tr = (Transporte)miAuto;
tr.avanzar();

el mensaje seria “Estoy avanzando como auto”.

¿Como funciona?
Al crear el objeto Bicicleta lo asignamos a la clase Transporte, pero estamos asignando la “referencia” del objeto Bicicleta, de esta manera puede actuar como objeto Transporte y bicicleta, es un objeto Polimorfico.

Y que pasa si vamos creando mas objetos que sean de tipo transporte, como un camión, un avión, etc. Todos tendrían el mismo comportamiento, la clase transporte podría actuar como avión, o como auto, o como bicicleta, etc.

Aquí es donde entra el concepto de encapsulamiento, si ven nuestra clase Transporte nunca va a cambiar, podemos agregar N clases que tengan un comportamiento definido, pero la clase Transporte siempre será la misma, esta cerrada al cambio, esta “encapsulada”.

Espero les sea de utilidad. Alguna Duda??
Autor: @robertorb21

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

PCJ

Gracias por esta aportación. Si bien el tema es algo básico y de hecho es algo que se trata en las primeras sesiones del curso en PCJ, puede servir para la gente que está aprendiendo apenas los conceptos y siempre es bueno tener una explicación más.

Imagen de Jhanno

Ganador Lugar PCJ

Queremos anunciarte que eres uno de los seleccionados para ser alumno en PCJ. Felicidades.