Sobrecarga de Métodos en Java.
Perfilado de sección
-
Idea Central
La sobrecarga ocurre cuando una clase tiene dos o más métodos con el mismo nombre, pero con diferentes firmas. (Definición de Firma: Es la combinación del nombre del método + la lista de sus parámetros (cantidad, tipo y orden). El tipo de retorno no forma parte de la firm)a.
¿Por qué es útil para un Ingeniero?
Evita crear nombres genéricos y confusos como sumarEnteros(), sumarDoubles(), sumarTresNumeros(). Simplemente usamos sumar() y dejamos que el compilador elija el correcto.
2. Reglas de Oro
Para que el compilador de Java no se confunda, debe cumplirse al menos una de estas condiciones:
- Diferente número de parámetros.
- Diferentes tipos de datos en los parámetros.
- Diferente orden de los tipos de parámetros.
3. Ejemplo Práctico: Clase LiquidacionNomina
Imagina un sistema que calcula el pago de un empleado. El pago puede variar según los bonos o deducciones.
java
public class CalculadoraNomina {
// 1. Pago básico: Solo salario mensual
public double calcularPago(double salarioBase) {
return salarioBase;
}
// 2. Sobrecarga: Salario + un bono fijo
public double calcularPago(double salarioBase, double bono) {
return salarioBase + bono;
}
// 3. Sobrecarga: Salario + bono + porcentaje de deducción (ej. salud/pensión)
public double calcularPago(double salarioBase, double bono, int porcentajeDeduccion) {
double deduccion = salarioBase * (porcentajeDeduccion / 100.0);
return (salarioBase + bono) - deduccion;
}
}
5. Ejercicio de Reto para el Estudiante
Reto: El Buscador de Precios
Crea una clase llamada Catalogo que tenga un método sobrecargado buscarPrecio():- Si se recibe un String (nombre del producto), devuelve el precio de una lista interna.
- Si se recibe un int (código de barras), busca por código.
- Si se recibe un String (nombre) y un boolean (esMayorista), devuelve el precio con un 20% de descuento.
__________________________________________________________________________________________________________
__________________________________________________________________________________________________________
Métodos de Instancia (Instance Methods)
- Asociación: Ligados a una instancia (objeto) particular de la clase.
- Uso: Modifican o acceden al estado específico del objeto (this en Java/C#, self en Python).
- Invocación: Requieren crear primero el objeto: Objeto obj = new Objeto(); obj.metodo();.
- Ejemplo: factura1.calcularIVA().
Métodos Estáticos (Static Methods / Class Methods)
- Asociación: Ligados a la clase, no a instancias. Se crea una sola copia.
- Uso: Operaciones que no dependen del estado de un objeto, ideales para funciones de utilidad o métodos "fábrica".
- Invocación: Se llaman directamente desde la clase: NombreClase.metodo();.
- Restricciones: No pueden acceder a variables o métodos de instancia directamente.
- Ejemplo: Math.sqrt(16) o Utilidades.convertirMoneda().
Diferencias Clave
Característica
Métodos de Instancia
Métodos Estáticos (de Clase)
Requiere Instancia
Sí (new)
No
Acceso al Estado
Sí (a this/self)
No (solo datos estáticos)
Uso principal
Comportamientos específicos del objeto
Funciones de utilidad/auxiliares
Ejemplo (Java)
void setNombre() {}
static void print() {}
Los Getters y Setters en Java
son métodos públicos utilizados para acceder (get) y modificar (set) el valor de atributos privados de una clase, facilitando el encapsulamiento y la protección de datos. Un getter devuelve el valor, mientras que un setter actualiza el valor del atributo.
public class Persona {
// Atributos privados (encapsulamiento)
private String nombre;
private int edad;
// Constructor
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
// Getter para nombre
public String getNombre() {
return nombre;
}
// Setter para nombre
public void setNombre(String nombre) {
this.nombre = nombre;
}
// Getter para edad
public int getEdad() {
return edad;
}
// Setter para edad con validación
public void setEdad(int edad) {
if (edad > 0) {
this.edad = edad;
} else {
System.out.println("La edad no puede ser negativa.");
}
}
}
// Uso de la clase
public class Main {
public static void main(String[] args) {
Persona p = new Persona("Ana", 25);
// Uso de getters
System.out.println(p.getNombre()); // Imprime: Ana
// Uso de setters
p.setNombre("Pedro");
p.setEdad(30);
System.out.println(p.getNombre() + " tiene " + p.getEdad() + " años."); // Pedro tiene 30 años.
}
}
Beneficios y Características:
- Encapsulamiento: Protege las variables de instancia.
- Validación: Los setters pueden validar datos antes de asignarlos (ej. evitar edades negativas).
- Generación Automática: Los IDEs como Eclipse o NetBeans generan estos métodos automáticamente (clic derecho -> "Generate Getters and Setters").
- Convención: Usan la estructura getNombreAtributo() y setNombreAtributo().