"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?"
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:"
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 |
---|---|
|
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."
GO TO FULL VERSION