YOU ARE HERE Ausdrücke und Anweisungen Einführung Objektorientierte Modellierung Java-Sprachkonstrukte Pakete und Zugriffskontrolle Deklaration von Methoden, Attributen, Variablen Ausdrücke und Anweisungen Kontrollstrukturen Ausnahmebehandlung Java-Klassenbibliothek Grafische Benutzungsoberflächen Programmierstil Zusammenfassung Ausdrücke sind mehrere durch Operatoren verknüpfte Variablen, Methoden oder Literale jeder Ausdruck hat ein Ergebnis (Wert) bestimmten Typs 5 * a + Math.max (b, c) (primitiver Typ) new java.util.date () (Referenztyp) in Anweisungen wird der Ausdruckswert einer Variablen zugewiesen, einer Methode übergeben oder als Methodenwert zurückgegeben d = 5 * a + Math.max (b, c); System.out.println (5 * a + Math.max (b, c)); return new java.util.date (); auch Deklarationen und Initialisierungen sind Anweisungen 1 2 Anweisungen und Blöcke Operatoren Anweisungen werden mit Semikolon (;) abgeschlossen leere Anweisung: einzelnes Semikolon ; // leere Anweisung Anweisungen werden der Reihe nach abgearbeitet Blöcke (begrenzt durch geschweifte Klammern) fassen Sequenzen von Anweisungen zusammen { Konkatenations-Operator + arithmetische Operatoren +, -, *, /, %, ++, -- Type Casting-Operator (typ) Bit-Operatoren ~, &,, ^, <<, >>, >>> Zuweisungsoperatoren =, +=, -=, *=, /=, %=, &=, =, ^= logische Operatoren!, &&, &,,, ^ Vergleichsoperatoren ==,!=, >, <, >=, <=, instanceof Bedingungsoperator?: 3 4 Operatorprioritäten String-Konkatenation 14 Stufen (hoch bis niedrig) ++, --, Vorzeichen, ~,!, (typ) *, /, % +, - <<, >>, >>> <, <=, >, >=, instanceof ==,!= & ^ &&?: = *=, /=, %=, -=, <<=, >>=, >>>=, &=, ^=, = Prioritäten können durch Klammerung geändert werden Operanden: Strings und ggf. primitive Datentypen Ergebnis: String Verknüpfung (Konkatenation) mit Operator + String a = "Hello", b = "World", c; c = a + " " + b; ist einer der Operanden ein primitiver Datentyp, so wird er in einen String umgewandelt String a = "Antwort: ", c; int b = 42; c = a + b; // "Antwort: 42" 5 6
Arithmetische Operatoren implizite Typumwandlung Operanden und Ergebnis: Zahlen Vorzeichen: +a bzw. a -a Rechenoperationen Addition, Subtraktion: a + b a - b Multiplikation, Division: a * b a / b Modulo-Division (Restbildung): a % b automatische Typanpassung (Type Casting) bei Rechenoperationen mit byte-, short-, int-zahlen: Ergebnis: int-zahl long- und anderen Ganzzahlen: Ergebnis: long-zahl float- und anderen Zahlen: Ergebnis: float-zahl double- und anderen Zahlen: Ergebnis: double-zahl Inkrementierung, Dekrementierung (nur für Ganzzahlen) Präinkrement, Prädekrement: ++a --a Postinkrement, Postdekrement: a++ a-- Präfix-Operatoren: erst Rechenoperation, dann Auswertung b = ++a; a = a + 1; b = a; Postfix-Operatoren: erst Auswertung, dann Rechenoperation b = a--; b = a; a = a - 1; Ziel: Vermeidung von Überläufen short a = 2, b = 30000; int c = a * b; // 60000 wäre zu groß für short Vorsicht bei Division von Ganzzahlen short a = 7, b = 2; int c = a / b; // ergibt 3! 7 8 explizite Typumwandlung Bit-Operatoren Type Casting-Operator: (typ) variable Vorsicht: Operator hat sehr hohe Priorität! ggf. Klammerung von zu castenden Ausdrücken notwendig short a = 2, b = 100, c; short a = 7, b = 2; c = (short) (a * b); float c = (float) a / b; Vorsicht: Datenverlust möglich! große in kleine Ganzzahlen: Verlust der höherwertigen Bits Fließkommazahlen in Ganzzahlen: Verlust der Nachkommastellen double d = -67.89; int i = (int) d; // -67 long-zahlen in Fließkommazahlen: u.u. nicht exakt möglich auch explizites Casting von Referenztypen möglich String-Umwandlungen über besondere Methoden (später) Operanden und Ergebnis: ganzzahlige primitive Datentypen bitweise Invertierung: ~a bitweise Verknüpfung bitweises Und: a & b bitweises Oder: a b bitweises Exclusiv-Oder: a ^ b bitweise Verschiebung (um n Stellen) nach links (mit Nachschieben von Nullen): a << n nach rechts (mit Nachschieben von Nullen): a >> n nach rechts (mit Nachschieben des Vorzeichenbits): a >>> n Trick zur Geschwindigkeitsoptimierung a << n entspricht a * 2 n a >>> n entspricht a / 2 n 9 10 Zuweisungsoperatoren Logische Operatoren für alle Datentypen als Ausdruck und Ergebnis: Zuweisungsoperator a = b Variable auf linker Seite erhält Wert des Ausdrucks auf rechter Seite Operanden: boolesche Ausdrücke Ergebnis: boolescher Wert für Zahlentypen als Operanden und als Ergebnis: Kombination von Rechen/Bitverknüpfungs-Operation mit Zuweisung Semantik (mit Operator-Platzhalter #) a #= b a = a # (b) Addition, Subtraktion: a += b a -= b Multiplikation, Division: a *= b a /= b Modulo-Division (Restbildung): a %= b Und: a &= b Oder: a = b Exclusiv-Oder: a ^= b logische Negation:!a mit Kurzschluss-Auswertung Auswertung der Operanden bricht ab, wenn Ergebnis feststeht logisches Und: a && b logisches Oder: a b ohne Kurzschluss-Auswertung Auswertung aller Operanden, auch wenn ohne Einfluss auf Ergebnis logisches Und: a & b logisches Oder: a b logisches Exclusiv-Oder: a ^ b 11 12
Vergleichsoperatoren Referenzgleichheit vs. Wertgleichheit Ergebnis immer boolescher Wert für alle Datentypen als Operanden: Gleichheit a == b Ungleichheit a!= b Vorsicht: Vergleich == nicht mit Zuweisung = verwechseln! für primitive Datentypen als Operanden: "größer als", "größer als oder gleich" a > b a >= b "kleiner als", "kleiner als oder gleich" a < b a <= b für Referenztypen und Klassen als Operanden: Prüfung des Datentyps a instanceof Typ ergibt true, wenn das Objekt a eine Instanz der Klasse Typ ist ergibt auch true, wenn Typ eine Oberklasse der Klasse von a ist Vorsicht beim Vergleich von Referenztypen! == prüft, ob Referenzen auf gleiche Instanz zeigen!= prüft, ob Referenzen auf verschiedene Instanzen zeigen es findet kein Vergleich der Objektinhalte statt! o!= p p == q o :Buch titel: Java p :Buch Konsequenzen Vergleich von Objektinhalten nur mit geeignet überschriebener equals-methode der Objekte möglich Vergleich von Zeichenketten nur mit entsprechenden Methoden der Klasse String möglich q titel: Java 13 14 Bedingte Ausdrücke Zusammenfassung Beschreibung von Alternativen in Ausdrücken "if-then- in einem Ausdruck" Syntax a = Bedingung? WennWahr : WennFalsch Bedingung muss ein Ausdruck mit booleschem Wert sein WennWahr und WennFalsch müssen Ausdrücke mit gleichem Ergebnistyp wie a sein (alle Datentypen erlaubt) Semantik Wenn Bedingung wahr ist, bekommt a den Wert von WennWahr, sonst den von WennFalsch zugewiesen Beispiel Erwachsene zahlen einen Mitgliedsbeitrag von 10, Jugendliche 5 mitgliedsbeitrag = alter >= 18? 10 : 5; Ausdrücke Anweisungen und Blöcke Operatoren Konkatenations-Operator + arithmetische Operatoren +, -, *, /, %, ++, -- Type Casting-Operator (typ) Bit-Operatoren ~, &,, ^, <<, >>, >>> Zuweisungsoperatoren =, +=, -=, *=, /=, %=, &=, =, ^= logische Operatoren!, &&, &,,, ^ Vergleichsoperatoren ==,!=, >, <, >=, <=, instanceof Bedingungsoperator?: implizite und explizite Typumwandlung Referenzgleichheit vs. Wertgleichheit 15 16 YOU ARE HERE Kontrollstrukturen Einführung Objektorientierte Modellierung Java-Sprachkonstrukte Pakete und Zugriffskontrolle Deklaration von Methoden, Attributen, Variablen Ausdrücke und Anweisungen Kontrollstrukturen Ausnahmebehandlung Java-Klassenbibliothek Grafische Benutzungsoberflächen Programmierstil Zusammenfassung Anweisungen werden normalerweise nacheinander abgearbeitet Bearbeitungsreihenfolge von Anweisungen und Blöcken kann durch Kontrollstrukturen beeinflusst werden bedingte Verzweigungen (if-) bewachte Anweisungen (switch) Schleifen (for, while, do-while) 17 18
Bedingte Verzweigung Auswahl aus zwei Alternativen und davon abhängige Programmfortsetzung if (Bedingung) Anweisung1; Anweisung2; Bedingung muss ein Ausdruck mit booleschem Wert sein Anweisung1 wird ausgeführt, wenn Bedingung true ist Anweisung2 wird ausgeführt, wenn Bedingung false ist -Teil ist optional wenn Bedingung false ist, wird die if-anweisung verlassen if-anweisung: Beispiel mehrere Anweisungen lassen sich in Blöcken gruppieren if (laendercode == 'D') { // Versand innerhalb Deutschlands summe += VERSANDKOSTEN_INLAND; System.out.println ("Bestellsumme: EUR " + summe); { // Versand ins Ausland System.out.println ("Order Total: EUR " + summe); Unterschied zu?:-operator mehrere Anweisungen im if- und -Zweig möglich if- und -Zweig sind hier keine Ausdrücke gleichen Werts, sondern Anweisungen bzw. Blöcke mehrerer Anweisungen 19 20 Bedingte Verzweigungen sind selbst auch Anweisungen lassen sich als Anweisungen in if- oder -Zweig einschachteln if (laendercode == 'D') summe += VERSANDKOSTEN_INLAND; Vorsicht: Weglassen von -Zweigen kann bei Verschachtelung Missverständnisse auslösen! if (laendercode == 'D') bezieht sich immer auf das nächstliegende vorhergehende if, zu dem noch kein definiert wurde Wo liegt der semantische Fehler im Beispiel? 21 22 Compiler richtet sich nicht nach der Einrückung, sondern nach der Reihenfolge der if/-zweige: Vermeidung des Fehlers durch Einklammerung in Blöcke ({ ) oder Verwendung von leeren Anweisungen (;): if (laendercode == 'D') if (laendercode == 'D') { ; Vorsicht: Code an sich fehlerfrei (syntaktisch korrekt), verhält sich aber nicht wie beabsichtigt (semantisch falsch) semantische Fehler können vom Compiler nicht erkannt werden! 23 24
Bewachte Anweisungen: Motivation Beispiel: Währungsumrechnung im Online-Shop wenn Warenversand nach Island: Summe in ISK ausgeben wenn Warenversand nach Hong Kong: Summe in HK$ ausgeben wenn Warenversand nach Japan: Summe in Yen ausgeben ansonsten: Summe in Euro ausgeben mögliche Realisierung (naiv): verschachtelte if-anweisungen Bewachte Anweisungen: Motivation if (laendercode == 'I') { summe *= 838.536390; waehrung = "ISK"; if (laendercode == 'H') { summe *= 8.300476; waehrung = "HK$"; if (laendercode == 'J') { summe *= 128.501118; waehrung = "YEN"; waehrung = "EUR"; System.out.println ("Summe: " + waehrung + summe); unübersichtlich und fehleranfällig! 25 26 switch-anweisung switch-anweisung: Beispiel übersichtlichere und mächtigere Lösung Ausdruck wird ausgewertet und Wert mit Konstanten verglichen Anweisungen ab case-marke mit "passender" Konstante werden ausgeführt wenn keine Konstante "passt", werden Anweisungen ab default-marke ausgeführt bei break fährt Programm nach der switch-anweisung fort switch (Ausdruck) { case Konstante1: case Konstante2: case KonstanteN: default: switch (laendercode) { case 'I': // Island summe *= 838.536390; waehrung = "ISK"; case 'H': // Hong Kong summe *= 8.300476; waehrung = "HK$"; case 'J': // Japan summe *= 128.501118; waehrung = "YEN"; default: // andere Laender waehrung = "EUR"; System.out.println ("Summe: " + waehrung + summe); 27 28 switch-anweisung: Regeln switch-anweisung: Beispiel 2 Ausdruck muss vom Typ short, byte, int oder char sein Konstanten müssen vom gleichen Typ wie Ausdruck sein Beispiel: Für Lieferungen nach Schottland und England soll in britische umgerechnet werden default-zweig ist optional default- und case-zweige dürfen leer sein Vorsicht: Wenn ein case-zweig nicht mit break endet, wird mit der Ausführung des nächsten Zweigs fortgefahren! switch (Ausdruck) { case Konstante1: case Konstante2: case Konstante3: // kein break! case Konstante4: switch (laendercode) { case 'I': // Island summe *= 838.536390; waehrung = "ISK"; case 'S': // Schottland case 'E': // England summe *= 0.675636; waehrung = "GBP"; default: waehrung = "EUR"; System.out.println ("Summe: " + waehrung + summe); 29 30
Schleifen while-schleife mehrfaches Durchlaufen der gleichen Anweisung oder des gleichen Anweisungsblocks Zahl der Durchläufe wird von Laufbedingung bestimmt while (Bedingung) { Bedingungsschleife while-schleife do-while-schleife Bedingung muss ein boolescher Ausdruck sein solange Bedingung true ist, werden Anweisung(en) ausgeführt Zählschleife for-schleife Beachte: erster Test der Bedingung vor Ausführung der Anweisung wenn Bedingung beim ersten Mal nicht erfüllt, werden Anweisungen überhaupt nicht ausgeführt! 31 32 while-schleife: Beispiele do-while while-schleife Beispiel: Thermostat while (hoersaal.gettemperatur < 20) { hoersaal.heizen; do { while (Bedingung); wenn Temperatur schon >= 20, wird gar nicht erst geheizt Beispiel: Zählen Bedingung muss ein boolescher Ausdruck sein solange Bedingung true ist, werden Anweisung(en) ausgeführt int n = 0; while (n < 10) { System.out.println (n); n++; Beachte: erster Test der Bedingung nach einmaliger Ausführung der Anweisung Schleife wird grundsätzlich mindestens einmal durchlaufen! 33 34 do-while while-schleife: Beispiele for-schleife Beispiel: Eingabe einer positiven Zahl do { System.out.println ("n? "); n = IOTools.readInteger(); while (n < 0); for (Initialisierung; Bedingung; Schleifenfortschaltung) { Eingabe wird abgefragt, bis eine Zahl >= 0 eingegeben wurde Beispiel: Zählen Initialisierung komma-getrennte Liste von Ausdrücken einmalig vor Beginn der Schleifenbearbeitung ausgewertet typischerweise Initialisierung von Zählvariablen int n = 0; do { System.out.println (n); n++; while (n < 10); Bedingung boolescher Ausdruck wenn Bedingung true ist, werden Anweisungen ausgeführt ansonsten wird die Schleife abgebrochen 35 36
for-schleife for (Initialisierung; Bedingung; Schleifenfortschaltung) { Schleifenfortschaltung komma-getrennte Liste von Ausdrücken immer nach den Anweisungen im Schleifenrumpf ausgeführt typischerweise Weiterschaltung von Zählvariablen Anweisungen Schleifenrumpf, der wiederholt werden soll for-schleife: Bearbeitungsreihenfolge for (Initialisierung; Bedingung; Schleifenfortschaltung) { 1. Ausführen der Initialisierung 2. Prüfen der Bedingung 3. wenn true, Ausführen der Anweisungen, sonst Abbruch 4. Ausführen der Schleifenfortschaltung 5. weiter mit 2. alle Teile sind optional 37 38 for-schleife: Beispiele Zusammenfassung Beispiel: Zählen for (int n = 0; n < 10; n++) { System.out.println (n); Beispiel: mehrere Initialisierungen, Fortschaltungen bedingte Verzweigungen (if-) zwei Alternativen der Programmfortsetzung in Abhängigkeit von einer booleschen Bedingung bewachte Anweisungen (switch-case-default) mehrere Alternativen der Programmfortsetzung in Abhängigkeit vom Wert einer Ganzzahl- oder Zeichenvariable for (int n = 0, m = 10; n < 10; n++, m--) { System.out.println ("n=" + n); System.out.println ("m=" + m); Beispiel: Endlosschleife for ( ; ; ) { System.out.println ("Und täglich grüßt das Murmeltier"); while-schleife abhängig von boolescher Bedingung (vor Ausführung getestet) do-while-schleife abhängig von boolescher Bedingung (nach Ausführung getestet) for-schleife abhängig von Zählvariablen, die im Schleifenkopf initialisiert, getestet und fortgeschaltet werden 39 40 Und täglich grüßt das Murmeltier morgen um 9:15 Uhr im Hörsaal Süd, Campus Jahnallee! 41