W poprzedniej lekcji pisałem o tym jak przesłaniać metody za pomocą dziedziczenia i adnotacji @Override. Teraz dowiesz się, jaka jest różnica między przesłanianiem (ang. override) a przeciążaniem (ang. overload) metody. Nie jest to wbrew pozorom to samo i często przeciążanie metod jest mylnie utożsamiane jako synonim przesłaniania. Przypatrz się klasom Worker i Lawyer.
public class Worker {
private String name;
public void showName() {
System.out.println("Worker name " + name);
}
}Teraz napiszę klasę Lawyer dziedziczącą po Worker.
public class Lawyer extends Worker{
private String name;
public Lawyer(String name) {
this.name = name;
}
@Override
public void showName() {
System.out.println("Lawyer name is " + name);
}
public void workOnCase() {
System.out.print("Work on case number..");
}
public void workOnCase(int caseNumber) {
System.out.println();
workOnCase();
System.out.println(" " + caseNumber);
}
}Przeciążanie metod a ich przesłanianie
Jak widzisz jest tu zastosowane zwykłe dziedziczenie i przesłonienie z użyciem adnotacji override. Nic ciekawe się tu nie dzieje. To teraz zobacz na dodatkowe metody workOnCase bez i z parametrem. Sygnatury są niemal identyczne, jedyną różnicą jest parametr caseNumber występujący w drugim przypadku. Ponad to zamiast duplikować kod z pierwszej metody można go wykorzystać w metodzie drugiej poprzez jej deklarację. Dzięki temu unikasz duplikacji kodu (wyobraź sobie, że masz tysiąc takich metod i się gdzieś pomyliłeś. Taka pomyłka byłaby bardzo czasochłonna.) zgodnie z zasadą: „Don’t repeat yourself„.
public class JobMain {
public static void main(String[] args) {
Lawyer lawyer = new Lawyer("Adam Kowalski");
lawyer.showName();
lawyer.workOnCase();
lawyer.workOnCase(10);
}
}Teraz wywołaj powyższy main() i zobacz na efekty..
Lawyer name is Adam Kowalski Work on case number.. Work on case number.. 10
W podobny sposób można przeciążać konstruktory, dodając im kolejne parametry w sygnaturze.
To wszystko na dziś. Lekcja jest bardzo prosta: To wszystko na dziś. Lekcja jest bardzo prosta: przeciążanie metod powinno kojarzyć Ci się z unikaniem duplikacji kodu w metodach o podobnych sygnaturach, przesłanianie za to używasz, w momencie dziedziczenia lub implementacji interfejsu.
Link do lekcji: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson4
Link do lekcji o przesłanianiu: https://developeronthego.pl/java-srednio-zaawansowane-3-przeslanianie-metod-override/

