Introducción
El polimorfismo permite que objetos de diferentes clases respondan de manera distinta a métodos con el mismo nombre. Es uno de los pilares de la programación orientada a objetos junto con encapsulamiento, herencia y abstracción.
Polimorfismo por Asignación
Un objeto puede referenciar múltiples tipos dentro una jerarquía de herencia o implementación de interfaces.
Auto autoCarga = new Carga("Blanco", "Mercedez", new Patente("ARG-32165", true), 2, "321D65463DDD", "GRUA", 9.7F, 8);
Polimorfismo por Sobrecarga
Se definen varios métodos con el mismo nombre pero diferentes parámetros.
public static void sumar(int a, int b) {
System.out.println("El resultado de los enteros es: " + (a + b));
}
public static void sumar(long a, long b) {
System.out.println("El resultado de los enteros largos es: " + (a + b));
}
public static void main(String[] args) {
sumar(1, 2);
sumar(81, 281);
}
Polimorfismo por Sobreescritura
Un objeto declarado como clase padre puede instanciarse como clase hija y llamar métodos sobreescritos.
Auto autoCarga;
autoCarga = new Carga(...);
autoCarga.lavar(new Date(), MantenimientoPeriodico.LAVADO_PRESION);
autoCarga = new Familiar(...);
autoCarga.lavar(new Date(), MantenimientoPeriodico.LAVADO_TUNEL);
Polimorfismo sin Redefinición
Clases no relacionadas jerárquicamente pueden implementar métodos con la misma firma pero comportamientos distintos.
public final class Patente {
public void vender() {
System.out.println("Patente vendida (" + this + ")");
}
}
public class Familiar extends Auto {
@Override
public void vender() {
System.out.println("Familiar vendido " + this + ")");
}
}
Ejemplo con println(Object)
El método println acepta cualquier objeto porque recibe un Object, permitiendo polimorfismo implícito.
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
Casteo de Objetos
Se puede convertir un objeto de tipo padre a tipo hijo si pertenecen a la misma jerarquía.
Auto autoCarga = new Familiar(...);
Familiar autoFamiliar3 = (Familiar) autoCarga;