5.4 Java Syntaxkonstrukte 5.4.1 Primitive Datentypen, Literale und Variablen 5.4.2 Aufruf von Objekten, einfacher Nachrichtenaustausch 5.4.3 Operatoren, Ausdrücke, Zuweisungen 5.4.4 Anweisungen Informatik I – Java © Klaus Hinrichs 5-31 5.4.1 Primitive Datentypen, Literale und Variablen • Primitive Datentypen – Ganze Zahlen: – Fließkommazahlen: – Andere Typen: byte float char short int double boolean long • Keine primitiven Datentypen sind: String, Arrays (auch von einfachen Typen), Klassen allgemein • Ganze Zahlen: – 2er Komplement Darstellung – vorzeichenbehaftet – feste Größe, unabhängig von Maschinenwortgröße Typ byte short int long © Klaus Hinrichs Größe 8 Bit (1 Byte) 16 Bit (2 Byte) 32 Bit (4 Byte) 64 Bit (8 Byte) Wertbereich –27…0…(27–1) –215…0…(215–1) –231…0…(231–1) –263…0…(263–1) Informatik I – Java 5-32 Primitive Datentypen: Fließkommazahlen • Fließkommazahlen: – Fließkommazahlen nach IEEE 745 – Mantisse und Exponent definieren Wert – Unendlich ist ein definierter Wert: POSITIVE_INFINITY NEGATIVE_INFINITY – NaN (Not a number) ist ein definierter Wert Typ Größe Wertbereich Genauigkeit float 32 Bit (4 Byte) ±3.4·1038 ~ 7 Dezimalen 308 double 64 Bit (8 Byte) ±1.8·10 ~ 15.5 Dezimalen • Fließkommazahlen nach IEEE 745 setzen sich zusammen aus: – Sign-Bit S (1 Bit) – Exponent E (8 Bit für float und 11 Bit für double) – Mantisse M (23 Bit für float und 52 Bit für double) Alle Bits in E gesetzt ! Darstellung für Unendlich und NaN © Klaus Hinrichs Informatik I – Java 5-33 Primitive Datentypen: boolean und char • boolean kennt nur zwei Werte, true und false • Sämtliche boolsche Logik in Java wird mit dem Datentyp boolean realisiert. Mißbrauch von Integertypen für boolsche Ausdrücke, wie in C und C++ üblich, ist in Java nicht vorgesehen. • boolean benötigt 1 Byte (= 8 Bit) Speicher. Dies liegt nicht an der Java-Sprachsyntax, sondern am Mapping auf die Virtual Machine, die keine 1-Bit-Datentypen kennt. • char ist ein 16-Bit-Zeichen nach dem Unicode-Standard • Untere 7 Bit (128 Zeichen) von Unicode sind ASCII-kompatibel (bzgl. ASCII nach ANSI X3.4) • Sonstige Bits werden benötigt, um internationale Zeichensätze abbilden zu können. • Verantwortlich ist das Unicode Consortium (http:// www.unicode.org) © Klaus Hinrichs Informatik I – Java 5-34 Klasse String • Zeichenketten werden durch Objekte der Klasse String dargestellt • allgemeine Objekte und Klassen werden später gründlicher untersucht • String ist jedoch besondere Klasse, da Literale (konstante Zeichenketten) und Operatoren (+ zur Konkatenation) definiert sind • Anders als in C/ C++ sind Strings keine Zeiger auf char bzw. Array von char, in Java gibt es keine Zeiger, und Arrays sind gesonderte Konstruktionen, die nichts mit der Klasse String zu tun haben Informatik I – Java © Klaus Hinrichs 5-35 Primitive Datentypen in Java Anwendung Java-Datentyp Beispiel Logik boolean true Buchstaben char 'a' 'b' 'c' ... Ganze Zahlen byte (8 Bit) short (16 Bit) int (32 Bit) long (64 Bit) -13 Fließkomma float (32 Bit) double (64 Bit) -3.3e-22f 3.4E32 © Klaus Hinrichs Informatik I – Java false -1 0 1 5-36 Literale • Literale sind konstante Zahlen, Zeichen bzw. Zeichenketten, die zur Initialisierung von Datentypen verwendet werden. • Jedes Literal hat einen eindeutigen Typ, bei Zuweisungen muß auf Typkonsistenz geachtet werden. • Literale existieren für die einfachen Datentypen int long float double char boolean sowie für die Klasse String. Es gibt keine Literale für byte und short! • Für den primitiven Datentyp boolean gibt es die Literale true und false. © Klaus Hinrichs Informatik I – Java 5-37 Literale: Ganze Zahlen • Ganze Zahlen lassen sich einfach durch den Dezimalwert darstellen, z. B. 0 20 4332 • Ein Vorzeichen kann der Zahl vorangestellt werden, z. B. -323 +4238 • Durch vorangestelltes 0x lassen sich Zahlen durch ihre Hexadezimalwerte definieren. Die Buchstaben A bis F können hier sowohl klein als auch groß geschrieben werden, z.B. 0x3AF 0xfff178 • Durch eine vorangestelle Null 0 werden Zahlen im Oktalsystem definiert, z. B. 0413 01114 • Standardmäßig sind Ganzzahlkonstanten vom Typ int, longKonstanten werden durch ein Anfügen des Buchstabens L bzw. l erzeugt, z.B. 0L 100000000000L 375l Achtung: l leicht mit 1 zu verwechseln, daher L benutzen • Für die Datentypen byte und short existieren keine eigenen Literale, es dürfen int-Literale verwendet werden, sofern der Wert klein genug. © Klaus Hinrichs Informatik I – Java 5-38 Literale: Fließkommazahlen … • Fließkommazahlen bestehen aus einer Mantisse und einem optionalen Exponenten (zur Basis 10). • Der Exponent wird durch ein E bzw. e von der Mantisse getrennt, z.B. entspricht 10E3 dem Wert 10000. • Sowohl Mantisse als auch Exponent können vorzeichenbehaftet sein, z.B. -10E8 +3e-4 • Mantisse darf auch als Dezimalbruchdarstellung geschrieben werden, z. B. -5.334E+27 • Fließkommazahlen vom float-Typ lassen sich durch ein angefügtes f bzw. F definieren, z.B. 7f 3.8F • Fließkommazahlen vom double-Typ lassen sich durch ein angefügtes d bzw. D definieren, z.B. 121D 1.4E7d © Klaus Hinrichs Informatik I – Java 5-39 … Literale: Fließkommazahlen • Fließkommazahlen lassen sich als solche von ganzen Zahlen unterscheiden, wenn eine der folgenden Eigenschaften erfüllt ist: - Es existiert ein Exponent, z.B. 1E3 - Die Mantisse enthält den Dezimalpunkt, z.B. 3.0 - f , F , d oder D beendet das Literal. • Ist ein Fließkommaliteral nicht durch f bzw. F spezifiziert, hat es den Typ double. © Klaus Hinrichs Informatik I – Java 5-40 Literale: Zeichen … • Zeichen (char-Literale) werden durch einfache Anführungsstriche definiert, z.B. 'a' , '#' , '=' • Für Sonderzeichen gibt es Escape-Sequenzen, die durch einen Backslash \ eingeleitet werden, z.B. '\n' • Hierbei bedeutet: '\b': backspace BS (Zeichen zurück) (ASCII: 8) '\t': horizontal tab HT (horizontaler Tabulator) (ASCII: 9) '\n': line feed LF (Zeilenvorschub) (ASCII: 10) '\f': form feed FF (Seitenvorschub) (ASCII: 12) '\r': carriage return CR (Wagenrücklauf) (ASCII: 13) '\"': double quote (doppeltes Anführungszeichen) '\'': single quote (einfaches Anführungszeichen) '\\': backslash (Rückwärts-Schrägstrich) © Klaus Hinrichs Informatik I – Java 5-41 … Literale: Zeichen • In einer Escape-Sequenz kann auch direkt der ASCII-Wert als Oktalzahl angegeben werden, z. B. '\17' '\3' • Durch '\uxxxx' wird der Wert als Unicode-Sequenz angegeben, wobei für jedes x eine Hexadezimalziffer angegeben werden muß, z.B. '\u0022' entspricht '\"' ) • Achtung: die Unicode-Escape-Sequenzen werden in einer sehr frühen Phase des Compilers ausgewertet. Ein Zeilenvorschub als Unicode-Escape-Sequenz wird daher genauso behandelt wie eine neue Zeile im Editor. © Klaus Hinrichs Informatik I – Java 5-42 String-Literale • String: Folge von Zeichen. • String-Literale werden durch doppelte Anführungszeichen gekennzeichnet. • Alle Zeichen lassen sich analog den char-Literalen konstruieren. • Beispiele für String-Literale: "Begrenzung durch Anführungszeichen" "Das ist Text\nmit Zeilenvorschub" © Klaus Hinrichs Informatik I – Java 5-43 Variablen • Variablen dienen dazu, Werte von speziellen Datentypen zu speichern und zu verarbeiten, die gespeicherten Werte können während der Ausführung eines Programms geändert werden, d.h. sie sind variabel. • Die Werte, die eine Variable annehmen kann, sind durch ihren Typ festgelegt. • Als erster Schritt muß eine Variable dem Compiler bekannt gemacht werden, diesen Vorgang nennt man Deklaration: int kontostand; • Dann muß ein Anfangswert (initialer Wert) zugewiesen werden, diesen Vorgang nennt man Initialisierung: kontostand = 0; • Verkürzend können beide Aktionen auch in einer Zeile erledigt werden: int kontostand = 0; Deklaration [mit Initialisierung] Datentyp Variablenname [= Wert] © Klaus Hinrichs Informatik I – Java 5-44 Variablen und Variablennamen • Ohne Deklaration kann keine Variable initialisiert werden. • Ohne Initialisierung kann keine Variable weiterverarbeitet werden, z.B. in Ausdrücken. • Veränderung des Wertes einer Variablen durch Zuweisung • Variablennamen (sowie alle Bezeichner in Java) sind case-sensitive, man unterscheidet also zwischen Groß- und Klein-schreibung. • Variablennamen beginnen stets mit Buchstaben (JavaLetter), dann können Buchstaben oder Zahlen folgen. • Der Unterstrich _ gehört aus historischen Gründen auch zu den Buchstaben, kommt aber in der offiziellen Namenskonvention nicht vor, sollte daher nicht verwendet werden. © Klaus Hinrichs Informatik I – Java 5-45 Deklaration • Variablen werden durch den Typ gefolgt von dem Variablennamen deklariert. • Mehrere Variablennamen können durch Kommata getrennt aufgeführt werden, sie sind dann vom gleichen Typ. • Deklarationen sind Anweisungen, die mit Semikolon abgeschlossen werden. • Beispiel: int anzahlPersonen; long mSekSeitGeburt; float groesseInCm, gewichtInKg; String name, wohnort; © Klaus Hinrichs Informatik I – Java 5-46 Initialisierung von Variablen • Initialisierungen werden durch =-Operator realisiert, der rechte Wert wird dem linken zugewiesen. Beide Seiten des = müssen den gleichen Typ haben. Initialisierungen werden mit Semikolon ; abgeschlossen. • Beispiel: anzahlPersonen = 20; mSekSeitGeburt = 568000000000L; groesseInCm = 185F; name = "Hans Mustermann"; • Deklarationen und Initialisierungen können in einer Zeile erfolgen. Mehrere Deklarationen vom gleichen Typ können durch Kommata voneinander getrennt werden. • Beispiel: float groesseInCm = 185, gewichtInKg = 79; String name = "Hans Mustermann"; © Klaus Hinrichs Informatik I – Java 5-47 Typenkonversionen (Type Casting) • Datentypen byte und short haben keine eigenen Literale. • Es muß das Literal von int genommen werden und der Wert nach byte bzw. short konvertiert werden (casting). • Dies geschieht durch vorangestellte runde Klammern (Cast-Operator). • Beispiel: byte alterInJahren; alterInJahren = (byte)18; © Klaus Hinrichs Informatik I – Java 5-48 5.4.2 Aufruf von Objekten, einfacher Nachrichtenaustausch • Konstruktoren: Aktivitäten bei Objekterzeugung • Referenzen als Verweise auf Objekte • Garbage Collection • Übergabe von Parametern an Methoden • Klassenattribute / Klassenmethoden • Namensraum – Überladen von Methoden – Überdecken von Attributen • Vertiefung OO-Programm = Mehrere Objekte + Nachrichtenaustausch – Aufgaben verteilen ("Spezialisten") © Klaus Hinrichs Informatik I – Java 5-49 Konstruktoren … • Konstruktor – Methode, die für das Durchführen von Arbeiten bei Erzeugung eines Objektes aufgerufen wird. – Methode umfaßt Folge von Anweisungen, die abzuarbeiten sind. – Methodenname stimmt mit dem Klassennamen überein: Methodenname = Klassenname – Wird in der Regel benutzt, um Attribute zu initialisieren. – Konstruktoren besitzen keinen Rückgabewert (auch nicht void). – Überladen von Konstruktoren ist möglich. class Girokonto { ... public Girokonto() { kontostand = 0; ... } } © Klaus Hinrichs Informatik I – Java 5-50 … Konstruktoren … • Argumente der Konstruktormethode werden bei Objekterzeugung durch new Klassenname(Arg1, Arg2, ...) an den Konstruktor übergeben. class Girokonto { ... public Girokonto(int kontostand) { this.kontostand = kontostand; ... } public Girokonto() { kontostand = 0; ... } } © Klaus Hinrichs Informatik I – Java 5-51 … Konstruktoren Girokonto k1 = new Girokonto(); Girokonto k2 = new Girokonto(1000); • Ohne Angabe eines Konstruktors ist nur der leere Konstruktor ohne Argumente definiert. • Ist ein (nicht leerer) Konstruktor definiert, muß der leere Konstruktor explizit definiert werden, um noch benutzt werden zu dürfen. © Klaus Hinrichs Informatik I – Java 5-52 Referenzen auf Objekte … • Bei primitiven Datentypen enthält eine Variable direkt den Inhalt (z. B. einen int-Zahlenwert). • Bei Objekten von Klassen symbolisiert die Variable nur eine Referenz (einen Verweis) auf das Objekt. • Es können auch mehrere Referenzen auf ein Objekt zeigen. • Eine Referenz kann auch leer sein, null ist das Schlüsselwort für die leere Referenz. Girokonto k = null; © Klaus Hinrichs Informatik I – Java 5-53 … Referenzen auf Objekte • Mit dem ==-Operator kann man zwei Referenzen auf Gleichheit testen oder abfragen, ob eine Referenz leer ist: Girokonto k1 = new Girokonto(); Girokonto k; ... Girokonto k2 = k1; ... if (k1 == k2) System.out.println("k1 = k2"); ... if (k == null) System.out.println("k = null"); © Klaus Hinrichs Informatik I – Java 5-54 Garbage Collection • Ist die letzte Referenz auf ein Objekt verschwunden, wird das Objekt der Garbage Collection zugeführt ! es sind keine free- oder deleteMethoden nötig! • Dies funktioniert auch, falls sich Objekte gegenseitig noch zyklisch referenzieren! • Mit System.gc(); wird eine Empfehlung an die Garbage Collection ausgegeben, aktiv zu werden, in der Regel ist dies aber nicht nötig. © Klaus Hinrichs Informatik I – Java 5-55 Klassenattribute • Attribute und Methoden gehören zu Objekten (also Instanzen) einer Klasse. • Aber: es gibt Klassenattribute und Klassenmethoden, die nicht zu Instanzen (also Objekten) gehören, sondern zu den Klassen selbst. • Attribute, die für jedes Objekt neue Instanzen bilden, heißen Instanzvariablen (Standardfall). • Werden Attribute mit static gekennzeichnet, handelt es sich um Klassenvariablen, die für die gesamte Klasse nur eine Instanz besitzen. • Klassenvariablen existieren auch ohne die Existenz eines Objektes. Auf sie kann durch Klassenname.Attributname zugegriffen werden. © Klaus Hinrichs Informatik I – Java 5-56 Klassenmethoden • Methoden, die ausschließlich auf Klassenvariablen zurückgreifen, dürfen mit static gekennzeichnet werden, sie heißen Klassenmethoden. Klassenmethoden dürfen auch nur Klassenmethoden benutzen. • Klassenmethoden können auch ohne Existenz eines Objektes mit Klassenname.Methodenname(...) aufgerufen werden. • Die main()-Methode ist eine Klassenmethode, da zu Beginn noch keine Objekte erzeugt wurden © Klaus Hinrichs Informatik I – Java 5-57 Beispiel class Demo { int a; static int b; public static void main(String[] args) { a = 1; // nicht erlaubt b = 1; // erlaubt test(); // nicht erlaubt new Demo().test(); // erlaubt test2(); // erlaubt new Demo().test2(); // erlaubt } void test() { a = 2; // erlaubt b = 2; // erlaubt } static void test2() { b = 3; } Demo d = new Demo(); d.a = 1; //erlaubt d.b = 1; //erlaubt Demo.a = 1; //nicht erlaubt Demo.b = 1; //erlaubt Demo.test(); //nicht erlaubt Demo.test2(); //erlaubt } © Klaus Hinrichs Informatik I – Java 5-58 Überladen von Methoden • Wunsch für Methoden / Attribute: Gleiche Namen für gleiche Zwecke – z. B. Girokonto erzeugen ohne / mit einem initialem Kontostand. • Benutzt werden sollen Methoden mit gleichen Namen • Problem: Wie diese Methoden auseinanderhalten? • Idee: Unterscheide anhand Parameter-Typen, d.h. Methoden gleichen Namens müssen sich im Typ von mindestens einem Parameter oder in der Anzahl der Parameter unterscheiden. zahle(int betrag); zahle(int betrag, String verwendungszweck); • Unterschiedliche Methoden müssen sich im Methodennamen oder in der Übergabeparameterliste (oder in beidem) unterscheiden. • Hat eine Klasse mehrere Methoden mit identischem Namen, so nennt man diese Methode überladen. • In unterschiedlichen Klassen dürfen auch Methoden mit identischem Namen und identischen Übergabeparameterlisten deklariert werden. © Klaus Hinrichs Informatik I – Java 5-59 Überdecken von Attributen • Verwenden von Variablen mit bereits benutzten Namen • Zugreifen auf überdeckte Attribute über this public class Girokonto { private int kontostand; // in Pfennigen gerechnet … public void setzeKontostand(int kontostand) { this.kontostand = kontostand; } … } • Variablendeklarationen in Methoden überdecken die Attribute der Klasse. • Die Attribute sind nur überdeckt, nicht überschrieben. • Auf Attribute der Klasse kann dann über das Schlüsselwort this bzw. den Klassennamen zugegriffen werden. • this ist eine Referenz auf das zur Methode zugehörende Objekt. © Klaus Hinrichs Informatik I – Java 5-60 Zusammenspiel zwischen Objekten • In einem OO-System kooperieren Objekte, um gemeinsam eine Aufgabe zu lösen. • Jede Klasse kann etwas besonders gut (Spezialist) – z. B. Klasse "Girokonto" für Umgang mit Girokonten • Beim Erstellen eines OO-Systems müssen Spezialisten ausgemacht werden – z. B. Erweiterung um Währungsrechnen © Klaus Hinrichs Informatik I – Java 5-61 Übung: Zusammenspiel von Objekten ... Lernziele • Zusammenspiel mehrerer Objekte, Überladen von Namen • Weg von Anforderungstext zu einer neuen Klasse • Ändern einer bestehenden Klasse Aufgabe • Entwerfen und implementieren Sie eine Klasse Waehrungsrechner für das Umrechnen: 100 EuroCent ~ 200 Pfennige - Überlegen Sie, ob diese Klasse Attribute besitzen muß? Welche könnte sie besitzen? - Ergänzen Sie zwei Methoden int konvInPfennig(int eurocent) int konvInEuroCent(int pfennige) © Klaus Hinrichs Informatik I – Java ! Fortsetzung 5-62 Übung: Zusammenspiel von Objekten • Die Klasse Girokonto soll angepaßt werden: – Einem Girokonto-Objekt soll beim Erzeugen stets ein "individueller" Währungsrechner übergeben werden können, der für Konvertierungen benutzt wird. – Verstecken Sie nach außen, daß der Kontostand intern stets in EuroCent gespeichert und jede andere Währung konvertiert wird (Information-Hiding). © Klaus Hinrichs Informatik I – Java 5-63 Übung: Zusammenspiel von Objekten public class Waehrungsrechner { private int euroFaktor; public Waehrungsrechner(){ euroFaktor = 2; } public int konvInEuroCent(int pfennige) { int euroCent = pfennige / euroFaktor; return (euroCent); } public int konvInPfennig(int euroCent) { int pfennige = euroCent * euroFaktor; return (pfennige); } } public class Girokonto { private int kontostand = 0; private Waehrungsrechner wr; public Girokonto(Waehrungsrechner wr) { this.wr = wr; } © Klaus Hinrichs Informatik I – Java ! Fortsetzung 5-64 Übung: Änderungen in "Girokonto" public Girokonto(Waehrungsrechner wr, int kontostandPfennige) { this.wr = wr; // Umrechnen des Betrags in EuroCent: int euroCent = wr.konvInEuroCent(kontostandPfennige); this.kontostand = euroCent; // Kontostand aktualisieren } public void zahle(int pfennige) { // Umrechnen des Betrags in EuroCent: int euroCent = wr.konvInEuroCent(pfennige); // Kontostand aktualisieren: kontostand = kontostand + euroCent; } public int holeKontostand() { // Umrechnen des aktuellen Kontostandes in Pfennige: int pfennige = wr.konvInPfennig(kontostand); return (pfennige); } } © Klaus Hinrichs Informatik I – Java 5-65 5.4.3 Operatoren, Ausdrücke, Zuweisungen • Ausdrücke sind mehrere durch Operatoren und Klammern verknüpfte Variablen oder Literale Beispiel: 5 * a + 7 * (3 - b) ist ein (in diesem Fall arithmetischer) Ausdruck. • Ausdrücke haben Ergebnisse eines bestimmten Typs, dieses Ergebnis kann einer Variablen zugewiesen werden. Beispiel: c = 5 * a + 7 * (3 - b); © Klaus Hinrichs Informatik I – Java 5-66 Arithmetische Operatoren … • Arithmetische Operatoren: Bildung arithmetischer Ausdrücke • Arithmetische Operatoren in Java: – Addition + und Subtraktion – – Multiplikation * und Division / – Restbildung ("modulo") % • Zusätzlich: – einstellige Operatoren – Inkrement- und Dekrement-Operatoren mit Nebeneffekten Informatik I – Java © Klaus Hinrichs 5-67 … Arithmetische Operatoren Operator Bezeichnung Bedeutung +a ist synonym mit a + Positives Vorzeichen - Negatives Vorzeichen -a kehrt das Vorzeichen um + Summe a + b ergibt die Summe von a und b - Differenz a - b ergibt die Differenz von a und b * Produkt a * b ergibt das Produkt von a und b / Quotient a / b ergibt den Quotienten von a und b % Rest a % b ergibt den bei Division von a und b entstehenden Rest ++ Präinkrement ++a ergibt a + 1 und erhöht a um 1 ++ Postinkrement a++ ergibt a und erhöht a um 1 -- Prädekrement --a ergibt a - 1 und erniedrigt a um 1 -- Postdekrement a-- ergibt a und erniedrigt a um 1 © Klaus Hinrichs Informatik I – Java 5-68 Postfix- und Präfix-Increment und Decrement • Inkrement- und Dekrementoperatoren erhöhen, bzw. erniedrigen eine Variable um 1, der Wert der Variable wird zurückgegeben. • ++ ist der Inkrement- und -- der Dekrementoperator. • Steht der Operator vor der Variablen (Präfix), so wird die Variable zuerst erhöht (bzw. erniedrigt) und dann das Ergebnis zurückgegeben. int a = 5; int b = ++a; gleichbedeutend mit a = a + 1; b = a; Ergebnis: a == 6 b == 6 • Steht der Operator hinter der Variablen (Postfix), so wird zuerst das Ergebnis der Variablen zurückgegeben, bevor sie erhöht (bzw. erniedrigt) wird. int a = 5; int b = a++; gleichbedeutend mit b = a; a = a + 1; Ergebnis: a == 6 b == 5 © Klaus Hinrichs Informatik I – Java 5-69 Arithmetische Operatoren + - * / % • Arithmetische Operatoren sind Infix-Operatoren • Es gibt Addition +, Subtraktion -, Multiplikation *, Division / und Modulo-Division % • Modulo-Division bedeutet Divisionsrest, also 11 / 3 = 3, Rest 2, damit ist 11 % 3 gleich 2 • Arithmetische Operatoren lassen sich (auch in gemischter Form) auf Variablen und Ausdrücke der Typen char, byte, int, long, float und double anwenden. • Divisionen durch Null sind nur für die Typen float und double direkt erlaubt, bei char, byte, int und long wird eine Exception geworfen (später ausführlicher). © Klaus Hinrichs Informatik I – Java 5-70 Ergebnistypen bei arithmetischen Operatoren … + - * / % char byte short int long float double char int int int int long float double byte int int int int long float double short int int int int long float double int int int int int long float double long long long long long long float double float float float float float float float double double double double double double double double double © Klaus Hinrichs Informatik I – Java 5-71 … Ergebnistypen bei arithmetischen Operatoren • Beispiel: public class Test { public static void main(String[] args){ short a, b, c; // Deklaration int d; a = 7; // Initialisierung b = 8; c = a + b; // Zuweisung unzulässig d = a + b; // Zuweisung zulässig } } // class Test Fehlermeldung zur Compilezeit: Test.java:7: possible loss of precision found : int required: short c = a + b; ^ 1 error © Klaus Hinrichs Informatik I – Java 5-72 Implizite Typkonvertierung • Bei einer Zuweisung muß der Ergebnistyp des Ausdrucks mit dem der Variablen übereinstimmen, es sei denn, implizite Typkonvertierungen sind erlaubt. • Implizite Typkonvertierungen sind in der Regel in Richtung "umfassenderer" Typen erlaubt: byte short int long float double char • Hinweis: char nach short wäre prinzipiell verlustfrei möglich, ist aber dennoch unzulässig! • Achtung: Wandlung von long nach float eventuell verlustbehaftet! double a; // Deklarationen und Initialisierungen double b = 10.0; int c = 10; a = c; // Zuweisung erlaubt c = b; // Zuweisung nicht erlaubt © Klaus Hinrichs Informatik I – Java 5-73 Explizite Typkonvertierung (Cast) … • Explizite Typkonvertierungen sind durch Cast (typ) möglich. • Beispiel: double b = 10.0; int c; c = (int) b; // Zuweisung erlaubt, da Typ gewandelt • Typkonvertierungen sind in der Regel verlustbehaftet! • Bei Verlusten weder Fehlermeldungen noch Warnungen zur Laufzeit! • Beispiel: Typkonvertierung von short nach byte (hier ohne Verlust) 0000000000110001 16 Bit, Wert entspricht 49 00110001 8 Bit, Wert entspricht 49 1111111111110001 16 Bit, Wert entspricht -15 11110001 © Klaus Hinrichs 8 Bit, Wert entspricht -15 Informatik I – Java 5-74 … Explizite Typkonvertierung (Cast) • Beispiel: Typwandlung von short nach byte (hier mit Verlust) 0000001000000010 16 Bit, Wert entspricht 514 00000010 8 Bit, Wert entspricht 2 Programm: short a = 514; // Typwandlung von short nach byte byte b = (byte) a; System.out.println(b); Ausgabe: 2 Informatik I – Java © Klaus Hinrichs 5-75 Vergleichsoperatoren … • Vergleichen von Ausdrücken • Ergebnistyp stets boolean • In Java: Operator Bezeichnung Bedeutung == gleich a == b gibt true, wenn a gleich b ist. Im Falle von Referenztypen ist der Rückgabewert true, wenn a und b auf dasselbe Objekt zeigen. != ungleich a != b gibt true, wenn a ungleich b ist. Im Falle von Referenztypen ist der Rückgabewert true, wenn a und b auf unterschiedliche Objekte zeigen. > größer a > b gibt true, wenn a größer b ist. < kleiner a < b gibt true, wenn a kleiner b ist. >= größer gleich a >= b gibt true, wenn a größer oder gleich b ist. <= kleiner gleich a <= b gibt true, wenn a kleiner oder gleich b ist. © Klaus Hinrichs Informatik I – Java 5-76 … Vergleichsoperatoren • Achtung: Gleichheitstest == nicht mit Zuweisung = verwechseln! • Vergleich nicht für String geeignet! • Beispiel: int x = 3, y = 4, z = 7; bool b = (x + y == z); System.out.println(b); Ausgabe: true © Klaus Hinrichs Informatik I – Java 5-77 Zuweisungsoperatoren … • Setzen des Wertes einer Variablen • = ist der Operator für die Standardzuweisung • Es gibt viele Zuweisungen mit Nebeneffekten: += , -= , *= , /= , %= , ^= , &= , |= , <<= , >>= und >>> a += b; gleichbedeutend mit a = a + b; a -= b; gleichbedeutend mit a = a - b; a *= b; gleichbedeutend mit a = a * b; • Beispiel: int a = 3, b = 5; a += b; System.out.println(a); Ausgabe: 8 © Klaus Hinrichs Informatik I – Java 5-78 … Zuweisungsoperatoren Operator Bezeichnung Bedeutung = Einfache Zuweisung a = b weist a den Wert von b zu und liefert b als Rückgabewert. += Additionszuweisung a += b weist a den Wert von a + b zu und liefert a + b als Rückgabewert. -= Subtraktionszuweisung a -= b weist a den Wert von a - b zu und liefert a - b als Rückgabewert. *= Mutiplikationszuweisung a *= b weist a den Wert von a * b zu und liefert a * b als Rückgabewert. /= Divisionszuweisung a /= b weist a den Wert von a / b zu und liefert a / b als Rückgabewert. %= Modulozuweisung a %= b weist a den Wert von a % b zu und liefert a % b als Rückgabewert. &= UND-Zuweisung a &= b weist a den Wert von a & b zu und liefert a & b als Rückgabewert. |= ODER-Zuweisung a |= b weist a den Wert von a | b zu und liefert a | b als Rückgabewert. ^= EXKLUSIV-ODER-Zuweisung a ^= b weist a den Wert von a ^ b zu und liefert a © Klaus Hinrichs ^ b als Rückgabewert. Informatik I – Java 5-79 Logische Operatoren … • Vergleichen boolescher Werte in Java: – mit Short-Circuit-Evaluation (SCE) (Kurzschluß-Auswertung ! sequentielles oder konditionales " bzw. #) UND ("): && ODER (#): || – ohne Short-Circuit-Evalutation UND ("): & ODER (#): | – Zusätzlich: logisches NICHT (¬): ! EXKLUSIV-ODER: ^ © Klaus Hinrichs Informatik I – Java 5-80 … Logische Operatoren Operator Bezeichnung ! Bedeutung Logisches NICHT !a ergibt false, wenn a den Wert true hat, und true, wenn a den Wert false hat. UND mit SCE a && b ergibt true, wenn sowohl a als auch b den Wert true haben, ansonsten false. Hat a bereits den Wert false, so wird false zurückgegeben und b nicht mehr ausgewertet. & UND ohne SCE a & b ergibt true, wenn sowohl a als auch b den Wert true haben, ansonsten false. Beide Teilausdrücke werden ausgewertet. || ODER mit SCE a || b ergibt true, wenn mindestens einer der beiden Ausdrücke a oder b den Wert true hat, ansonsten false. Hat a bereits den Wert true, so wird true zurückgegeben und b nicht mehr ausgewertet. | ODER ohne SCE a | b ergibt true, wenn mindestens einer der beiden Ausdrücke a oder b den Wert true hat, ansonsten false. Beide Teilausdrücke werden ausgewertet. ^ EXKLUSIVODER a ^ b ergibt true, wenn a und b unterschiedliche Werte haben, ansonsten false && Informatik I – Java © Klaus Hinrichs 5-81 Bitweise AND, OR, XOR … • Vergleich der einzelnen Bits zweier ganzer Zahlen • Für alle ganzzahligen primitiven Datentypen • Es gibt "bitweise UND" bzw. AND (&), "bitweise inklusiv ODER" bzw. OR (|) und "bitweise exclusiv ODER" bzw. XOR (^) © Klaus Hinrichs & 0 1 | 0 1 ^ 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 Informatik I – Java 5-82 … Bitweise AND, OR, XOR • Für jede Position der Bitdarstellung der beiden Eingabezahlen wird ein Bit berechnet und in der Bitdarstellung der Ergebniszahl an derselben Position abgelegt. Beispiel: 00000011 00001001 ======== entspricht 3 entspricht 9 AND: 00000001 entspricht 1 OR: 00001011 entspricht 11 XOR: 00001010 entspricht 10 Programm: byte a = 3, b = 9; System.out.println(a & b); System.out.println(a | b); System.out.println(a ^ b); © Klaus Hinrichs Ausgabe: 1 11 10 Informatik I – Java 5-83 Verschiebeoperatoren … • Durch Verschiebeoperatoren können Bitdarstellungen von Ganzzahldatentypen nach links bzw. rechts verschoben werden. • Links vom Operator steht der zu verschiebende Wert und rechts die Anzahl der Bits, um die verschoben werden soll. • << ist der Links-Shift-Operator • >> und >>> sind Rechts-Shift-Operatoren. • Bei << und >>> wird jeweils die Null nachgeschoben, bei >> das Vorzeichenbit. • a << n entspricht einer Multiplikation mit 2n und a >> n entspricht einer Division durch 2n ! Geschwindigkeitsvorteile! © Klaus Hinrichs Informatik I – Java 5-84 … Verschiebeoperatoren • Beispiel: a a << 1 a >> 1 a >>> 1 ~a 00000000000000000000000000000011 00000000000000000000000000000110 00000000000000000000000000000001 00000000000000000000000000000001 11111111111111111111111111111100 3 6 1 1 -4 a a << 1 a >> 1 a >>> 1 ~a 11111111111111111111111111111110 11111111111111111111111111111100 11111111111111111111111111111111 01111111111111111111111111111111 00000000000000000000000000000001 -2 -4 -1 2147483647 1 © Klaus Hinrichs Informatik I – Java 5-85 String-Konkatenation • Der Operator + kann verwendet werden, um zwei Objekte der Klasse String zu verknüpfen. • Ist nur einer der Operanden ein Objekt der Klasse String, und ein anderer ein primitiver Datentyp, wird letzterer nach String gewandelt. • Beispiel: int alter = 27; System.out.println("Alter: " + alter + " Jahre"); Ausgabe: Alter: 27 Jahre © Klaus Hinrichs Informatik I – Java 5-86 Unäre Operatoren • Unäre Operatoren werden immer vor einen Ausdruck gestellt. • Es gibt Plus- und Minusvorzeichen (+) und (-), sowie logische (!) und bitweise (~) Verneinung. • Vorzeichen und bitweise Verneinung werden für Ganzzahldatentypen verwendet, die logische Verneinung für den Datentyp boolean. © Klaus Hinrichs Informatik I – Java 5-87 Konditionaler Operator ? … • Mit bedingten Ausdrücken der Form Bool-Ausdruck ? Ausdruck1 : Ausdruck2 lassen sich Alternativen in Ausdrücken beschreiben. • Bool-Ausdruck muß einen Wert vom Typ boolean ergeben, Ausdruck1 und Ausdruck2 sind zwei Ausdrücke mit Wert vom gleichen Typ und müssen zuweisungskompatibel sein. • Ist Bool-Ausdruck gleich true, so wird Ausdruck1 ausgewertet und der Wert zurückgegeben, sonst Ausdruck2. © Klaus Hinrichs Informatik I – Java 5-88 … Konditionaler Operator ? • Beispiel 1: int alter = 17; System.out.println(alter >= 18 ? "alt" : "jung"); Ausgabe: jung • Beispiel 2: int alter = 18; double beitrag = ((alter >= 18) ? 200 : 100); System.out.println("Beitrag: " + beitrag); Ausgabe: Beitrag: 200 © Klaus Hinrichs Informatik I – Java 5-89 Operator-Prioritäten • Die Standard-Richtung für die Auswertung von Operatoren ist von links nach rechts. • Zuweisungsoperatoren werden von rechts nach links ausgewertet. • Operatoren unterliegen einer Prioritätenhierarchie, analog der Punktvor Strich-Regel $ der Ausdruck 5 + 3 * 3 + 1 repräsentiert den Wert 15, da die Multiplikation höhere Priorität hat. • Operatoren mit höchster Priorität werden zuerst ausgewertet. • Durch Klammerung mit runden Klammern ( und ) kann die vorgegebene Hierarchie überwunden werden. © Klaus Hinrichs Informatik I – Java 5-90 Operator-Prioritäten Priorität Kategorie Operatoren 0 Zuweisung 1 2 3 4 5 6 7 8 9 10 11 12 Bedingungsoperator logisches Oder logisches Und bitweise Oder bitweise exkl. Oder bitweise Und Vergleichsop. Vergleichsop. Verschiebeop. additive Operatoren multiplikative Op. Erzeugungs- oder Typumwandlungsop. unäre Operatoren Postfix-Operatoren = += -= *= /= %= ^= &= |= <<= >>= >>>= ? : || && | ^ & == != < > <= >= instanceof << >> >>> + – * / % new (type)expr ++expr --expr +expr -expr ~ ! [] . expr++ expr-- 13 14 © Klaus Hinrichs Informatik I – Java 5-91 Operator-Prioritäten: Beispiele … int a, b = 2; a = b << 1 + 2; Addition hat höhere Priorität als Verschiebeoperatoren. Es wird daher zunächst 1 + 2 ausgewertet und der Wert von b dann um 3 Bits nach links verschoben, man erhält also 16. Dieser Wert wird dann der Variablen a zugewiesen, denn der Zuweisungsoperator hat die niedrigste Priorität. int a, b = 2; a = (b << 1) + 2; Auf Grund der Klammerung wird die Verschiebung zuerst durchgeführt. b um ein Bit nach links verschoben ergibt 4. Dann wird 2 aufaddiert und das Ergebnis 6 der Variablen a zugewiesen. © Klaus Hinrichs Informatik I – Java 5-92 … Operator-Prioritäten: Beispiele int a = 5, b; a += b = 8; Auswertungsreihenfolge von rechts nach links Zunächst wird b die Zahl 8 zugewiesen, dann wird der neue Wert von b auf a aufaddiert, a erhält also den Wert 13. (a += b) = 8; Fehler: Auswertreihenfolge läßt sich nicht verändern, denn Ausdrücke dürfen nie links von einer Zuweisung stehen. © Klaus Hinrichs Informatik I – Java 5-93 5.4.4 Anweisungen • Programme bestehen aus Klassen. • Eine der Klassen eines Programms hat eine Methode namens main, mit der die Programmausführung beginnt. • Danach werden in der Regel Objekte erzeugt, die dann für bestimmte Aufgaben zuständig sind. • Die Kommunikation zwischen den Objekten erfolgt über den Aufruf von Methoden / das Versenden von Nachrichten. • Was innerhalb einer Methode passiert, wird durch Anweisungen festgelegt. Bereits bekannte Grundbausteine der Anweisungen: – Literale und Variable – Operatoren • Algorithmus (also die Verarbeitungsvorschrift), der durch eine Methode realisiert wird, wird durch eine Menge von Anweisungen beschrieben. • Die Arten von Anweisungen, die hierfür verwendet werden, diskutieren wir im folgenden. • Danach kennen wir dann alle Grundbestandteile von Java-Programmen! © Klaus Hinrichs Informatik I – Java 5-94 Anweisungen … • Anweisungen (außer Blöcken) werden durch ; voneinander getrennt. • Blöcke sind Sequenzen von Anweisungen, in der Regel geklammert mit {}. Blöcke werden nicht durch ; voneinander getrennt. { konto.zahle(+100); konto.zahle(+30); { konto.zahle(-20); Anweisung1; } Anweisung2; ... } © Klaus Hinrichs Informatik I – Java 5-95 … Anweisungen • Deklarationen bzw. Initialisierungen innerhalb von Blöcken sind nur innerhalb dieser gültig. • Auch die bereits bekannten - Zuweisungen - Deklarationen und Initialisierungen sind Anweisungen. • "Einfache" Anweisungen werden der Reihenfolge nach abgearbeitet. • Blöcke, Bedingungen, Schleifen und Sprünge sind Anweisungen, die den Kontrollfluß beeinflussen und komplexere Strukturen als Ausdrücke beschreiben. © Klaus Hinrichs Informatik I – Java 5-96 Sichtbarkeit in Blöcken • Da Deklarationen außerhalb eines Blocks nicht bekannt sind, stellt sich bei Attributen und Variablen, die in mehreren Blöcken namensgleich deklariert werden, die Frage, auf welches Attribut durch einen Attributnamen Bezug genommen wird. • Der Zugriff auf die "falschen" Attribute ist eine häufige Fehlerursache. • Generelle Regel für Sichtbarkeit: – Suche zunächst im aktuellen (also inneren) Block nach dem Attribut, – wird es dort nicht gefunden, überprüfe schrittweise umgebende Blöcke, bis ein entsprechend benanntes Attribut gefunden wird. • Besonders verwirrend kann dabei sein, daß Attribute und Variable erst ab der Deklarationsanweisung bekannt sind. © Klaus Hinrichs Informatik I – Java 5-97 Variablen in Blöcken • Im Block deklarierte Variablen sind nur im Block sichtbar: public void zahle(int betrag) { int alterKontostand = kontostand; { // hier ist alterKontostand sichtbar int neuerKontostand = kontostand + 50000; // ab hier ist auch neuerKontostand sichtbar … System.out.println(neuerKontostand); } // neuerKontostand unsichtbar // alterKontostand sichtbar int neuerKontostand = 1; // ab hier neue Variable neuerKontostand sichtbar kontostand = kontostand + betrag; } © Klaus Hinrichs Informatik I – Java 5-98 if-Anweisung … • Bedingte Verzweigungen dienen zur Auswahl aus zwei Alternativen if (Bool-Ausdruck) Anweisung1; else Anweisung2; • Bool-Ausdruck muß einen Wert vom Typ boolean ergeben. Anweisung1 wird ausgeführt, falls Bool-Ausdruck den Wert true hat, sonst wird Anweisung2 ausgeführt. if (kontostand < 0) System.out.println("Konto überzogen"); else System.out.println("Geld vorhanden"); • Der Teil else Anweisung2 ist optional. Fehlt dieser Teil und liefert Ausdruck false, so wird die if-Anweisung ohne weitere Ausführung verlassen. © Klaus Hinrichs Informatik I – Java 5-99 … if-Anweisung … • Unterschied zum bedingten Ausdruck Bool-Ausdruck ? Ausdruck1 : Ausdruck2 if-else liefert keinen Wert zurück! • Blöcke sind Anweisungen ! mehrere Anweisungen lassen sich innerhalb des if- oder else-Teils gruppieren: if (landeswährung == DM) { neuerBetrag = betrag * 1.96; System.out.println("Guthaben: " + neuerBetrag + " DM"); } else System.out.println("Guthaben: " + betrag + " Euro"); © Klaus Hinrichs Informatik I – Java 5-100 … if-Anweisung • Bedingte Verzweigungen sind selbst auch Anweisungen $ Schachtelung von if-Abfragen möglich: if (beruf == schüler) System.out.println(" Schülertarif"); else if (beruf == rentner) System.out.println(" Rentnertarif"); else System.out.println(" Normaltarif"); © Klaus Hinrichs Informatik I – Java 5-101 switch-Anweisung … • • • • • switch ( Ausdruck ){ case Konstante_1: Anweisungsfolge_1; case Konstante_2: Anweisungsfolge_2; ... default: Anweisungsfolge_n; } Ausdruck ergibt einen Wert vom Typ byte, short, int oder char Konstante_i ist Konstante vom gleichen Typ wie Ausdruck Anweisungsfolge_i ist Folge von Anweisungen, die durch ; voneinander getrennt sind. Zuerst wird Ausdruck ausgewertet. Dann werden alle Anweisungen ab der ersten Konstante, welche gleich dem Wert des Ausdrucks ist, abgearbeitet. Anweisungsfolge_n hinter default: wird auch abgearbeitet, falls keine Konstante gleich dem Wert von Ausdruck ist. Die default-Zeile ist optional. © Klaus Hinrichs Informatik I – Java 5-102 ... switch-Anweisung ... • Kommt die Anweisung break; in einer abzuarbeitenden Anweisungsfolge vor, so wird der gesamte von switch gefolgte Block verlassen. int zensur = 2; switch (zensur) { case 1: System.out.println(" sehr gut"); break; case 2: System.out.println(" gut"); break; ... default: System.out.println("keine Zensur!"); } © Klaus Hinrichs Informatik I – Java 5-103 ... switch-Anweisung ... int month = 2; int year = 2000; int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; © Klaus Hinrichs ! Fortsetzung Informatik I – Java 5-104 ... switch-Anweisung … case 2: if ( ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0) ) numDays = 29; else numDays = 28; break; } System.out.println("Number of Days = " + numDays); © Klaus Hinrichs Informatik I – Java 5-105 ... switch-Anweisung … class Toomany { static void howMany(int k) { switch (k) { case 1: System.out.print("one "); case 2: System.out.print("too "); case 3: System.out.print("many "); } } public static void main(String[] args) { howMany(3); System.out.println(); howMany(2); System.out.println(); howMany(1); System.out.println(); } } Ausgabe: many too many one too many © Klaus Hinrichs Informatik I – Java 5-106 ... switch-Anweisung class Twomany { static void howMany(int k) { switch (k) { case 1: System.out.println("one "); break; // exit the switch case 2: System.out.println("two "); break; // exit the switch case 3: System.out.println("many "); break; // not needed, but good style } } public static void main(String[] args) { howMany(1); howMany(2); howMany(3); } } Ausgabe: one two many © Klaus Hinrichs Informatik I – Java 5-107 Schleifen • Schleifen dienen dazu, die gleiche Anweisung mehrfach durchlaufen zu können. • Diese Anweisung kann auch ein Block sein, also mehrere Anweisungen gruppieren. • Es gibt Abbruch- bzw. Laufbedingungen für Schleifen. • 3 Schleifentypen: – while-Schleife, – do-while -Schleife, – for-Schleife © Klaus Hinrichs Informatik I – Java 5-108 while-Schleife while (Bool-Ausdruck) Anweisung; • Die Laufbedingung Bool-Ausdruck ist vom Typ boolean. • Zunächst wird Bool-Ausdruck ausgewertet. Falls Bool-Ausdruck den Wert true liefert, wird Anweisung abgearbeitet. Dies wiederholt sich solange, bis Bool-Ausdruck den Wert false liefert. • Test erfolgt vor Ausführung der Anweisung! int a = 0; while (a < 100) { System.out.print(a + " "); a = a + 10; }; int a = 100; while (a < 100) { … … }; Ausgabe: 0 10 20 … 90 keine Ausgabe © Klaus Hinrichs Informatik I – Java 5-109 do-while-Schleife do Anweisung while (Bool-Ausdruck); • Test erfolgt nach Ausführung der Anweisung, also mindestens ein Durchlauf! int a = 0; int a = 100; do { do { System.out.print(a + " "); … a = a + 10; … } while (a < 100); } while (a < 100); Ausgabe: 0 10 20 … 90 © Klaus Hinrichs Ausgabe: 100 Informatik I – Java 5-110 for-Schleife … for (Init; Test; Update) Anweisung; • Init ist eine Liste von Ausdrücken, die durch Kommata getrennt sind und als Initialisierung vor Eintritt in die Schleife abgearbeitet (nur einmal!) werden. Typischerweise werden hier Zählervariablen vereinbart. • Test ist die Laufbedingung und muß daher einen Wert vom Typ boolean liefern. Ist das Ergebnis false, wird abgebrochen, ansonsten wird als nächstes mit Anweisung der Schleifenrumpf abgearbeitet. • Update ist eine Liste von Anweisungen, die durch Kommata getrennt sind und immer nach Ausführung des Schleifenrumpfes (Anweisung) ausgeführt werden. • Nach der Auswertung von Test wird die Schleife dann fortgesetzt, wenn Test true liefert. © Klaus Hinrichs Informatik I – Java 5-111 … for-Schleife • Alle Anweisungen können optional weggelassen werden: for (;;) ; liefert Endlosschleife! int i; for (i = 0; i < 3; i++) System.out.println(i); Ausgabe 0 1 2 © Klaus Hinrichs Informatik I – Java 5-112 Markierte Anweisungen • Eine Anweisung kann durch einen Namen markiert werden: Markierung: Anweisung • Markierung ist ein Bezeichner. • Gewöhnlich ist Anweisung ein Block oder eine Schleife. • Mit break Markierung wird Anweisung abgebrochen und mit dem unmittelbar auf Anweisung Folgenden fortgefahren. • continue Markierung wird nur bei Schleifen benutzt und bewirkt die Beendigung der gegenwärtigen Iteration des Schleifenrumpfes. • Markierung ist nur innerhalb der markierten Anweisung (Block, Schleife o. ä.) sichtbar. • Innerhalb von Bedingungs- und Zählschleifen kann break und continue ohne Markierung verwendet werden. Hier wird die innerste umgebende Schleife als markiert betrachtet. • Sprunganweisungen sind in der Regel ein Anzeichen schlechter Strukturierung, sie sollten vermieden werden. • Es gibt keine allgemeine Sprunganweisung (goto)! © Klaus Hinrichs Informatik I – Java 5-113 Markierte Anweisungen marke1: for (i = 1; i < 6; i++) { marke2: for (j = 1; j < 4; j++) { System.out.println(i +"/"+ j); if (i == 2) break marke2; // Äquivalent zu break; if (i == 4) Ausgabe: 1 / 1 continue marke1; 1 / 2 } 1 / 3 System.out.println("====="); ===== 2 / 1 } ===== 3 / 1 3 / 2 3 / 3 ===== 4 / 1 5 / 1 5 / 2 5 / 3 ===== © Klaus Hinrichs Informatik I – Java 5-114 Sichtbarkeit { a test ... int a; test: for (a = 0; a < 100; a++) { int b; for (int c = 0; c < a; c++) { System.out.println(a * c); } } int d = 7; System.out.println(a * d); b c d } • x ist sichtbar in Block © Klaus Hinrichs Informatik I – Java 5-115