Polimorfismo en métodos sobrescritos

El polimorfismo es un concepto importante de la programación orientada a objetos (POO) que nos dice que podemos implementar clases que compartan una lógica en común. Esto está muy asociado a la herencia, que es otro concepto de la POO, que nos permite estructurar esquemas de jerarquía en la implementación de nuestros aplicaciones en Java.

Como parte del examen de certificación OCPJP de Oracle, el polimorfismo y herencia son dos de los temas que más repeticiones tienen a lo largo de dicho examen. En este artículo vamos a tratar acerca de las clásicas preguntas de polimorfismo en métodos sobrescritos.

Supongamos que tenemos el siguiente escenario:
package com.rolandopalermo.test01;

class Vehiculo {
 
 public void imprimirSonido() {
  System.out.println("Vehiculo");
 }
 
 public void frenar() {
  System.out.println("frenar");
 }
}

class Carro extends Vehiculo {
 
 public void imprimirSonido() {
  System.out.println("Carro");
 }

 public void abrirPuerta() {
  System.out.println("Puerta abierta");
 }
}

public class Test {
 
 public static void main(String[] args) {
  Vehiculo v = new Carro();
  Carro c = new Carro();
  v.imprimirSonido();
  c.imprimirSonido();
  // --
  v.abrirPuerta();
  c.abrirPuerta();
  //--
  v.frenar();
  c.frenar();
 }
}
No hay necesidad de memorizar nada para poder entender lo que realmente pasa a nivel de la JVM pues podemos hacer un seguimiento a lo que sucede en el método main para poder determinar el resultado. Empezemos:

1.- En primer lugar creamos un objeto de la clase Vehículo en memoria.
Vehiculo v

2.- Al instanciar el objeto v, se toman en cuenta sólo los métodos que están presentes en ambas clases; en este caso void imprimirSonido(). Ahora surge la pregunta: Si ambos tienen el mismo método con diferentes implementaciones - ¿cuál es ellas es la que será tomada? La respuesta es la siguiente: En caso la clase hija haya sobrescrito el método, será éste el que se utilice para el objeto instanciado. La siguiente imagen ilustra esto.
Vehiculo v = new Carro();

Con esto, el objeto resultante v quedaría de la siguiente manera:


Lo cual nos permite rápidamente identificar que el código mostrado al inicio del artículo no se ejecutará pues el objeto v no posee el método abrirPuerta. Ahora, ejecutando este nuevo main - ¿cuál creen que sea la salida?
public static void main(String[] args) {
 Vehiculo v = new Carro();
 Carro c = new Carro();
 v.imprimirSonido();
 c.imprimirSonido();
 // --
 c.abrirPuerta();
 //--
 v.frenar();
 c.frenar();
}
Exacto, de seguro que su respuesta es igual a esta:


Esperando que este artículo les haya aclarado un poco más lo relacionado al polimorfismo y la herencia, me despido hasta una próxima oportunidad. Saludos.

Comentarios

  1. hola mi estimado, sigo tus publicaciones, dime vale la pena hacer un diplomado en java?? o no, esos que duran 1 año y muchas gracias por tu respuesta

    ResponderBorrar

Publicar un comentario