El polimorfismo es uno de los pilares fundamentales de la Programación Orientada a Objetos (POO). En términos simples, el polimorfismo permite que una entidad, como una variable, una función o un objeto, pueda tomar múltiples formas. En Java, el polimorfismo se puede lograr principalmente a través de la herencia y las interfaces.
Conceptos Clave
-
Polimorfismo en Tiempo de Compilación (Sobrecarga de Métodos):
- Se refiere a la capacidad de definir múltiples métodos con el mismo nombre pero con diferentes parámetros dentro de la misma clase.
- La decisión de qué método se va a ejecutar se toma en tiempo de compilación.
-
Polimorfismo en Tiempo de Ejecución (Sobreescritura de Métodos):
- Se refiere a la capacidad de una subclase para proporcionar una implementación específica de un método que ya está definido en su superclase.
- La decisión de qué método se va a ejecutar se toma en tiempo de ejecución.
Ejemplo Práctico
Sobrecarga de Métodos
class Operacion { // Método para sumar dos números enteros public int sumar(int a, int b) { return a + b; } // Método para sumar tres números enteros public int sumar(int a, int b, int c) { return a + b + c; } // Método para sumar dos números de punto flotante public double sumar(double a, double b) { return a + b; } } public class Main { public static void main(String[] args) { Operacion operacion = new Operacion(); System.out.println("Suma de dos enteros: " + operacion.sumar(5, 10)); System.out.println("Suma de tres enteros: " + operacion.sumar(5, 10, 15)); System.out.println("Suma de dos dobles: " + operacion.sumar(5.5, 10.5)); } }
Sobreescritura de Métodos
class Animal { // Método que será sobrescrito public void hacerSonido() { System.out.println("El animal hace un sonido"); } } class Perro extends Animal { // Sobrescritura del método hacerSonido @Override public void hacerSonido() { System.out.println("El perro ladra"); } } class Gato extends Animal { // Sobrescritura del método hacerSonido @Override public void hacerSonido() { System.out.println("El gato maúlla"); } } public class Main { public static void main(String[] args) { Animal miAnimal = new Animal(); Animal miPerro = new Perro(); Animal miGato = new Gato(); miAnimal.hacerSonido(); // El animal hace un sonido miPerro.hacerSonido(); // El perro ladra miGato.hacerSonido(); // El gato maúlla } }
Ejercicios Prácticos
Ejercicio 1: Sobrecarga de Métodos
Instrucciones: Crea una clase Calculadora
que tenga métodos sobrecargados para multiplicar dos, tres y cuatro números enteros.
Solución:
class Calculadora { public int multiplicar(int a, int b) { return a * b; } public int multiplicar(int a, int b, int c) { return a * b * c; } public int multiplicar(int a, int b, int c, int d) { return a * b * c * d; } } public class Main { public static void main(String[] args) { Calculadora calc = new Calculadora(); System.out.println("Multiplicación de dos números: " + calc.multiplicar(2, 3)); System.out.println("Multiplicación de tres números: " + calc.multiplicar(2, 3, 4)); System.out.println("Multiplicación de cuatro números: " + calc.multiplicar(2, 3, 4, 5)); } }
Ejercicio 2: Sobreescritura de Métodos
Instrucciones: Crea una clase Vehiculo
con un método mover()
. Luego, crea dos subclases Coche
y Bicicleta
que sobrescriban el método mover()
.
Solución:
class Vehiculo { public void mover() { System.out.println("El vehículo se está moviendo"); } } class Coche extends Vehiculo { @Override public void mover() { System.out.println("El coche está conduciendo"); } } class Bicicleta extends Vehiculo { @Override public void mover() { System.out.println("La bicicleta está pedaleando"); } } public class Main { public static void main(String[] args) { Vehiculo miVehiculo = new Vehiculo(); Vehiculo miCoche = new Coche(); Vehiculo miBicicleta = new Bicicleta(); miVehiculo.mover(); // El vehículo se está moviendo miCoche.mover(); // El coche está conduciendo miBicicleta.mover(); // La bicicleta está pedaleando } }
Errores Comunes y Consejos
-
No usar la anotación
@Override
:- Siempre usa la anotación
@Override
cuando sobrescribas un método. Esto ayuda a evitar errores y hace que el código sea más legible.
- Siempre usa la anotación
-
Confundir sobrecarga con sobrescritura:
- Recuerda que la sobrecarga ocurre en la misma clase y se basa en diferentes parámetros, mientras que la sobrescritura ocurre en subclases y se basa en redefinir el comportamiento de un método.
-
No aprovechar el polimorfismo en tiempo de ejecución:
- Usa el polimorfismo en tiempo de ejecución para escribir código más flexible y extensible. Por ejemplo, puedes usar una referencia de tipo
Animal
para almacenar objetos de tipoPerro
oGato
.
- Usa el polimorfismo en tiempo de ejecución para escribir código más flexible y extensible. Por ejemplo, puedes usar una referencia de tipo
Conclusión
El polimorfismo es una característica poderosa de la POO que permite escribir código más flexible y reutilizable. Comprender y aplicar tanto la sobrecarga como la sobrescritura de métodos te permitirá aprovechar al máximo las capacidades de Java. En el próximo tema, exploraremos el concepto de encapsulamiento, otro pilar fundamental de la POO.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection