Sobrecarga

¿Qué es la sobrecarga de métodos?

👉 Ejemplo de la vida real:


🔹 En nuestro ejemplo Empleado

Queremos calcular el salario:

  • Caso 1: cuando el empleado trabaja horas extra.

  • Caso 2: cuando no trabaja horas extra.

Podríamos obligar siempre a pasar un número, incluso 0. Pero con sobrecarga podemos dar dos formas más limpias:

// Con horas extra
public int calcularSalarioBase(int horaExtra) {
    return salarioBase + (tasaHoraria * horaExtra);
}

// Sin horas extra
public int calcularSalarioBase() {
    return calcularSalarioBase(0); // reusamos el otro método
}

🔹 Clase completa con sobrecarga

public class Empleado {
    private int salarioBase;   // privado
    private int tasaHoraria;   // privado

    // Constructor
    public Empleado(int salarioBase, int tasaHoraria) {
        setSalarioBase(salarioBase);
        setTasaHoraria(tasaHoraria);
    }

    // Método con parámetro
    public int calcularSalarioBase(int horaExtra) {
        return salarioBase + (tasaHoraria * horaExtra);
    }

    // Método sobrecargado (sin parámetro)
    public int calcularSalarioBase() {
        return calcularSalarioBase(0);
    }

    // Setters privados → solo inicializamos desde el constructor
    private void setSalarioBase(int salarioBase) {
        if (salarioBase <= 0)
            throw new IllegalArgumentException("Salario no puede ser menor que 0");
        this.salarioBase = salarioBase;
    }

    private void setTasaHoraria(int tasaHoraria) {
        if (tasaHoraria < 0)
            throw new IllegalArgumentException("La tarifa por hora no puede ser negativa");
        this.tasaHoraria = tasaHoraria;
    }

    // Getters públicos → para leer desde fuera
    public int getSalarioBase() {
        return salarioBase;
    }

    public int getTasaHoraria() {
        return tasaHoraria;
    }

    // Método principal para probar
    public static void main(String[] args) {
        var e = new Empleado(1000, 20);

        // Mostramos usando getters
        System.out.println("Salario base: " + e.getSalarioBase());
        System.out.println("Tarifa por hora: " + e.getTasaHoraria());

        // Calculamos con horas extra
        int conExtras = e.calcularSalarioBase(10);
        System.out.println("Salario con 10 horas extra: " + conExtras);

        // Calculamos sin horas extra (sobrecarga)
        int sinExtras = e.calcularSalarioBase();
        System.out.println("Salario sin horas extra: " + sinExtras);
    }
}

🔹 Resultado en consola

Salario base: 1000
Tarifa por hora: 20
Salario con 10 horas extra: 1200
Salario sin horas extra: 1000

Sobrecarga de métodos 🔁

Comparación ⚖️

Aspecto Sin sobrecarga ❌ Con sobrecarga ✅
Nombre del método calcularSalarioBase(int horaExtra) calcularSalarioBase(int horaExtra)
calcularSalarioBase()
Uso en main e.calcularSalarioBase(0); e.calcularSalarioBase();
Claridad del código Menos legible: hay que pasar 0 explícito Más legible: no pasamos nada si no hay horas extra
Reutilización de lógica Solo una forma de usarlo El método sin parámetros llama al otro y reutiliza la lógica
Flexibilidad Poca: siempre se exige un argumento Alta: el mismo método funciona de dos maneras