Ir al contenido principal

Polimorfismo

Prácticamente todos los objetos en Java (excepto aquellos tipo Object) tienen formas múltiples debido a que todas las clases en Java heredan de la clase Object. El polimorfismo recae particularmente en la relación IS-A (es-un) que existe entre 2 o más objetos, veamos un poco acerca de este tipo de relación.

La relación IS-A entre objetos::

En la programación orientada a objetos el concepto IS-A (es-un) está basado en la herencia de una clase o implementación de una interfaz. Es una manera de decir "esta cosa es un tipo de esta otra". P. ej., un Tsuru es un Carro y un carro a su vez es un Vehiculo. En Java la relación IS-A se expresa por medio de la palabra extends (cuando hablamos de clases) e implements (cuando hablamos de interfaces).

class Vehiculo{
//cosas de un vehiculo
}

class Carro extends Vehiculo{
//codigo de carro además de cosas
//heredadas del Vehiculo
}

class Tsuru extends Carro{
//cosas específicas de un Tsuru además de
//cosas heredadas de la clase Carro
}

En programación orientada a objetos podemos decir en base a lo anterior que:

- Vehiculo es la superclase de Carro
- Carro es una subclase de Vehiculo
- Carro es la superclase de Tsuru
- Tsuru es una subclase de Vehiculo
- Carro hereda de Vehiculo
- Tsuru hereda tanto de Vehiculo como de Carro
- Tsuru es un derivado de Carro
- Carro es un derivado de Vehiculo
- Tsuru es un derivado de Vehiculo
- Tsuru es un subtipo de Carro y Vehiculo

Regresando a la relación IS-A:

- "Carro extends Vehiculo" significa "Carro es un (IS-A) Vehiculo"
- "Tsuru extends Carro" significa "Tsuru es un (IS-A) Carro"

Si seguimos el árbol de herencia podemos deducir a su vez que "Tsuru es un (IS-A) Vehiculo". Ahora tenemos un solo objeto que tiene muchas formas, el Tsuru es un Tsuru(valga la redundancia), un Carro y un Vehiculo, además en Java es también un objeto tipo Object ya que toda clase hereda de la clase Object, a esto es lo que llamamos polimorfismo.

Polimorfismo::

Todo objeto que puede pasar más de una vez una prueba IS-A es considerado polimórfico, es decir, tiene muchas formas. Recordemos que la única manera de acceder a un objeto es a través de una variable de referencia, analicemos algunas características básicas de este tipo de variables:

+ Una variable de referencia solo puede ser de un tipo, una vez declarada, dicho tipo no puede cambiar pero sí el objeto hacia el cual refiere.
+ Una referencia es variable, por lo tanto, esta puede ser reasignada a otros objetos (a menos de que la variable sea marcada como final).
+ Una variable de referencia puede referir a cualquier objeto del mismo tipo declarado en la referencia o puede referir a cualquier subtipo del tipo declarado.
+ Una variable de referencia puede ser declarada de tipo clase o interfaz, si la variable es de tipo interfaz, puede referenciar a cualquier objeto que implemente dicha interfaz.

Un ejemplo basado en lo anterior:

class Vehiculo{
//Funcion predeterminada de un Vehiculo
}

class Carro extends Vehiculo{
//Funcion predeterminada de un Carro
//así como cosas heredadas de un Vehiculo
}

public class Tsuru extends Carro{

public Tsuru() {
}

public static void main(String[] args){
Vehiculo vh = new Carro();
Carro ct = new Tsuru();
Vehiculo vt = new Tsuru();

System.out.println(vh.toString());
System.out.println(ct.toString());
System.out.println(vt.toString());
}

}

Al ejecutar lo anterior obtendremos algo parecido a:

Carro@1d9dc39
Tsuru@93dcd
Tsuru@b89838

De igual manera sucede si implementamos el polimorfismo con interfaces:

interface Rodable{
//métodos de la interfaz Rodable
}

class Vehiculo{
//Funcion predeterminada de un Vehiculo
}

class Carro extends Vehiculo implements Rodable{
//Funcion predeterminada de un Carro
//así como cosas heredadas de un Vehiculo
}

public class Tsuru extends Carro{

public Tsuru() {
}

public static void main(String[] args){
Rodable rd1 = new Carro();
Rodable rd2 = new Tsuru();

System.out.println(rd1.toString());
System.out.println(rd2.toString());

}

}

Al ejecutar lo anterior obtenemos algo así:

Carro@93dcd
Tsuru@b89838

En el ejemplo anterior no podemos utilizar una referencia a un objeto tipo Vehiculo para una variable de tipo Rodable ya que Vehiculo no implementa dicha interfaz, si lo hacemos obtendremos un error indicando que existen tipos incompatibles en el código.

Es todo lo que veremos sobre polimorfismo. ¿Alguna duda? deja tu comentario.

Más sobre programación en Java aquí.

Comentarios

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.