Heim > Java > javaLernprogramm > Warum wählt die Übergabe von Null an eine Methodenüberladung die String-Version gegenüber der Objektversion aus?

Warum wählt die Übergabe von Null an eine Methodenüberladung die String-Version gegenüber der Objektversion aus?

Susan Sarandon
Freigeben: 2024-11-19 15:54:02
Original
605 Leute haben es durchsucht

Why Does Passing Null to a Method Overload Choose the String Version Over the Object Version?

Überladungsauflösung: Interpretation des Null-Literals

In Java ist ein Null-Literal eine gültige Referenz, die jeder Objektvariablen zugewiesen werden kann , einschließlich solcher von Referenztypen wie String. Dieses Verhalten spielt eine entscheidende Rolle bei der Auflösung überladener Methoden, wenn ein Parameter als Null übergeben wird.

Bedenken Sie den folgenden Codeausschnitt:

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}
Nach dem Login kopieren

In diesem Beispiel, wenn die Methode method aufgerufen wird mit Beim Nullliteral wählt der Java-Compiler die Methodenüberladung (String s) anstelle der Methodenüberladung (Objekt o). Dieses Verhalten wird durch das Prinzip der spezifischsten Überladungsauflösung erklärt.

Gemäß der Java Language Specification (JLS) wählt der Compiler die „spezifischste“ Überladung aus, nämlich „die Eins“. an den ein Aufruf ohne einen Typfehler bei der Kompilierung übergeben werden könnte.“ Hier kann das Nullliteral ohne Fehler an die Überladung der Methode (String s) übergeben werden, nicht jedoch an die Überladung der Methode (Objekt o).

Daher wählt der Java-Compiler die Überladung der Methode (String s). , und die Ausgabe des Programms ist „String Version“.

Allerdings:

...
   public void method(StringBuffer sb) {
      System.out.println("StringBuffer Verion");
   }
...
Nach dem Login kopieren

Wenn eine dritte Überladung hinzugefügt wird, um einen StringBuffer-Parameter zu akzeptieren, wird der Code nicht kompiliert. Dies liegt daran, dass jetzt sowohl die Methodenüberladungen (String s) als auch die Methodenüberladungen (StringBuffer sb) gleichermaßen spezifisch sind, was zu Mehrdeutigkeiten führt und den Compiler daran hindert, die am besten geeignete Überladung auszuwählen.

Das obige ist der detaillierte Inhalt vonWarum wählt die Übergabe von Null an eine Methodenüberladung die String-Version gegenüber der Objektversion aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage