==== 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''.