Heim  >  Artikel  >  Java  >  Warum wählt die überladene Methodenauswahl von Java „method(String s)“ aus, wenn „null“ übergeben wird?

Warum wählt die überladene Methodenauswahl von Java „method(String s)“ aus, wenn „null“ übergeben wird?

Susan Sarandon
Susan SarandonOriginal
2024-11-07 04:47:02733Durchsuche

 Why does Java's overloaded method selection choose `method(String s)` when passed `null`?

Überladene Methodenauswahl mit Null-Parameter

Betrachten Sie den folgenden Java-Code:

public class MoneyCalc {</p>
<p>public void method(Object o) {</p>
<pre class="brush:php;toolbar:false">  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);

}
}

Hier die überladene Methode Bei der Übergabe eines Nullwerts als Parameter wird die Methode „method(String s)“ ausgewählt. Dies mag kontraintuitiv erscheinen, da null nicht explizit als String-Variable deklariert wird.

Null als Objekt verstehen

Trotz des Namens „Objektversion“ ist die Die Überladung von „method(Object o)“ ist nicht auf Objekte beschränkt. In Java kann null in einen Ausdruck eines beliebigen Klassentyps, einschließlich String, konvertiert werden. Daher gilt folgende Zuordnung:

String x = null;<br>

Bestimmung der Methodenspezifität

Der Java-Compiler wählt die spezifischste Überladung gemäß Abschnitt 15.12.2.5 der Java Language Specification (JLS). Informell ist eine Methode spezifischer, wenn von ihr verarbeitete Aufrufe auch von einer anderen Methode ohne Typfehler bei der Kompilierung verarbeitet werden könnten.

In diesem Fall ist die Überladung „method(String s)“ spezifischer, weil Es kann Aufrufe mit String-Argumenten verarbeiten. Die Überladung „method(Object o)“ hingegen kann jeden Objekttyp verarbeiten, einschließlich Null. Aufrufe mit String-Argumenten können jedoch nicht ohne Umwandlung verarbeitet werden, was zu einem Fehler bei der Kompilierung führen würde.

Ambiguous Overload with StringBuffer and String

Wenn wir Wenn wir den Code so ändern, dass er eine zusätzliche Überladung „method(StringBuffer sb)“ enthält, tritt ein mehrdeutiger Überladungsfehler auf:

public class MoneyCalc {</p>
<p>public void method(StringBuffer sb) {</p>
<pre class="brush:php;toolbar:false">  System.out.println("StringBuffer Verion");

}

public void method(String s) {

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

}

public static void main(String args[] ) {

  MoneyCalc question = new MoneyCalc();
  question.method(null);

}
}

Dies liegt daran, dass weder die „Methode(StringBuffer sb)“ noch die „Methode(String s)“ „Überlastung ist spezifischer als die andere. Beide können Nullargumente verarbeiten und keiner kann den Argumenttyp des anderen ohne Umwandlung verarbeiten.

Das obige ist der detaillierte Inhalt vonWarum wählt die überladene Methodenauswahl von Java „method(String s)“ aus, wenn „null“ übergeben wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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