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/