2013-10-08 8 views
9
public class Test1 { 

    public static void main(String[] args) { 
     Test1 test1 = new Test1(); 
     test1.testMethod(null); 
    } 

    public void testMethod(String s){ 
     System.out.println("Inside String Method");  
    } 

    public void testMethod(Object o){ 
     System.out.println("Inside Object Method"); 
    } 
} 

Quando provo a eseguire il codice dato, ottengo il seguente output:Come funzionano i metodi sovraccaricati?

All'interno String Metodo

Qualcuno può spiegare perché il metodo con il parametro di tipo String è sempre chiamato?

+1

+1 Sembrava una domanda super facile, ma l'utilizzo di null ... È davvero interessante ... –

+2

possibile duplicazione di [Strano comportamento Java non valido in Sovraccarico metodo] (http://stackoverflow.com/questions/14789478/ strange-java-null-behavior-in-method-overloading) –

+0

@RohitJain quella domanda è già un duplicato di [this] (http://stackoverflow.com/questions/1545501/which-overload-will-get-selected- for-null-in-java) – mariomario

risposta

19

più specifica argomento metodo viene scelto per metodi di overload

In questo caso, è String sottoclasse di Object. Quindi String diventa più specifico di Object. Quindi viene stampato Inside String method.

Direttamente dal JLS-15.12.2.5

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 in fase di esecuzione. Il linguaggio di programmazione Java utilizza la regola per scegliere il metodo più specifico.

Come BMT e LastFreeNickName hanno correttamente suggerito, (Object)null causerà metodo sovraccaricato con Object metodo tipo da chiamare.

+3

Ma per null, String e Object sono entrambi allo stesso livello, quindi come String può essere più specifico? –

+5

Completamente corretto! Puoi provare e passare (Object) null come parametro e sceglierà l'altro metodo. – LastFreeNickname

+3

Ogni volta che incontra una stringa letterale nel codice, il compilatore crea un 'Oggetto stringa' con il suo valore, in questo caso * Null *. – iMBMT

0

Aggiungendo a una risposta esistente, non sono sicuro se ciò è dovuto a una versione di Java più recente dalla domanda, ma quando ho provato a compilare il codice con un metodo prendendo un intero come parametro invece di un oggetto , il codice è ancora compilato. Tuttavia, la chiamata con null come parametro ha ancora invocato il metodo del parametro String in fase di esecuzione.

Ad esempio,

public void testMethod(int i){ 
    System.out.println("Inside int Method");  
} 

public void testMethod(String s){ 
    System.out.println("Inside String Method");  
} 

darà ancora l'output:

Inside String Method 

quando chiamato come:

test1.testMethod(null); 

La ragione principale di questo è perché String non accetta null come un valore e int no. Quindi null è classificato come oggetto String.

Tornando alla domanda posta, il tipo Oggetto si trova solo quando viene creato un nuovo oggetto.Questo è fatto da entrambi i tipi di colata null come un oggetto da

test1.testMethod((Object) null); 

o utilizzare qualsiasi tipo di oggetto per un'operazione primitiva come

test1.testMethod((Integer) null); 
    or 
test1.testMethod((Boolean) null); 

o semplicemente creando un nuovo oggetto

test1.testMethod(new Test1()); 

va notato che

test1.testMethod((String) null); 

invocherà di nuovo il metodo String poiché ciò creerebbe un oggetto di tipo String.

Inoltre,

test1.testMethod((int) null); 
    and 
test1.testMethod((boolean) null); 

darà un errore di compilazione dal booleano e int non accettano nulla come un valore valido e come int! = Integer e boolean! = Booleano. Il tipo intero e il valore booleano vengono convertiti in oggetti di tipo int e booleani.