Die Zeichenfolgenverbindung »…+…« in Java
Einführendes Beispiel
Zwei Zeichenfolgen können durch den Operator »+« zu einer einzigen Zeichenfolge verbunden werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "ab" + "cde" ); }}Protokoll
abcde
Wir bezeichnen diese Operation als Zeichenfolgenverbindung oder Zeichenfolgenverkettung.
Typanforderungen
Ein Operand des Operators »+« kann nun jeden der bisher behandelten Typen »int«, »double« oder »java.lang.String« als Typ haben.
Typregeln
Ist der Typ eines Operanden »java.lang.String«, so hat das Ergebnis der Addition den Typ »java.lang.String«.
- Typregeln für den Fall, daß ein Operand den Typ »java.lang.String« hat
- java.lang.String + … → java.lang.String
… + java.lang.String → java.lang.String
Sind beide Operanden numerisch, so gelten die schon in einer früheren Lektion behandelten Typregeln (dieselben wie bei der Division und Multiplikation).
- Typregeln (andere Formulierung)
- int + int → int
- double + … → double
- … + double → double
Semantik
Der Wert eines Additionsausdrucks mit einer Zeichenfolge ist die Verbindung (Verkettung, Hintereinanderschreibung) der Zeichenfolgen (Zeichenketten) der beiden Operanden. Falls einer der Operanden einen anderen Typ als »java.lang.String« hat, so wird sein Wert zunächst in eine Textdarstellung vom Typ »java.lang.String« umgewandelt.
Beispiele
Das folgende Beispiel zeigt eine einfache Zeichenfolgenverkettung.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "1." + "2.a" ); }}Protokoll
1.2.a
Wir können nun auch den Unterschied zwischen »"abc"« und »"abc "« verdeutlichen.
Bei einer Verkettung von »["abc"]« mit »["d"]« werden die vier Buchstaben einfach hintereinander gesetzt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "abc" + "d" ); }}Protokoll
abcd
Bei einer Verkettung von »["abc "]« mit »["d"]« bleibt das Leerzeichen am Ende von »["abc "]« erhalten und erscheint auch im Ergebnis.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "abc " + "d" ); }}Protokoll
abc d
Zeichenfolgenverbindung mit Zahlen
Umwandlung in eine Zeichenfolge
Bei Ausdrücken der Signatur ›int+java.lang.String‹, ›java.lang.String+int‹, ›double+java.lang.String‹ oder ›java.lang.String+double‹ wird der numerische Operandenwert mit demselben Verfahren wie bei einer Ausgabe in eine Zeichenfolge gewandelt und anschließend eine Verkettung der beiden Zeichenfolgen vorgenommen.
Im folgenden Beispiel ist der erste Summand numerisch und der zweite eine Zeichenfolge.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + "3a" ); }}java.lang.System.out
23a
Im folgenden Beispiel ist der erste Summand eine Zeichenfolge und der zweite numerisch.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "2" + 3 ); }}java.lang.System.out
23
Verfahren der Umwandlung ⃗
Die folgenden Programmbeispiele zeigen, daß bei der Wandlung eines numerischen Operanden in eine Zeichenfolge dasselbe Verfahren verwendet wird wie bei der Ausgabe: int-Werte werden durch eine Ziffernfolge ohne Punkt dargestellt, double-Werte werden nach der Wandlung mit einem Punkt gekennzeichnet.
Im folgenden Beispiel wird ein int-Wert in eine Zeichenfolge gewandelt, dabei findet sich kein Punkt ».« im Ergebnis der Wandlung.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + "|" ); }}- Protokoll
2|
Im folgenden Beispiel wird ein double-Wert in eine Zeichenfolge gewandelt, dabei findet sich ein Punkt ».« im Ergebnis der Wandlung.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2. + "|" ); }}- Protokoll
2.0|
Ergebnis als Operand ⃗
Das Ergebnis einer Verbindung kann wieder als Operand verwendet werden und durch seinen Typ »java.lang.String« eine weitere Verbindung herbeiführen. So berechnet das folgende Programm nicht etwa »5« als Summe von »2« und »3«, sondern verkettet »2« und »3« zu »23«, da der linke Operand (die Klammer) in »( "a" + 2 )+ 3« den Typ »java.lang.String« hat.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( "a" + 2 )+ 3 ); }}Protokoll
a23
Dasselbe Ergebnis erhält man auch ohne die Klammer.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "a" + 2 + 3 ); }}- Protokoll
a23
Auch das folgende Programm verkettet »2« und »3«, da der rechte Operand (die Klammer) in »2 +( 3 + "a" )« den Typ »java.lang.String« hat.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 +( 3 + "a" ) ); }}Protokoll
23a
Numerische Addition als Operand ⃗
Im folgenden Programm wird hingegen die arithmetische Summe von »2« und »3« berechnet, da in der Addition »2 + 3« kein Operand den Typ »java.lang.String« hat.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( 2 + 3 )+ "a" ); }}Protokoll
5a
Linksassoziativität ⃗
Wie schon behandelt wurde, wird ohne Klammerung bei einer Addition der Form »… + … + …« zuerst die am weitesten links stehende Summe auswertet. (Dabei stehen die Ellipsen »…« für Literale, Klammerausdrücke, Produkte oder Quotienten.)
In dem folgenden Programmbeispiel wird daher zuerst eine numerische Summe (»1 + 2«) berechnet und erst danach eine Zeichenfolgenverbindung (»3 + "4"«) vorgenommen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1 + 2 + "4" ); }}java.lang.System.out
34
In dem folgenden Programmbeispiel wird entsprechend schon bei der ersten Addition (»"1" + 2«) eine Zeichenfolgenverbindung vorgenommen, der dann eine zweite Zeichenfolgenverbindung (»"12" + 4«) folgt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "1" + 2 + 4 ); }}java.lang.System.out
124
Das folgende Programmbeispiel zeigt eine Kombination aller drei Typen »int«, »double« und »java.lang.String«.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1 + 2.0 + "a" ); }}java.lang.System.out
3.0a
In dem folgenden Programm wird zuerst «2» durch Verkettung mit «""» in eine Zeichenfolge »2« gewandelt, welche dann mit der Zeichenfolge »3« verkettet wird.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + "" + 3 ); }}- Protokoll
23
In dem folgenden Programm werden zuerst «2» und «3» numerisch zu «5» summiert, dann wird die Zahl «5» in die Zeichenfolge »5« gewandelt und mit der Zeichenfolge »a« verkettet.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + 3 + "a" ); }}- Protokoll
5a
Das neutrale Element ⃗⃗
Das folgende Programmbeispiel zeigt, daß die Addition der leeren Zeichenfolge «""» einen Text nicht verändert (so, wie die Addition von »0« eine Zahl nicht verändert).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ">" + "" + "<" ); }}java.lang.System.out
><
Das folgende Programmbeispiel zeigt, daß die Addition der Zahl »0« eine Zahl nicht verändert.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1 + 0 + 1 ); }}transcript
2
Entsprechend sagt man auch, daß die Zahl «0» das neutrale Element der Addition und die leere Zeichenfolge «""» das neutrale Element der Zeichenfolgenverbindung sei.
Anwendungen
Beschriftungen
Die Verbindung einer Zeichenfolge mit dem Ergebnis einer Berechnung kann dazu dienen, ein Ergebnis in einen Text einzusetzen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "Die Summe von 2 und 3 ist " +( 2 + 3 )+ "." ); }}Protokoll
Die Summe von 2 und 3 ist 5.
Auf diese Weise ist es möglich, das Ergebnis einer Berechnung zu beschriften oder zu erklären.
Angabe von Einheiten
Durch eine Verbindung eines Zahlenwertes mit einer nachgestellten Zeichenfolge kann ein Größe mit einer Einheit dargestellt werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 3 + 7/2. + " cm" ); }}Protokoll
6.5 cm
Darstellung mehrerer Ergebnisse
Das folgende Programmbeispiel zeigt die Ausgabe der Werte mehrerer numerischer Ausdrücke (Berechnungen).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( 2 + 3/2 )+ "; " +( 2 + 3/2. ) ); }}Protokoll
3; 3.5
Wir können nun mit einem Programm mehrere Berechnungen vornehmen und ihre Ergebnisse alle hintereinander ausgeben – auch mit Beschriftungen und Einheiten.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "Masse = " +( 16./2 + 9 )+ " kg, Laenge = " +( 2 + 17./4 )+ " m." ); }}Protokoll
Masse = 17.0 kg, Laenge = 6.25 m.
Umwandlung in eine Zeichenfolge ⃗
Die Addition des leeren Textes zu einer Zahl wird manchmal verwendet, um diese als Zeichenfolge darzustellen (in eine Zeichenfolge umzuwandeln). Später werden im Kurs auch noch Fälle gezeigt werden, in denen solch eine Umwandlung nützlich ist.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "" + 2 ); }}java.lang.System.out
2
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 + "" ); }}java.lang.System.out
2
An den obenstehenden Programmbeispielen kann man aber noch nicht erkennen, daß wirklich etwas umgewandelt wurde. Das folgende Programm zeigt aber deutlich, daß »( 2 + "" )« eine Zeichenfolge ist, weil bei der folgenden Addition von »3« eine Verkettung und keine arithmetische Summierung vorgenommen wird.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( 2 + "" )+ 3 ); }}transcript
23
Zum Vergleich mit dem vorigen Programm zeigt das folgende Programm die arithmetische Summierung.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( 2 + 0 )+ 3 ); }}transcript
5
Aufteilung langer Zeichenfolgenliterale
Eine sehr langes Zeichenfolgenliteral kann mit Hilfe des Operators »+« auf mehrere Zeilen aufgeteilt werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "Grundstuecksverkehrsgenehmigungs" +
"zustaendigkeitsuebertragungsverordnung" ); }}Protokoll
Grundstuecksverkehrsgenehmigungszustaendigkeitsuebertragungsverordnung
Genauso kann ein einzelnes langes Wort zur besseren Lesbarkeit im Quelltext untergliedert werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
("Grundstuecks" +
"verkehrs" + "genehmigungs" +
"zustaendigkeits" + "uebertragungs" +
"verordnung"); }}
Protokoll
Grundstuecksverkehrsgenehmigungszustaendigkeitsuebertragungsverordnung
Übungsfragen ⃗
? Ausdrücke ⃗
Welche Werte haben die folgenden Ausdrücke jeweils?
- A »9 + "C"«
- B »1 +( 9 + "C" )«
- C »1 + 5 + "A"«
- D »2 + 2 + 2 + ""«
- E »"" + 2 + 2 + 2«
/ Beschriftung einer Ausgabe ⃗
Drücken Sie mit Java die Summe 2+3 aus (diese soll nicht im Kopf ausgerechnet werden) und geben Sie den Wert des von Ihnen geschriebene Ausdrucks dann mit dem Text »2 + 3 = « (acht Zeichen) davor und dem Text ».« (ein Zeichen) dahinter aus.