2013-04-10 13 views
7
public class OverloadingTest extends Format{ 

    public int add(String s1){ 
     System.out.println("With String"); 
     return 1; 
    } 
    public int add(Object a){ 
     System.out.println("With Object"); 
     return 1; 
    } 


    public static void main(String[] args) { 
     OverloadingTest overloadingTest = new OverloadingTest(); 
     overloadingTest.add(null); 
    } 

} 

Perché l'output del programma With String ?Perché è l'uscita del programma?

ho provato leggendo JLS per il 6 ° versione, ma ancora non riusciva a trovare la risposta.

L'unica ragione che posso indovinare è che viene scelta la corrispondenza più vicina nella gerarchia di ereditarietà.

Quindi in questo caso ci vorrebbe String come Object è la sua super classe.

+5

È risposto alla tua domanda :) –

+0

La classe sub subber è sempre scelto .... – Thihara

+1

@Deepak Bala Oh grande. Ma hai qualche riferimento o documentazione che possa indicarlo? – Sam

risposta

3

Questa risposta è disponibile nella questione Method Overloading for NULL parameter:

Java saranno sempre cercare di utilizzare la versione più specifica di un metodo che è disponibile (vedi JLS §15.12.2).

Quindi, come risultato, viene utilizzato String perché è il tipo più specifico disponibile. Se esiste più di un sottotipo, sarà necessario eseguire il cast null nel tipo appropriato per indicare quale funzione si desidera eseguire.

1

Questo è scritto in §15.12.2.5. Choosing the Most Specific Method:

Se più di un metodo membro è accessibile e applicabile ad una chiamata di metodo, è necessario scegliere uno di fornire il descrittore per il metodo di spedizione di run-time . Il linguaggio di programmazione Java utilizza la regola per scegliere il metodo più specifico.

L'intuizione informale è che un metodo è più specifico di un altro se qualsiasi chiamata gestita dal primo metodo può essere passata all'altro senza un errore di tipo in fase di compilazione.

Nel tuo esempio, add(Object) può gestire tutto ciò che add(String) può. Questo rende quest'ultimo il più specifico. È quindi quello che viene scelto per gestire null.

0

Se più di un metodo membro è accessibile e applicabile a un richiamo di metodo ... Il linguaggio di programmazione Java utilizza la regola per scegliere il metodo più specifico.

See T he Java Language Specification

Problemi correlati