W przeciwieństwie do polimorfizmu dynamicznego, kompilator dokładnie zdaje sobie sprawę, która metoda zostanie wywołana. Polimorfizm statyczny uzyskujemy poprzez przeciążenie metod (overloading).

Poniżej przykład, gdzie przeciążanie metod nie jest zastosowane.

class IdentityService {
     boolean checkIdentityByPesel(String pesel) {}
     boolean checkIdentityBySurnameAndPin(String surname, String pin) {}
     (...)
}

Wyobraźmy sobie tym razem, że dzwonimy na infolinię, bo chcielibyśmy zmienić w systemie adres zamieszkania. Automat bądź konsultant musi sprawdzić czy my to faktycznie my. Prosi nas w związku z tym np.: o podanie numeru PESEL. Numeru PESEL niestety nie pamiętamy, zatem pytamy czy istnieje inna możliwość potwierdzenia tożsamości. Owszem, można. Proszę podać nazwisko oraz numer PIN, który ustalałeś podczas zakładania konta. Załóżmy, że jakimś cudem pamiętasz, co oczywiście również się nie zdarza i w rzeczywistości musisz w tym momencie iść z dowodem osobistym do oddziału. Ale na szczęście WordPress przyjmie wszystko.

Pani wpisuje Twoje nazwisko oraz numer PIN, a jej system wywołuje odpowiednią metodę o sygnaturze (nazwa metody oraz jej parametry) checkIdentityBySurnameAndPin(String surname, String pin)

Czyli widzimy, że mamy przynajmniej dwie metody o różnych sygnaturach, wykonujące tę samą czynność – czyli potwierdzenie tożsamości. Programista, który będzie pisał kod odpowiedzialny za wygenerowanie odpowiedzi dla konsultanta, który jest właśnie z Tobą na linii wolałby z pewnością, aby była jedna nazwa metody. Byłoby bardziej czytelnie i na pierwszy rzut oka byłoby widać jakie istnieją możliwości potwierdzenia tożsamości.

Wyskrobaliśmy w związku z tym oto taki kod:

Rys. 0 Polimorfizm statyczny

Pisząc serwis jest jakby przyjemniej! IDE nam pomaga.

Jeśli wywołamy metodę checkIdentityBy(String pesel) to kompilator zajrzy do klasy IdentityService i sprawdzi czy istnieje metoda o takiej sygnaturze, to znaczy: metoda o nazwie checkIdentityBy przyjmująca jeden parametr typu String. Maszyna wirtualna ma odpowiednią wiedzę podczas działania aplikacji i dokładnie wie, którą dokładnie ma wywołać.

Innym przykładem polimorfizmu statycznego może być metoda println klasy PrintStream.

System.out.println(5);
System.out.println('a');
System.out.println("test");

Wyobraź sobie jak smutno by było, gdyś musiał wywołać powyższe metody na przykład tak:

System.out.printlnInt(5);
System.out.printlnChar('a');
System.out.printlnString("test");

Podsumowując. Jeśli użyjemy metod o tej samej nazwie lecz o innych parametrach, to możemy mówić o przeciążeniu metod. I w ten oto sposób osiągnęliśmy polimorfizm statyczny, gdzie kompilator jest w stanie powiązać wywołanie metody z konkretnym jej kodem. Jedna nazwa metody – a różne zachowania.

Leave a Reply

Your email address will not be published. Required fields are marked *