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
@Overrideanotace pomáhá zachytit chyby (překlep v názvu metody)- Nelze přetěžovat jen změnou návratového typu