Metódus túlterhelés és null hiba a Java-ban
Java-ban nagyon gyakori a metódusok túlterhelése. Az alábbiakban egy érdekes Java program látható.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); // This line causes error mv . fun ( null ); } }
Kimenet:
22: error: reference to fun is ambiguous mv.fun(null); ^ both method fun(Integer) in Test and method fun(String) in Test match 1 error
Az ok, amiért a fenti forgatókönyvben fordítási időhibát kapunk, az az, hogy itt az Integer és a String metódusargumentumok nem primitív adattípusok a Java-ban. Ez azt jelenti, hogy elfogadják a null értékeket. Amikor null értéket adunk át a metódus1-nek, a fordító összezavarodik, hogy melyik metódust kell kiválasztania, mivel mindkettő elfogadja a nullát. Ez a fordítási időhiba csak akkor fordul elő, ha szándékosan null értéket adunk át. Lásd például az alábbi forgatókönyvet, amelyet általában követünk a kódolás során.
Java public class Test { // Overloaded methods public void fun ( Integer i ) { System . out . println ( & quot ; fun ( Integer ) & quot ;); } public void fun ( String name ) { System . out . println ( & quot ; fun ( String ) & quot ;); } // Driver code public static void main ( String [] args ) { Test mv = new Test (); Integer arg = null ; // No compiler error mv . fun ( arg ); } }
Kimenet:
fun(Integer )
A fenti forgatókönyvben, ha az 'arg' érték nulla a kifejezés eredménye miatt, akkor a null értéket adjuk át a metódusnak. Itt nem kapunk fordítási időt, mert azt adjuk meg, hogy az argumentum Integer típusú, ezért a fordító kiválasztja a metódus1 (Integer i)-t, és végrehajtja a kódot abban. Megjegyzés: Ez a probléma nem marad fenn, ha a felülírt metódusargumentumok primitív adattípusúak. Mert a fordító kiválasztja a legmegfelelőbb módszert és végrehajtja.