==== Přetížení vs přepsání (overloading vs overriding) ====
Zdánlivě podobné, avšak zcela rozdílné koncepty, které si nesmíte plést.
=== Přetížení ===
Přetížení (angl. //overloading//) je případ, kdy jedna třída obsahuje více metod se stejným jménem, ale **různou signaturou**. Příklad:
class Printer {
public void print(String string) {
System.out.println(string);
}
public void print(int integer) {
System.out.println(integer);
}
}
Třída obsahuje dvě metody. Obě se jmenují ''print'', nicméně jedna z nich bere argument typu ''String'' a druhá argument typu ''int''. O metodě ''print'' řekneme, že je přetížená. Ve cvičení jsme se s přetížením setkali na samém závěru u třídy ''BasicService'', která měla 3 varianty metody ''accept''.
=== Přepsání ===
Přepsání (angl. //overriding//) je případ, kdy třída A má nějakou metodu a třída B, která je potomkem třídy A, definuje vlastní implementaci této metody, neboli ji přepisuje. Při volání takové metody na objektu deklarovaného jako typ A se až v momentě volání zvolí, zda-li se volá metoda třídy A (pokud objekt je skutečně typu A), nebo metoda třídy B (pokud objekt je skutečně typu B). Příklad:
class Printer {
public void print(String string) {
System.out.println(string);
}
}
class VerbosePrinter extends Printer {
@Override
public void print(String string) {
System.out.println("I am now printing the following string: \"" + string + "\"");
}
}
Třídou "A" je zde třída ''Printer'', třídou "B" je zde třída ''VerbosePrinter'', přepisovanou (a jedinou) metodou je zde metoda ''print''.