Menetelmän ylikuormitus ja nollavirhe Javassa
Javassa on hyvin yleistä ylikuormittaa menetelmiä. Alla on mielenkiintoinen Java-ohjelma.
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 ); } }
Lähtö:
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
Syy siihen, miksi saamme käännösaikavirheen yllä olevassa skenaariossa, on tässä menetelmäargumentit Integer ja String eivät kumpikaan ole primitiivisiä tietotyyppejä Javassa. Tämä tarkoittaa, että he hyväksyvät nolla-arvot. Kun välitämme nolla-arvon metodille 1, kääntäjä hämmentää, mikä menetelmä sen on valittava, koska molemmat hyväksyvät nollan. Tätä käännösaikavirhettä ei tapahdu, ellemme tarkoituksella välitä nolla-arvoa. Katso esimerkiksi alla oleva skenaario, jota noudatamme yleisesti koodattaessa.
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 ); } }
Lähtö:
fun(Integer )
Yllä olevassa skenaariossa, jos arg-arvo on nolla lausekkeen tuloksen vuoksi, nolla-arvo välitetään menetelmälle 1. Tässä emme saa käännösaikavirhettä, koska määritämme argumentin tyyppiä Kokonaisluku, joten kääntäjä valitsee metodin 1 (Kokonaisluku i) ja suorittaa siinä olevan koodin. Huomautus: Tämä ongelma ei jatku, kun ohitetut menetelmäargumentit ovat primitiivisiä tietotyyppejä. Koska kääntäjä valitsee sopivimman menetelmän ja suorittaa sen.