2013-03-06 11 views
6

Wenn ich diesen Code ausführen druckt es String. Meine Frage ist, warum es keinen Kompilierzeitfehler gibt? Der Standardwert von Object und String ist null. Dann warum Compiler sagt Reference to method1 is ambiguous.Java Overloading Konzept

public class Test11 
{ 

    public static void method1(Object obj) { 
     System.out.println("Object"); 
    } 

    public static void method1(String str) { 
     System.out.println("String"); 
    } 

    public static void main(String[] arr) { 
     method1(null);  
    } 
} 
+0

übergeben wird Diese Frage sehen: http://StackOverflow.com/Questions/377203/Java-Method-Dispatch-with-null-argument –

Antwort

0

Well in einem Satz

Bei ladenen Methoden Compiler wählt die Methode mit den meisten spezifische Art, wie String der spezifischste Art von Objekt-Compiler ist wird die Methode aufzurufen, die Zeichenfolge nimmt als Argument

+0

Vielen Dank ... jetzt verstehe ich warum String angerufen hat. – Deepak

+0

@ user2139744 Sie willkommen :) sind – PermGenError

3

Von this answer:

Dort werden Sie feststellen, dass dies eine Kompilierzeitaufgabe ist. Die JLS sagt in Abschnitt 15.12.2:

Dieser Schritt verwendet den Namen der Methode und die Art der Argumentation Ausdrücke Methoden zu finden, die sowohl zugänglich und anwendbar Es gibt mehr als ein solches Verfahren sein, bei dem Fall der spezifischste wird gewählt.

+0

Vielen Dank für mein Konzept Clearing – Deepak

3

Der Compiler wird bei allen möglichen Überlastungen der Methode suchen, die die Parameter übereinstimmen könnten Sie passieren. Wenn einer von ihnen spezifischer als ist alle die anderen, dann wird es gewählt werden, es ist nur nicht eindeutig angesehen, wenn es nicht eine einzige spezifischsten Überlastung ist. In Ihrem Beispiel gibt es zwei mögliche Überladungen: method1(Object) und method1(String). Da String spezifischer als Object ist, gibt es keine Mehrdeutigkeit und die Option String wird gewählt. Wenn es eine dritte Überlastung wie method1(Integer) gab, dann gibt es nicht mehr eine einzige spezifische Wahl für den Aufruf method1(null), und der Compiler würde einen Fehler erzeugen.

+0

+1 Für das Fehlerszenario Hinweis. –

+0

Vielen Dank für Ihre Antwort – Deepak

0
public class Test11 
{ 
public static void method1(String str)//here str is the object of string 
{ 

System.out.println("String"); 
} 

public static void method1(Object obj)//here this is a common object not specified 
{ 
System.out.println("Object"); 
} 



public static void main(String[] arr) 
{ 
    Test11 t=new Test11(); 
    String null1=new String(); 
    method1(null1); 
    method1(t); 
} 

} 

output is : 
String 
Object 

// null1- ist ein String-Objekt, wenn u dies passieren wird method1 (String str) nur nennen, weil u String-Objekt übergeben // t-ist allgemeine Aufgabe, wenn u dies passieren wird method1 nennen (Objekt obj) nur, weil Sie Klasse objct übergeben, so dass es als Parameter

+0

Vielen Dank für Ihre Antwort – Deepak