Warum funktioniert + Strings in Java?

7

Java kann den Operator nicht überladen, aber + funktioniert in Ordnung für String und Integer und einige andere Klassen. Wie ist das möglich?

update:
Warum funktioniert das?

%Vor%     
VextoR 28.03.2011, 19:54
quelle

6 Antworten

7

+ 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.

    
Vivin Paliath 28.03.2011, 19:57
quelle
6

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.

    
Isaac Truett 28.03.2011 19:56
quelle
4

+ ist eine integrierte Operation. Es ist eine Ausnahme, keine Regel.

    
yan 28.03.2011 19:56
quelle
2

Java lässt nicht zu, dass benutzerdefinierter -Operator überladen wird, aber der Compiler kann dem Compiler-Entwickler immer noch sagen, dass String1 + String2 == String1String2 und den richtigen Aufruf der Verknüpfungsmethode für den + -Operator ersetzen soll .

    
KeithS 28.03.2011 19:56
quelle
2
  

Die Java-Sprache bietet spezielle Unterstützung für den String-Verkettungsoperator (+) und für die Konvertierung anderer Objekte in Strings.

%Vor%

Was tatsächlich ausgeführt wird, ist

%Vor%     
Mojo Risin 28.03.2011 20:02
quelle
1

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 .

    
Pops 28.03.2011 20:22
quelle