Conceptos de Polimorfismo
El polimorfismo es la capacidad que posee un objeto de adoptar múltiples formas. En el desarrollo con Java, esto se traduce en la posibilidad de que una misma interfaz o clase base represente diferentes tipos de implementaciones subyacentes, permitiendo que un solo nombre de método ejecute comportamientos distintos según el objeto que lo invoque.
Ventajas de la implementación polimórfica
- Desacoplamiento: Minimiza las dependencias entre componentes, facilitando que el sistema sea más modular.
- Extensibilidad: Permite integrar nuevas funcionalidades o clases sin alterar el código fuente existente.
- Abstracción: Facilita el manejo de colecciones de objetos heterogéneos bajo un tipo común.
Categorías del Polimorfismo
En el ecosistema de Java, el polimorfismo se manifiesta de varias maneras:
- Sobrecarga (Overloading): Polimorfismo en tiempo de compilación donde métodos con el mismo nombre poseen firmas diefrentes.
- Sobrescritura (Overriding): Polimorfismo en tiempo de ejecución donde una subclase redefine el comportamiento de un método de su superclase.
- Polimorfismo de Interfaz: Diversas clases que implementan un contrato común pero con lógicas internas divergentes.
Mecanismo de Funcionamiento
Este concepto se apoya en el enlace dinámico. Durante la ejecución, la Máquina Virtual de Java (JVM) determina la implementación específica del método basándose en la instancia real del objeto, no en el tipo de la referencia.
// Definición de una clase abstracta para la gestión de pagos
abstract class MetodoPago {
abstract void ejecutarTransaccion(double cantidad);
}
// Implementación específica para tarjetas
class TarjetaBancaria extends MetodoPago {
@Override
void ejecutarTransaccion(double cantidad) {
System.out.println("Procesando pago de $" + cantidad + " mediante Tarjeta de Crédito.");
}
}
// Implementación específica para monederos electrónicos
class BilleteraDigital extends MetodoPago {
@Override
void ejecutarTransaccion(double cantidad) {
System.out.println("Transfiriendo $" + cantidad + " desde Billetera Digital.");
}
}
public class SistemaPagos {
public static void main(String[] args) {
// Uso de polimorfismo: Referencia de tipo base, objeto de tipo derivado
MetodoPago servicio;
servicio = new TarjetaBancaria();
servicio.ejecutarTransaccion(150.0); // Salida: Procesando pago mediante Tarjeta...
servicio = new BilleteraDigital();
servicio.ejecutarTransaccion(75.5); // Salida: Transfiriendo desde Billetera...
}
}
Clases Esenciales de la API de Java
Clase System
La clase System proporciona acceso a recursos del sistema operativo de manera independiente a la plataforma. Entre sus utilidades destacan:
System.out: Flujo de salida estándar para impresión de datos.System.currentTimeMillis(): Obtiene la hora actual en milisegundos.System.arraycopy(): Método eficiente para clonar o mover fragmentos de arreglos.
Clase Runtime
Cada aplicación Java tiene una única instancia de la clase Runtime que permite interactuar con el entorno de ejecución:
Runtime.getRuntime(): Acceso a la instancia actual del entorno.freeMemory(): Indica la cantidad de memoria libre en la JVM.gc(): Sugiere al recolector de basura que realice su labor.
Manipulación de Cadenas: Clase String
Los objetos String son inmutables en Java. Para optimizar el uso de memoria, Java utiliza el String Constant Pool (Reserva de Constantes de Cadena).
Métodos de uso frecuente:
length(): Devuelve la extensión de la cadena.equals(): Compara el contenido de dos cadenas por valor.contains(CharSequence s): Verifica si un segmento existe dentro del texto.split(String regex): Segmenta la cadena basándose en un patrón.
StringBuilder y StringBuffer
Cuando se requiere modificar texto frecuentemente, se utilizan estas clases para evitar la creación excesiva de objetos String:
- StringBuilder: Recomendado para entornos de un solo hilo debido a su alto rendimiento.
- StringBuffer: Versión sincronizada y segura para hilos (Thread-safe).
Gestión de Fechas y Tiempo
Java ofrece herramientas para el manejo temporla:
- Date: Representa un instante específico de tiempo.
- SimpleDateFormat: Facilita la conversión entre objetos de fecha y representaciones de texto con formatos personalizados.
- Calendar: Clase abstracta para manipular campos de fecha como meses, años o semanas de forma flexible.
Funciones Matemáticas: Clase Math
La clase Math cnotiene métodos estáticos para operaciones numéricas avanzadas:
Math.max(a, b): Retorna el valor más alto entre dos argumentos.Math.random(): Genera un valor pseudoaleatorio entre 0.0 y 1.0.Math.ceil(d): Redondea hacia arriba al entero más cercano.
Clases Envolventes (Wrapper Classes)
Las clases envolventes permiten tratar los tipos de datos primitivos como si fueran objetos, facilitando su uso en estructuras como las colecciones de Java (Collections Framework).
- Autoboxing: Conversión automática de un primitivo a su clase envolvente (ej. de
intaInteger). - Unboxing: Extracción automática del valor primitivo desde un objeto envolvente.
// Ejemplo de Autoboxing y Unboxing
Double precioObjeto = 99.99; // Autoboxing
double precioPrimitivo = precioObjeto; // Unboxing
List<Integer> listaNumeros = new ArrayList<>();
listaNumeros.add(10); // Autoboxing dentro de una colección