1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Teil II Objektorientierte Programmierung in Java 12 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 1. Erste Java-Programme public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!");} } 13 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Schritte zur Ausführung • Java SE (JDK 6 Update 21) http://www.oracle.com/technetwork/java/javase/downloads/jdk6-jsp-136632.html (oder andere Entwicklungsumgebung) besorgen und installieren (u.a. Pfade richtig setzen!) • Klasse mit Editor erstellen und in Datei HelloWorld.java speichern • Compilieren: javac HelloWorld.java erzeugt HelloWorld.class (Byte-Code, Zwischencode) • Ausführen: java HelloWorld führt die Methode main der Hauptklasse aus 14 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Grundbegriffe der Objektorientierung • ein Java-Programm besteht aus mehreren Klassen • zu jeder Klasse gibt es Objekte (Instanzen) • alle Instanzen der gleichen Klasse haben gleiche Struktur (Attribute, Variablen) und gleiches Verhalten (Methoden) • jedem Attribut ist ein Wertebereich (wie z.B. ganze Zahl (int), Gleitkommazahl (float) oder Verweis auf ein Nachbarobjekt) zugeordnet • jedes Attribut kann nur einen Wert des zugehörigen Wertebereichs annehmen • ein Objekt hat eine Identität (OID) (Mehrfachverweise möglich; Objekte mit gleichem Zustand ggfs. ungleich) 15 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Klassendiagramme • Klassen und deren Beziehungen werden durch Klassendiagramme visualisiert • Klasse: dargestellt durch Rechteck (unterteilt in Name, Attribute und Methoden) • eine (Nachbarschaft-)Beziehung (Assoziation) zwischen zwei Klassen wird dargestellt durch Linie zwischen den zugehörigen Rechtecken Beispiel: Konto saldo getSaldo setSaldo ueberweise Klasse Name Attribute Methoden 16 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 1.1 Beispiel: SimpelBank in Java public class Konto{ // Attribute private int saldo; // Methoden, hier: Kontruktor, getter und setter, ueberweise public Konto(int betrag){ saldo = betrag;} // Zuweisung public int getSaldo(){ return saldo;} // Rueckgabeanweisung public void setSaldo(int betrag){ saldo = betrag;} public void ueberweise(Konto ziel, int betrag){ saldo = saldo - betrag; ziel.setSaldo(ziel.getSaldo() + betrag);} //Methodenaufrufe } 17 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Beispiel: SimpelBank in Java (Fortsetzung) public class SimpelBank{ public static void main(String[] args){ Konto konto1 = new Konto(50); Konto konto2 = new Konto(80); System.out.println("alter Saldo von Kunde 1: " + konto1.getSaldo()); System.out.println("alter Saldo von Kunde 2: " + konto2.getSaldo()); konto1.ueberweise(konto2,10); System.out.println("neuer Saldo von Kunde 1: " + konto1.getSaldo()); System.out.println("neuer Saldo von Kunde 2: " + konto2.getSaldo());} } 18 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Syntax und Semantik • jedes Sprachkonstrukt hat eine Syntax und eine Semantik • Syntax: Wie sieht das Konstrukt aus? • Semantik: Was bedeutet es? • die Syntax wird oft beschrieben durch (endlich viele) Regeln in erweiterter Backus-Naur-Form (EBNF) (s.u.) • Beschreibung der Semantik: • präzise mathematisch (vgl. Kapitel 4) oder • weniger präzise in natürlicher Sprache (hier: Deutsch) 19 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Erweiterte Backus-Naur-Form • EBNF-Regel hat Gestalt (Syntax): hNichtterminali ::= hEBNF-Ausdrucki wobei ein hEBNF-Ausdrucki wie folgt aufgebaut sein kann: (metasprachliche Erläuterungen selbst in EBNF) hEBNF-Ausdrucki ::= hEBNF-Ausdrucki ::= hNichtterminali hTerminali hEBNF-Ausdrucki ::= hEBNF-Ausdrucki∗ // beliebig häufige Wiederholung (auch 0) hEBNF-Ausdrucki ::= hEBNF-Ausdrucki? // optionaler Ausdruck (0 oder 1 Mal) hEBNF-Ausdrucki ::= hEBNF-Ausdrucki+ // mindestens einmalige Wiederholung hEBNF-Ausdrucki ::= hEBNF-Ausdrucki | hEBNF-Ausdrucki ::= hEBNF-Ausdrucki // Alternative (hEBNF-Ausdrucki) // Klammern klären Zusammengehörigkeit • zu jedem Nichtterminal: weitere EBNF-Regeln, die den syntaktischen Aufbau des hierdurch beschriebenen Konstrukts festlegen • Terminale werden nicht durch weitere Regeln beschrieben, sondern so verwendet, “wie sie in dem EBNF-Ausdruck vorkommen” 20 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Klassendeklaration • im Beispiel: SimpelBank und Konto • allgemeine Syntax (im folgenden generell vereinfacht): hKlassei ::= hSichtbarkeiti class hKlassennamei{ hAttribut-Deklarationi∗ hMethodei∗ } • Semantik: legt Struktur (Attribute) und Verhalten (Methoden) jedes Objekts der Klasse fest 21 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Attribut-Deklaration • Beispiel: private int saldo; • Syntax: hAttribut-Deklarationi ::= hSichtbarkeiti hTypi hAttributnamei (= hAusdrucki)? ; • Semantik: • reserviert benannten Speicherplatz in jedem Objekt der zugehörigen Klasse • dieser Speicherplatz kann nur Werte des angegebenen Typs aufnehmen • Initialisierung optional 22 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Sichtbarkeit und Namen hSichtbarkeiti ::= private | public | . . . • Sichtbarkeitsangaben regeln die Zugriffsrechte auf eine Variable bzw. Methode • private: nur Methoden der betrachteten Klasse dürfen zugreifen • public: von überall her darf zugegriffen werden (bei Attributen vermeiden!) hKlassennamei, hAttributnamei, hMethodennamei, sonstige Namen: Buchstabe gefolgt von Buchstaben und Ziffern 23 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Typen hTypi ::= int | float | hKlassennamei | . . . • Speicherplätze enthalten Bitfolgen • die gleiche Bitfolge kann (semantisch) unterschiedlich interpretiert werden • z.B.: 2.0 (float) und 1073741824 (int) durch gleiche Bitfolge repräsentiert • der Typ legt fest, wie die Bitfolge zu interpretieren ist 24 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Methodendeklarationen • Beispiel: public int getSaldo(){return saldo;} • Syntax: hMethodei ::= hSichtbarkeiti(hTypi| void)? hMethodennamei (hParameterlistei) { hAnweisungi∗ } • Semantik: • stellt für die Objekte der Klasse eine benannte, parametrisierte Anweisungsfolge zur Verfügung • durch Methodenaufruf (s.u.): Anweisungsfolge wird ausgeführt • das Ergebnis ist vom angegebenen Typ (oder fehlt: void) wobei hParameterlistei ::= (hParameteri (, hParameteri)∗ )? hParameteri ::= hTypi hParameternamei 25 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Anweisungen • Syntax: hAnweisungi ::= hZuweisungi | hRückgabeanweisungi | hAusdrucki? ; | { hAnweisungi∗ } | hVariablen-Deklarationi | . . . • Semantik: • s. Zuweisung, Rückgabeanweisung, . . . • wird ein Ausdruck als Anweisung verwendet, so interessieren nur die bei seiner Auswertung auftretenden Seiteneffekte (z.B. Ein-/Ausgaben); der berechnete Wert wird ignoriert • Anweisungsfolgen werden von links nach rechts (oben nach unten) ausgeführt 26 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Zuweisungen • Beispiele: • saldo = betrag; • saldo = saldo + 1; • Syntax: hZuweisungi ::= hAttributnamei = hAusdrucki; • Semantik: • der Ausdruck wird ausgerechnet, • der erhaltene Wert wird in dem mit hAttributnamei benannten Speicherplatz des betrachteten Objekts abgelegt • Achtung: Zuweisung nicht verwechseln mit math. Gleichung! 27 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Rückgabeanweisungen • Beispiel: return saldo; • Syntax: hRückgabeanweisungi ::= return hAusdrucki?; • Semantik: • Rückgabeanweisungen kommen nur in der Anweisungsfolge einer Methode vor • der Ausdruck wird ausgerechnet und • als Ergebnis des Aufrufs der zugehörigen Methode geliefert • der Typ dieses Werts muss dem aus der zugehörigen Methodendeklaration entsprechen 28 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Ausdrücke • Beispiele: • Konstanten, z.B. 2 oder 2.0 • i+j, konto1.getSaldo() • Syntax: hAusdrucki ::= hKonstantei | hVariablei | hMethodenaufrufi | (hAusdrucki) | hAusdrucki hOperationssysmboli hAusdrucki • Semantik: • der Wert einer numerischen Konstanten ist “die Konstante selber” • der Wert einer Variablen (inkl. Attribut und Parameter) findet sich im zugehörigen Speicherplatz • bei zusammengesetzten Ausdrücken: • die Teilausdrücke werden ausgewertet • die so erhaltenen Werte werden gemäß des Operationssymbols verknüpft • Beispiele für Operationssymbole: +, -, *, /, <<, !=, && 29 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Methodenaufrufe • Beispiele: konto1.getSaldo() konto1.setSaldo(10) • Syntax: hMethodenaufrufi ::= (hAusdrucki.)? hMethodennamei( (hAusdrucki (, hAusdrucki)∗ )?) • Semantik: (call by value) • der Ausdruck vor . wird ausgewertet und muss eine Objektreferenz liefern • die übrigen Ausdrücke werden ausgewertet • ihre Werte werden den Parameter-Variablen zugeordnet, die in der zugehörigen Methodendeklaration vorkommen • die zur Methode gehörige Anweisungsfolge wird ausgeführt • hierbei wird auf die Attribute des ermittelten Objekts zugegriffen • Abarbeitung endet i.d.R. bei Erreichen einer Rückgabeanweisung • Wert eines Methodenaufrufs: in Rückgabeanweisung angegebener Wert 30 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Beispiel: Methodenaufruf mit call-by-value-Semantik public class Testcbv{ private static int k = 3; public static void foo(int i, int j){ System.out.print("i: "+ i); i = i+j; System.out.print(", i: "+ i);} public static void main(String argv[]){ foo(k,k+2); System.out.println(", k: "+ k);} } liefert: i: 3, i: 8, k: 3 31 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Deklaration lokaler Variablen • lokale Variablen werden in einer Anweisungsfolge (einer Methode) deklariert • die Deklaration enspricht syntaktisch der von Attributen, jedoch ohne Sichtbarkeitsangabe • Beispiel: Konto konto1= new Konto(50); • Syntax: hVariablen-Deklarationi ::= hTypi hVariablennamei (= hAusdrucki)? ; • Semantik: • reserviert benannten Speicherplatz, der nur während der Abarbeitung der zugehörigen Anweisungsfolge bereitsteht • außerhalb der Anweisungsfolge ist die Variable unbekannt 32 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Konstruktoren • ein Konstruktor ist eine spezielle Methode ohne Ergebnistyp (auch nicht void) • jeder Konstruktor einer Klasse heißt genau wie die Klasse • der Ausdruck: new hKonstruktori((hAusdrucki (, hAusdrucki)∗ )?) liefert ein neues Objekt der zugehörigen Klasse • Beispiel: new Konto(50) • beim Anlegen dieses Objekts werden die Anweisungen des Konstruktors ausgeführt • zu jeder Klasse kann es mehrere Konstruktoren mit unterschiedlichen Parametertypen geben • hat eine Klasse keinen Konstruktor, so wird ein trivialer Konstruktor ohne Parameter automatisch ergänzt 33 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 1.2 Beispiel: Verwandschaft public class Person{ // Attribute (inkl. Assoziationen) private String name; private Person vater; private Person mutter; // keine Verknüfung mit Kindern // Methoden public Person(String n, Person v, Person m){ name = n; vater = v; mutter = m;} public String getName(){return name;} Multiplizitäten Assoziation 2 Person name getName * getVater getMutter grosseltern main public Person getVater(){return vater;} public Person getMutter(){return mutter;} ... 34 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP public void grosseltern(){ if (vater != null){ if (vater.getMutter() != null) System.out.println(vater.getMutter().getName()); if (vater.getVater() != null) System.out.println(vater.getVater().getName());} if (mutter != null){ if (mutter.getMutter() != null) System.out.println(mutter.getMutter().getName()); if (mutter.getVater() != null) System.out.println(mutter.getVater().getName());}} public static void main(String[] args){ Person adam = new Person("Adam",null,null); Person eva = new Person("Eva",null,null); Person seth = new Person("Seth",adam,eva); Person lamech = new Person("Lamech",seth,null); Person noah = new Person("Noah",lamech,null); seth.grosseltern(); lamech.grosseltern(); noah.grosseltern();} } 35 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Neue Konstrukte im Verwandschaft-Beispiel • bedingte Anweisung (if) • Typen boolean und String 36 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Weitere Typen hTypi ::= . . . | boolean | String • der Typ boolean umfasst die Wahrheitswerte true und false • String ist kein Basistyp (wie z.B. int und boolean) sondern eine Klasse • eine String-Objekt repräsentiert eine Zeichenkette • Stringkonstanten (Literale) werden in Anführungszeichen eingeschlossen • Strings können durch + verkettet werden • Beispiel: "Dies ist ein " + "verketteter String" 37 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Bedingte Anweisung (Verzweigung) • Beispiele: • if (vater != null){...} • if (x > y) max = x; else max = y; • Syntax: hAnweisungi ::= hif-Anweisungi | . . . hif-Anweisungi ::= if ( hAusdrucki ) hAnweisungi (else hAnweisungi)? • Semantik: • der Ausdruck muss vom Typ boolean sein • falls die Auswertung des Ausdrucks true liefert, wird die erste Anweisung ausgeführt • falls sie false liefert, die zweite Anweisung (sofern vorhanden) • im Zweifel gehört ein else-Zweig zum innersten if • Beispiel: if (x>=0) if (x>0) x = 0; else x = 1; 38 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 2. Basistypen und Basisoperationen • Java unterstützt die folgenden Basistypen Ganze Zahlen Bits Bereich byte 8 -128 .. 127 short 16 -32768 .. 32767 int 32 -231 .. (231 − 1) long 64 -263 .. (263 − 1), z.B. 42L float 32 +/- 3.4E+38 .. +/- 1.4E-45 double 64 +/- 1.7E+308 .. +/-4.9E-324 char 16 Unicode-Zeichen boolean ? true, false Gleitkommazahlen sonstige 39 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Arithmetische Operationen (auf Zahlen) • binär (infix): +,-,*,/,% • unär: --,++ (präfix oder postfix), +,• Beispiele: x * (-1), x++, ++x, 1 + 1.0 (liefert: 2.0) 40 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Relationale Operationen • binär, infix • >,<,>=,<=,==,!=,instanceof • Ergebnistyp: boolean • Vor.: Operanden haben “kompatiblen Typ” • Beispiel: x >= 0, konto1 instanceof Konto 41 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Boolesche Operationen • Operanden und Ergebnis boolean • binär (infix): &&: nicht-striktes “und” 2. Argument wird nur ausgewertet, wenn 1. Argument true ||: nicht-striktes “oder” 2. Argument wird nur ausgewertet, wenn 1. Argument false &: striktes “und”; beide Argumente werden ausgewertet |: striktes “oder”; beide Argumente werden ausgewertet • unär: !: “nicht”; in Präfixnotation, z.B. ! fertig 42 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Beispiel: Strikte vs. nicht-strikte Operationen 1) if (x > 1 && y % x-- > 0) x = y; 2) if (x > 1 & y % x-- > 0) x = y; • wenn x den Wert 0 hat: 2) Absturz, 1) nicht 43 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Verzweigung auf Ausdruck-Ebene statt: if (x == 0) x = 1; else x = 1/x; auch: x = (x == 0) ? 1 : 1/x; allgemein: hAusdrucki ::= ( hAusdrucki0 ) ? hAusdrucki1 : hAusdrucki2 • falls hAusdrucki0 zu true ausgewertet wird, ist der Wert von hAusdrucki1 das Ergebnis • bei false der von hAusdrucki2 • nur einer von beiden Ausdrücken wird ausgewertet 44 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Bit-Operationen • Vor.: Argumente und Ergebnis byte, short, int oder long • op1 >> op2 bzw. op1 >>> op2 Binärdarstellung von op1 wird um op2 Positionen nach rechts geschoben bei >> Vorzeichen-erhaltend, bei >>> nicht • op1 << op2 Linksshift, analog • weiterhin: & (bitweises “und”), | (bitweises “oder”), ^ (bitweises “xor”), ˜ (bitweises Komplement, unär) • geeignet zur effizienten Implementierung von Mengenoperationen • Beispiele: 7>>1 = ˆ 3, 6&3 = ˆ 2, -7>>1 = ˆ -4, -7>>>1 = ˆ 2147483644 45 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Zuweisungsoperationen • Grundform: x = e • außerdem: x += e = ˆ x = x + e • analog: -=, *=, /=, %=, &=, |=, ^=, <<=, >>= • Beispiele: • x += 1 = ˆ x = x + 1 = ˆ x++ • x *= 2 = ˆ x = x * 2 46 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Operatorpräzedenz Operation [] . (params) expr++ expr-++expr --expr +expr -expr ˜ ! new (type)expr * / % +<< >> >>> < > <= >= instanceof == != • absteigende Präzedenz, z.B. -x+y*2 == z<<1 && !b = ˆ & ^ | (((-x)+(y*2)) == (z<<1)) && (!b) && || ?: = += usw. 47 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Konstanten • werden Attribute als final gekennzeichnet, so ist ihr Wert unveränderlich • sie entsprechen damit benannten Konstanten • Beispiel: private final int mehrwertSteuer = 19; • zur besseren Verständlichkeit und Wartungsfreundlichkeit sollten in Anweisungen keine unbenannten Konstanten (außer 0, 1, 2 u.ä.) verwendet werden Beispiel: brutto = netto * (mehrwertSteuer + 100)/100; 48 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Fallen der Rechnerarithmetik • Rechnerarithmetik ist i.allg. nicht assoziativ Beispiel: 4.0 * 8E+307 /2.0 → Infinity 4.0 * (8E+307 /2.0) → 1.6E+308 • bei Gleitkomma-Arithmetik entstehen Rundungsfehler • ⇒ Gleitkommazahlen nicht auf gleich oder ungleich testen! Beispiel: statt: if (x != 1.0) ... besser: final double epsilon = 0.0001; ... if (Math.abs(x - 1.0) > epsilon) ... 49 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 3. Felder (Arrays) Motivation • häufig: viele gleichartige public class FirmaNaiv{ private int umsatzM1; Daten private int umsatzM2; ... • naiv und umständlich: private int umsatzM12; jeweils eigene Variable public int jahresUmsatz(){ • Beispiel: int summe = 0; summe += umsatzM1; summe += umsatzM2; ... summe += umsatzM12; return summe;} // weitere Methoden } 50 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Jahresumsatz-Beispiel mit Arrays public class Firma{ private int[] umsatz = new int[12]; public int jahresUmsatz(){ int summe = 0; for (int i = 0; i < umsatz.length; i++) summe += umsatz[i]; return summe;} // weitere Methoden } 51 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Eigenschaften von Arrays • verwendet bei mehreren gleichartigen Daten (Vor.: feste oder begrenzte Anzahl) • Zugriff auf Element über Index, z.B. umsatz[i] • zugehörige Kontrollstruktur meist for-Schleife (s.u.) • für ein Array a liefert a.length die Anzahl der Elemente • der Indexbereich läuft von 0 bis a.length-1 • Achtung: Indexbereich nicht verlassen! • ein Arrayelement kann wie eine Variable verwendet werden • new hTypi[n] erzeugt ein Array mit n Elementen vom angegeben Typ 52 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Erweiterungen der Syntax • hTypi ::= hTypi[hAusdrucki?] | . . . • hAusdrucki ::= hArraynamei[hAusdrucki] | new hTypi . . . • hZuweisungi::= hArraynamei[hAusdrucki] hZuweisungsoperatori hAusdrucki; | ... 53 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Zuweisung von Arrays • bei einer Zuweisung von Arrays werden nicht die Elemente sondern nur der Verweis auf das Array kopiert • beide Arrays arbeiten im folgenden auf den gleichen Speicherplätzen, Beispiel: int[] a = new int[12]; // erzeugt ein Array; a verweist darauf a[5] = 42; int[] b; // erzeugt einen Verweis auf ein Array, aber kein Array b = a; // jetzt verweisen a und b auf das gleiche Array System.out.println("b[5]:"+b[5]); // liefert 42 b[5] = 56; System.out.println("a[5]:"+a[5]); // liefert 56 54 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Zählschleifen • Idee: eine Anweisung wird wiederholt ausgeführt • Beispiel: for (int i=1; i <= n; i++) fakultaet *= i; • geeignet, wenn Anzahl der Schleifendurchläufe vorab bekannt • Syntax: hAnweisungi ::= hfor-Schleifei | . . . hfor-Schleifei ::= for ( hAusdrucki0 ; hAusdrucki1 ; hAusdrucki2 ) hAnweisungi 55 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Semantik der Zählschleife • Initialisierung: • hAusdrucki0 wird am Anfang der Schleife ausgewertet • typischerweise wird hierbei eine Zählvariable (bereitgestellt und) initialisiert • Abbruchbedingung: • hAusdrucki1 muss boolean sein • er wird vor jeder Abarbeitung der Anweisung ausgewertet • liefert hAusdrucki1 den Wert false, wird die Schleife beendet • anderfalls wird die Anweisung ein (weiteres) Mal ausgeführt • ist hAusdrucki1 direkt false, wird die Anweisung nie ausgeführt • Inkrementierung: • hAusdrucki2 wird nach jeder Abarbeitung der Anweisung ausgewertet • typischerweise wird hier die Zählvariable hochgezählt 56 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP 4. Kontrollstrukturen • bestimmen, in welcher Reihenfolge Anweisungen ausgeführt werden • elementare Anweisung: Zuweisung, Methodenaufruf, Variablendeklaration • Sequenz • Verzweigung: if, Mehrfachverzweigung (switch) • Schleife: for-, while- und do-while-Schleife • Rekursion • Exceptions (später) • Threads (später) 57 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Mehrfachverzweigung Beispiel: int wochentag; ... switch (wochentag){ case 1: System.out.println(" vormittags" ); case 2: case 3: case 4: case 5: System.out.println(" geöffnet" ); break; default: System.out.println(" geschlossen" );} • Syntax: hAnweisungi ::= hswitch-Anweisungi | break ; | . . . hswitch-Anweisungi ::= switch ( hAusdrucki ) { hFalli+ (default : hAnweisungi∗ )? } hFalli ::= case hKonstantei : hAnweisungi∗ 58 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Semantik der Mehrfachverzweigung • der Ausdruck muss vom Typ int sein • die Konstanten müssen (unbenannte) ganze Zahlen sein • zunächst wird der Ausdruck ausgewertet • dann wird der Fall ermittelt, dessen Konstante dem erhaltenen Wert entspricht • die Anweisungen dieses Falls und der folgenden Fälle (!) werden sukzessiv abgearbeitet, bis eine break-Anweisung erreicht wird • durch eine break-Anweisung wird die switch-Anweisung beendet (und die hierauf folgende Anweisung bearbeitet) • wird kein passender Fall gefunden, so werden die Anweisungen des default-Falls ausgeführt (sofern vorhanden) 59 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP while-Schleife Beispiel: while (x >= y) x = x - y; Bem.: Beispiel berechnet x mod y (für x>0, y>0) • geeignet bei komplizierter Abbruchbedingung und wenn #Durchläufe unbekannt • Syntax: hAnweisungi ::= hwhile-Anweisungi | hdo-while-Anweisungi | . . . hwhile-Anweisungi ::= while ( hAusdrucki ) hAnweisungi • Semantik: • solange der (boolesche) Ausdruck true liefert, wird die Anweisung ausgeführt (ggfs. gar nicht) • die Überprüfung findet vor Ausführung der Anweisung statt 60 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP do-while-Schleife Beispiel: do x = x - y; while (x >= y); • geeignet, wenn #Durchläufe vorab unbekannt aber > 0 • Syntax: hdo-while-Anweisungi ::= do hAnweisungi while hAusdrucki ; • Semantik: • führt die Anweisung aus, solange der (boolesche) Ausdruck true liefert (mindestens ein Mal) • die Überprüfung findet nach Ausführung der Anweisung statt 61 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Rekursion • oft lässt sich die Lösung eines Problems auf die Lösung eines gleichartigen (“kleineren”) Problems zurückführen • hierzu eignen sich rekursive (sich selbst aufrufende) Methoden Beispiel: Türme von Hanoi public static void turm(int n, int quelle, int ziel, int hilf){ if (n >= 1) { turm(n-1,quelle,hilf,ziel); System.out.println("von " +quelle+ " nach " +ziel); turm(n-1,hilf,ziel,quelle);}} Aufruf z.B. turm(2,1,3,2) 62 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Weiterführung des Verwandschaft-Beispiels public class Person{ private String name; private Person vater; private Person mutter; private Person[] kind = new Person[10]; private int kinder = 0; public Person(String n, Person v, Person m){ name = n; vater = v; mutter = m; if (vater != null) vater.addKind(this); if (mutter != null) mutter.addKind(this);} public void addKind(Person neugeboren){kind[kinder++] = neugeboren;} //getName, getVater, getMutter wie bisher; vorfahren, nachkommen s.u. public static void main(String[] args){ // Person adam, eva, seth, lamech, noah wie bisher noah.vorfahren(); eva.nachkommen();} } 63 1.Bsp Typen Feld Kontr. OO GUI IK Exc. Gen. Loop Box Enum Junit Datei Wert GC Applet Thread GP Weiterführung des Verwandschaft-Beispiels (2) public void vorfahren(){ if (vater != null){ System.out.println(vater.getName()); vater.vorfahren();} if (mutter != null){ System.out.println(mutter.getName()); mutter.vorfahren();}} public void nachkommen(){ for(int i=0; i<kinder; i++){ System.out.println(kind[i].getName()); kind[i].nachkommen();}} 64