Kapitel 2, Teil 1

Werbung
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
Herunterladen