– Cześć, Amigo! Opowiem Ci o przeciążaniu metod.

– To można je przeciążać?! O kurka!

Możesz z nimi robić naprawdę wiele rzeczy, ale o tym powiem Ci kiedy indziej.

– Umowa stoi.

– Przeciążanie jest naprawdę prostą operacją. Właściwie, nie jest to nawet operacja na metodach, mimo że czasami jest ona określana pewną przerażającą nazwą: polimorfizm parametryczny.

Musisz pamiętać o tym, że każda metoda w klasie ma swoją unikalną nazwę.

– Tak, wiem.

– To znaczy, nie do końca tak jest. Właściwie, to nie jest tak ani trochę. Metoda wcale nie musi mieć unikalnej nazwy. Unikalna musi być za to kombinacja nazwy metody i typów jej parametrów. Ta kombinacja to inaczej sygnatura metody.

Kod Komentarze
public void print();
public void print2();
To jest dozwolone. Te dwie metody mają swoje unikalne nazwy.
public void print();
public void print(int n);
To też jest dozwolone. Te dwie metody mają swoje unikalne nazwy (sygnatury).
public void print(int n, int n2);
public void print(int n);
Nazwy metod tutaj również są unikalne.
public int print(int a);
public void print(int n);
To już nie jest dozwolone. Te metody nie są unikalne, mimo że zostały przekazane różne typy.
public int print(int a, long b);
public long print(long b, int a);
To natomiast jest dozwolone. Parametry metod są unikalne.

– Już to gdzieś widziałem...

– Jasne. Kiedy wpisujesz "System.out.println", IntelliJ IDEA proponuje kilkadziesiąt różnych wersji metod print, które używają różnych parametrów. Kompilator zwyczajnie identyfikuje, a następnie wywołuje wymaganą metodę w oparciu o typy parametrów, które zostały przekazane.

– To nie takie trudne. Ale to nie jest polimorfizm.

– Wyrażając się bardziej precyzyjnie, nie jest to nadpisywanie metod.

Zwróć także uwagę, że nazwy parametrów są tu bez znaczenia. Zostaną one utracone podczas kompilowania. Kiedy metoda się już skompiluje, to znane są tylko jej nazwa i typy parametrów.