2016-06-18 13 views
0

Zeichenketten können offensichtlich, und primitive Zahlarten irgendwie concatinated sein. Außerdem kann man Wege und Strings und dergleichen miteinander verbinden. Wie funktioniert das intern in Java? Gibt es eine versteckte C++ - ähnliche Operatordefinition?Wie funktioniert der '+' Operatorüberladen für nicht-primitive Typen in Java?

+0

Sie können eine Antwort hier finden: http://stackoverflow.com/questions/47605/string-concatenation-concat-vs-operator. Wenn Sie Strings mit anderen Objekten verketten, wird die Methode 'String.valueOf()' auf jedes Nicht-String-Objekt angewendet, um es in einen String zu transformieren. –

+0

ist das Tag ** Polymorphismus ** notwendig ?? –

Antwort

2

In Java wird kein Operator überladen. All dies ist intern für den Compiler.

Wenn der Java-Compiler Ihr Programm übersetzt, kennt er den Kompilierungszeittyp jedes Ausdrucks und Unterausdrucks. Wenn es einen + mit einem String Ausdruck auf einer Seite sieht, wendet es Zeichenfolge-Verkettung an. Wenn zwei verschiedene Typen angezeigt werden, werden Regeln für die Typerweiterung angewendet und so weiter. Dieser Prozess ähnelt der Überladungsauflösung in Sprachen, die das Überladen von Operatoren unterstützen, ist jedoch den Programmierern, die die Sprache verwenden, vollständig verborgen.

0

Der Operator + funktioniert als Operator für zusätzliche Operatoren oder Stringverkettungen. Die Auswahl hängt von den Operanden ab, d. H. Wenn sie von primitiven Zahlentypen sind, zum Beispiel: int, kurz, lang, float, double usw., führt der Java-Compiler eine additive Operation durch. Wenn einer der Operanden jedoch eine Zeichenfolge ist, führt er eine Verkettung durch. 15.18.1 String-Verkettungsoperator + Wenn nur ein Operandenausdruck vom Typ String ist, wird die Stringkonvertierung (§5.1.11) für den anderen Operanden ausgeführt, um zur Laufzeit eine Zeichenfolge zu erzeugen. Das Ergebnis der Zeichenfolgenverkettung ist eine Referenz auf ein String-Objekt, das die Verkettung der beiden Operandenzeichenfolgen ist. Die Zeichen des linken Operanden gehen den Zeichen des rechten Operanden in der neu erzeugten Zeichenkette voraus. Das String-Objekt wird neu erstellt (§12.5), es sei denn, der Ausdruck ist eine Konstante Ausdruck (§15.28). Eine Implementierung kann die Konvertierung und Verkettung in einem Schritt ausführen, um zu vermeiden, dass ein intermediäres String-Objekt erstellt und dann verworfen wird. Um die Leistung der wiederholten Zeichenfolgenverkettung zu erhöhen, kann ein Java-Compiler die StringBuffer -Klasse oder eine ähnliche Technik verwenden, um die Anzahl der intermediären String-Objekte zu reduzieren, die durch Auswertung eines Ausdrucks erstellt werden. Für primitive Typen kann eine Implementierung auch die Erstellung eines Wrapper Objekts optimieren, indem sie direkt von einem primitiven Typ in eine Zeichenfolge konvertiert. [Link] [http://docs.oracle.com/javase/specs/#39990] Seite 564

+0

direkte Verbindung: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1 – zapl