El polimorfismo es uno de los cuatro pilares fundamentales de la Programación Orientada a Objetos (POO) junto con la herencia, la encapsulación y la abstracción. En Java, la característica que permite que un método de una subclase pueda sobrescribir un método de su superclase es precisamente el polimorfismo.
El término polimorfismo proviene del griego y significa "muchas formas". Se refiere a la capacidad de un objeto de tomar muchas formas. En la POO, el polimorfismo permite que una misma interfaz represente diferentes formas de una entidad.
En el contexto de Java, el polimorfismo permite que una referencia a una superclase pueda apuntar a un objeto de cualquier de sus subclases, permitiendo así que el mismo método pueda realizar diferentes tareas dependiendo del objeto que lo llame.
En Java, sobrescribir un método es un método concreto del polimorfismo. Esto ocurre cuando una subclase proporciona su propia implementación de un método ya proporcionado por su superclase. Para sobrescribir un método, la subclase debe tener el mismo nombre de método, el mismo tipo de retorno y exactamente la misma lista de parámetros.
Consideremos el siguiente ejemplo. Tenemos una superclase llamada "Animal" con un método llamado "sonido()":
class Animal{
void sonido(){
System.out.println("El animal hace un sonido");
}
}
Ahora, tenemos una subclase "Perro" que sobrescribe el método "sonido()":
class Perro extends Animal{
void sonido(){
System.out.println("El perro ladra");
}
}
Cuando llamamos al método "sonido()" a una referencia de Animal que apunta a un objeto de la clase Perro, el método "sonido()" de la clase Perro es el que se ejecuta.
class Test{
public static void main(String args[]){
Animal miPerro = new Perro();
miPerro.sonido();
}
}
Este código imprimirá "El perro ladra" en lugar de "El animal hace un sonido", demostrando cómo el método en la subclase ha sobrescrito al de la superclase.
El polimorfismo en Java es un poderoso concepto que permite la flexibilidad y la reutilización de código, lo que facilita la programación y ayuda a hacer que el código sea más comprensible y manejable. Sin embargo, hay que tener cuidado al sobrescribir los métodos para asegurar que las subclases mantienen el contrato definido por la superclase.