+
ist kein Beispiel für das Überladen von Operatoren. +
wird in die Sprache als Konkatentationsoperator und als arithmetischer Additionsoperator eingebaut.
Das bedeutet, dass eine Person, die ein Programm mit Java schreibt, keine Operatoren überladen kann, aber was die Grammatik der Java-Sprache betrifft, ist +
als Verkettung und Additionsoperator definiert.
BEARBEITEN
Es funktioniert für andere Klassen wie Integer
und Double
wegen Autoboxing .
Wenn Sie sich den Bytecode eines Java-Programms ansehen, das eine String-Verkettung ausführt, sehen Sie, dass es StringBuilder
erstellt und die Methode append()
verwendet. Der Java-Compiler sieht den Operator +
und erkennt, dass die Operanden Zeichenfolgen und keine primitiven Typen sind (wie int
).
Wenn Sie sich den Bytecode eines Programms ansehen, das ganzzahlige Additionen durchführt, sehen Sie, dass er die Anweisung iadd
verwendet, um eine ganzzahlige Addition durchzuführen. Dies liegt daran, dass der Compiler erkennt, dass die Operanden für die Operation +
ganze Zahlen sind.
Was% ce_de% betrifft, zeigt der Bytecode, dass du tatsächlich Integer i = 4
machst. Dies wird Autoboxing genannt. Später, wenn Sie etwas wie Integer i = Integer.valueOf(4)
machen, wobei sowohl i + p
als auch i
vom Typ p
sind, zeigt der generierte Bytecode, dass Sie Integer
machen, wo die Rückgabetypen beider Methoden sind i.intValue() + p.intValue()
(der eigentliche Bytecode-Befehl ist wieder int
).
Das ist der Grund, warum iadd
% +
verwendet, obwohl sie keine echten primitiven Typen sind.
Es funktioniert für primitive Wrapper wie Integer wegen Autoboxing .
Es funktioniert für String, weil das ein Sonderfall für die Verkettung von Strings :
Die Java-Sprache bietet spezielle Unterstützung für den String-Verkettungsoperator (+) und für die Konvertierung anderer Objekte in Strings. Die Verkettung von Zeichenfolgen wird über die StringBuilder- (oder StringBuffer-) Klasse und ihre append-Methode implementiert. String-Konvertierungen werden über die Methode toString implementiert, die von Object definiert und von allen Klassen in Java übernommen wird. Weitere Informationen zur Zeichenfolgenverkettung und -konvertierung finden Sie unter Gosling, Joy und Steele, Die Java-Sprachspezifikation.
%Vor%Die Java-Sprache bietet spezielle Unterstützung für den String-Verkettungsoperator (+) und für die Konvertierung anderer Objekte in Strings.
Was tatsächlich ausgeführt wird, ist
%Vor% Wie @yan sagte, dies ist die Ausnahme, nicht die Regel. Strings haben in Java einen besonderen Status. Es gibt einen ganzen Unterabschnitt der Java-Sprachspezifikation, der in seiner Rolle als String-Verkettungsoperator +
gewidmet ist: §15.18.1 .
Was Ihr Update betrifft, ist das ein anderer Spezialfall. Java ist manchmal , je nach Fall intelligent genug, um Dinge, die nicht String
s sind, in String
s zu konvertieren, wenn String
s benötigt werden. Einer dieser Spezialfälle ist der von Ihnen beschriebene, bei dem Primitive an einem Ort auftauchen, der ein String
benötigt. Die Grundelemente werden zuerst in ihre Referenztypen konvertiert - Integer
, Double
, & amp; c. - und dann in String
s über die Methode toString()
.
Ein weiterer Spezialfall ist, wenn ein String
und ein nicht String
mit dem String-Verkettungsoperator +
kombiniert werden, wie in JLS §5.4 - String-Konvertierung .
Der Vollständigkeit halber: +
in seiner häufigeren "adding numbers together" -Rolle wird im anderen Teil von §15.18, §15.18.2 - Additive Operatoren (+ und -) für numerische Typen .
Tags und Links string java string-concatenation operator-overloading