In Java is het heel gebruikelijk om methoden te overbelasten. Hieronder staat een interessant Java-programma.
Javapublic class Test { // Overloaded methods public void fun(Integer i) { System.out.println("fun(Integer ) "); } public void fun(String name) { System.out.println("fun(String ) "); } // Driver code public static void main(String [] args) { Test mv = new Test(); // This line causes error mv.fun(null); } }
Uitgang:
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
De reden waarom we in het bovenstaande scenario een compileerfout krijgen, is dat de methode-argumenten Integer en String beide geen primitieve gegevenstypen zijn in Java. Dat betekent dat ze nulwaarden accepteren. Wanneer we een nulwaarde doorgeven aan method1, raakt de compiler in de war welke methode hij moet selecteren, omdat beide de nul accepteren. Deze compileerfout zou niet optreden tenzij we opzettelijk een null-waarde doorgeven. Zie bijvoorbeeld het onderstaande scenario dat we in het algemeen volgen tijdens het coderen.
Javapublic class Test { // Overloaded methods public void fun(Integer i) { System.out.println("fun(Integer ) "); } public void fun(String name) { System.out.println("fun(String ) "); } // Driver code public static void main(String [] args) { Test mv = new Test(); Integer arg = null; // No compiler error mv.fun(arg); } }
Uitgang:
fun(Integer )
Als in het bovenstaande scenario de waarde 'arg' nul is vanwege het resultaat van de expressie, wordt de nulwaarde doorgegeven aan methode1. Hier krijgen we geen compileerfout omdat we specificeren dat het argument van het type Integer is. Daarom selecteert de compiler de methode1 (Integer i) en zal de code daarin uitvoeren. Opmerking: dit probleem blijft niet bestaan als de overschreven methodeargumenten een primitief gegevenstype zijn. Omdat de compiler de meest geschikte methode selecteert en deze uitvoert.