"Szia Amigo! Pár napja beszéltem neked a túlterhelési módszerekről. Mindent megértettél?"

"Igen. Emlékszem. Minden osztálymetódusnak egyedinek kell lennie. A tagmetódus akkor egyedi, ha az osztálynak nincs másik, azonos nevű és paramétertípusú metódusa (és a paraméterek sorrendje számít)."

"Nagyon jó! Látom jól megtanultad ezt a leckét. Ma szeretném egy kicsit bővíteni a tudásodat ebben a témában. Mit gondolsz, milyen módszer lesz minden esetben?"

Kód
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

"Nehéz megmondani."

"Az első esetben az 1 egy int . 100%-os egyezésünk van azzal a metódussal, amely int-et vesz fel. Az első void print(int n). meg lesz hívva.

A második esetben nincs olyan metódusunk, amelyik egy bájtot vesz fel. De van két módszer, amelyhez egy rövid és egy int. A típusszélesítési szabályok alapján a bájt először rövidre, majd int-re bővül. Így az ítélet az, hogy az érvénytelen nyomtatás (rövid n). hívják majd.

A harmadik esetben 100%-os egyezésünk van azzal a metódussal, amelyik karakterláncot vesz fel. Az üres nyomtatás (String s). módszert hívják meg.

A negyedik eset nem egyértelmű. A nullnak nincs konkrét típusa. A fordító megtagadja ennek a kódnak a fordítását . Ebben az esetben a Cat.print((Integer)null) parancsot kell írnunk a harmadik metódus meghívásához, a Cat.print((String)null) parancsot pedig a negyedik metódus meghívásához."

"Ez nagyon informatív volt. Köszönöm."

"Szeretném felhívni a figyelmet arra, hogy a helyes hívási mód meghatározásakor a típusok csak szélesedhetnek. Nem szűkíthetik. Tekintsük ezt a példát:"

Kód
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

Az első esetben a bájttípust rövidre szélesítjük, és az első módszert hívjuk: void print(short n). .

A második esetben egy implicit kiszélesítő konverzió történik int-ről egész számra, majd a második módszer neve: void print(Integer n). .

– Erre nem számítottam.

– Nem, itt az igazi meglepetés:

Java kód Leírás
 class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
Az első esetben az int egész számra bővül. Mivel az egész számhoz nincs metódus, a legalkalmasabb módszer (és a meghívott) a void print (Object o)

A második esetben nem lesz fordítási hiba, és a void print(String s) kerül meghívásra, ami némileg nem nyilvánvaló.

"Amigo, remélem megérted, hogy ilyen esetekben a legjobb, ha megadsz egy típusú cast operátort (ahogyan a «(byte)»-nél tettük), hogy pontosan tudjuk, melyik metódust hívják meg."

"Soha nem számítottam arra, hogy a túlterhelt módszerekből bármilyen probléma adódik. De akkor te is jössz. Köszönöm, Rishi. Ezen a ponton őrködöm."