Redefinice a přetížení metody

Proč to potřebuji?

Redefinice a přetížení jsou dva klíčové mechanismy, které umožňují flexibilní návrh metod. Pochopení rozdílu mezi nimi je nezbytné pro správné využití dědičnosti a polymorfismu.

Teorie

Redefinice (overriding) = podtřída přepisuje metodu nadtřídy se STEJNOU signaturou. Označuje se @Override. Rozhoduje se za běhu (runtime) podle skutečného typu objektu.

Přetížení (overloading) = více metod se STEJNÝM jménem, ale RŮZNÝMI parametry v jedné třídě. Rozhoduje se při kompilaci.

Příklady

public class Kalkulacka {
    // === PŘETÍŽENÍ (overloading) – stejný název, různé parametry ===
    public int secti(int a, int b) {
        return a + b;
    }

    public double secti(double a, double b) {
        return a + b;
    }

    public int secti(int a, int b, int c) {
        return a + b + c;
    }
    // Kompilér vybírá metodu podle typů argumentů
}

// === REDEFINICE (overriding) ===
public class Zvire {
    public String zvuk() {
        return "...";
    }
}

public class Pes extends Zvire {
    @Override // redefinice – stejná signatura
    public String zvuk() {
        return "Haf!";
    }
}

public class Kocka extends Zvire {
    @Override
    public String zvuk() {
        return "Mňau!";
    }
}

// Demonstrace
Kalkulacka k = new Kalkulacka();
System.out.println(k.secti(1, 2));       // 3     – int verze
System.out.println(k.secti(1.5, 2.5));   // 4.0   – double verze
System.out.println(k.secti(1, 2, 3));    // 6     – tříparametrová verze

Zvire z = new Pes();       // typ proměnné: Zvire, skutečný typ: Pes
System.out.println(z.zvuk()); // "Haf!" – rozhoduje runtime typ

Shrnutí

Klíčové body

  • Override = stejná signatura, jiná třída (dědičnost), rozhoduje se za BĚHU
  • Overload = stejný název, jiné parametry, stejná třída, rozhoduje se při KOMPILACI
  • @Override anotace pomáhá zachytit chyby (překlep v názvu metody)
  • Nelze přetěžovat jen změnou návratového typu