Java Syntax

Werbung
Java Schulung
Objektorientierte Programmierung in Java
Teil II: Java Grundlagen und Syntax
Prof. Dr. Nikolaus Wulff
Agenda: Java Grundlagen
Java Syntax
Java Datentypen
Kontrollstrukturen
Klassen und Objekte
Überschreiben/Überladen von Methoden
Sichtbarkeit
Behandlung von Ausnahmen (Exceptions)
Die wichtigsten Java Pakete
Prof. Dr. Nikolaus Wulff
2
Abstrakte Datentypen
Klassen sind die logische Erweiterung des Konzepts des ADT.
In prozeduralen Sprachen werden ADT's durch Records (Pascal), Structs
(C), Common-Blöcke (Fortran) oder Copy-Strecken (Cobol/PL1)
realisiert.
Dies sind jedoch lediglich reine Datencontainer.
In der Objektorientierung werden diese ADT's um die Deklaration der
möglichen, erlaubten Manipulationen erweitert.
Klasse  Daten + Methoden
Ein Objekt ist eine Instanz einer Klasse
Der entsprechende Speicherplatz für die Daten ist alloziiert und die
Methoden können auf diese zugreifen.
Prof. Dr. Nikolaus Wulff
3
Kapselung
Kapselung
Kapselung bedeutet, daß auf alle nicht exportierten Eigenschaften eines
Objekts von außen nicht direkt zugegriffen werden kann.
Wird die konkrete Repräsentation des Zustands verborgen, spricht man
auch vom Geheimnisprinzip (Information Hiding, nach [Parnas72]).
Kapselung heißt auch, daß die Signatur und das abstrakte Verhalten einer
Operation bekannt ist, die Implementation aber verborgen bleibt.
Nicht alle oo Programmiersprachen realisieren die
Kapselung von Zustand und Implementationen geeignet.
Prof. Dr. Nikolaus Wulff
4
Eine Klasse in Java
Blockanfang
public class Sparbuch {
public void auszahlen( float betrag )
{ ...
}
public void einzahlen( float betrag )
{ ...
}
public void berechneZinsen()
{ ...
}
}
Für jede Klasse wird in
Java eine eigene Datei
angelegt.
Beispiel: Sparbuch.java
Operationen,
(Methoden, Routinen)
private float saldo;
private float zinssatz;
Attribute
Blockende
Prof. Dr. Nikolaus Wulff
5
Hauptprogramm
Die Virtual-Machine wird unter Angabe eines Klassennamens gestartet. In dieser
Klasse wird nach einer statischen Operation mit eine bestimmten Signatur
gesucht, nämlich: public static void main(String[] args).
Eine solche Operation kann es auch mehrfach in unterschiedlichen Klassen geben.
Je nachdem welches main() gestartet werden soll, wird der entsprechende
Klassenname der Virtual-Maschine übergeben.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, world");
}
}
Prof. Dr. Nikolaus Wulff
6
Konstruktoren
Um dem Programmierer zu ermöglichen, die Initalisierung der
Variablen eines Objekts zu beeinflussen, gibt es in Java die
Möglichkeit, sogenannte Konstruktoren zu vereinbaren. Sie werden
automatisch aufgerufen, wenn ein Objekt erzeugt wird. Konstruktoren
sind Operationen, die den gleichen Namen wie die Klasse haben.
Einschränkungen
Konstruktoren dürfen keinen Rückgabetyp besitzen.
"Nicht einmal" void.
Sie können vom Programmierer nicht explizit
aufgerufen werden. Sie werden vom Compiler
automatisch eingefügt, sobald er auf eine Codezeile
trifft, in der ein neues Objekt erzeugt wird.
Prof. Dr. Nikolaus Wulff
7
Objekte erzeugen
Objekte müssen zur Laufzeit durch einen expliziten Ausdruck erzeugt werden. Dazu
wird der Konstruktor mit dem Schlüsselwort new verwendet.
Sparbuch einUrlaubssparbuch = new Sparbuch();
Sparbuch einNotgroschen = new Sparbuch();
Wird eine Variable mit dem Typ einer Klasse deklariert, so hat sie solange den
Initialwert null, bis ihr ein Objekt zugewiesen wird.
Sparbuch einUrlaubssparbuch;
// null
Sparbuch einNotgroschen;
// null
einUrlaubssparbuch = new Sparbuch();
einNotgroschen = einUrlaubssparbuch;
Prof. Dr. Nikolaus Wulff
8
Schlüsselworte
Beachte: case-sensitive!
abstract default
boolean do
break
double
byte
else
case
extends
catch
final
char
finally
class
float
const* for
continue goto*
if
implements
import
instanceof
int
interface
long
native
new
package
private
throw
protected
throws
public
transient
return
try
short
void
static
volatile
super
while
switch
synchronized
this
* momentan nicht genutzt
Keine Schlüsselworte: true, false, null
Neu ab JDK1.4: assert
Neu ab JDK1.5: enum
Prof. Dr. Nikolaus Wulff
9
Java Konventionen
Bezeichner: Neue Wörter beginnen mit Großbuchstaben. Keine Unterstriche
zur Trennung verwenden. Also nicht drucke_kunden, sondern
druckeKunden.
Klassennamen beginnen mit einem Großbuchstaben, z.B. Girokonto.
Operationsnamen beginnen mit einem Kleinbuchstaben, z.B. zahleEin.
Einige Entwickler lassen Attributnamen mit einem Unterstrich beginnen,
z.B. _saldo. (Aber bitte einheitlich!)
Nach jeder öffnenden und vor jeder schließenden geschweiften Klammer
eine neue Zeile beginnen.
Optional: Vor jeder öffnenden geschweiften Klammer eine neue Zeile
beginnen.
Nach jeder öffnenden geschweiften Klammer eine Einrückung vornehmen.
Vor der schließenden geschweiften Klammer diese Einrückung wieder
zurücknehmen.
Pro Anweisung eine Zeile.
Moderne IDE's ermöglichen automatische Formatierung.
Prof. Dr. Nikolaus Wulff
10
Java Bean Konvention
In Java werden Attribute durch getXXX und setXXX Operationen
gelesen bzw. gesetzt.
Arrays werden entsprechend mit getXXX(int index) und
setXXX(int index, Object val) angesprochen.
Für boolean Attribute kann optional auch die Operation isXXX statt
getXXX verwendet werden.
Tools (IDE's und Generatoren) sowie die Java Reflection API verwenden
diese Konvention!
D.h. eine Klasse mit einer Eigenschaft XYZ hat eine entsprechende
public XYZ getXYZ() Methode für den lesenden Zugriff und eine
public void setXYZ (XYZ v) Methode für schreibenden Zugriff.
Diese Namenskonvention ist für den Entwickler bindend (insbesondere
set und get, gibX und setzeX ist nicht konform!) .
Prof. Dr. Nikolaus Wulff
11
Elementare Typen
Imperative und objektorientierte Programmiersprachen bieten i.d.R. einen
Satz elementarer Typen an:
Natürliche Zahlen (Integer)
reale Zahlen (Float oder Real)
Zeichen (char)
und Wahrheitswerte (boolean).
Java verfügt über eine Reihe von elementaren Typen (basic oder
primitive types): int, short, long, float, double,
byte, boolean und char.
Der Typ einer Variable legt fest
die Wertemenge (z.b. int nur ganze Zahlen) und
die zulässigen Operationen (z.B. int Addieren, Subtrahieren)
Prof. Dr. Nikolaus Wulff
12
Basisdatentypen und Literale
Escape Sequenzen
Wahrheitswerte (boolean):
Konstanten: true, false
\b
/* backspace
\t
/* horizontal tab
Zeichen (char):
\n
/* line feed
Konstanten: ´o´, ´\t´,
\f
/* form feed
´\u78ab´ (Unicode hexadezimal)
\r
/* carriage return
Zeichenketten (String):
\"
/* double quote "
Konstanten: “Hallo“,
\'
/* simple quote '
“Hello“ + “ “ + “World\n“
\\
/* backslash \
ganze Zahlen:
Konstanten: 47, 47890L (long), 077 (oktal), 07777L (oktal long),
0x89ab (hexadezimal), 0XC0B0L (hex long)
Fließkommazahlen:
Konstanten: 3.141F, 6.02E23, 6.02E23F, 6.02E23D
Prof. Dr. Nikolaus Wulff
13
*/
*/
*/
*/
*/
*/
*/
*/
Die numerischen Datentypen
numerische Datentypen:
Jede prozedurale Programmierspache bietet elementaren numerischen Datentypen
mit den zugehörigen Operationen an.
Die Wertebereiche dieser Datentypen sind meist maschinenabhängig, was die
Übertragbarkeit von Programmen erschwert.
In Java sind die elementaren Datentypen systemunabhängig festgelegt.
Typ
byte
short
int
long
Größe
1 Byte
2 Bytes
4 Bytes
8 Bytes
float 4 Bytes
double 8 Bytes
Prof. Dr. Nikolaus Wulff
Wertebereich
-128 bis 127
-32.768 bis 32.767
-2.147.483.648 bis 2.147.483.647
-9.223.372.036.854.775.808 bis
9.223.372.036.854.775.807
1,40239846*10-45 bis 3,40282347*1038
4,94065645841246544*10-324 bis
1,79769313486231570*10308
14
Basisdatentypen vs. Klassen (1)
Für einige Typen existieren sowohl Basisdatentypen als auch Klassen, z.B.
int (Basisdatentyp) und Integer (Klasse).
Auf den Basisdatentypen sind mathematische Operationen vordefiniert,
z.B. +, -, *, \.
Die Klassen bieten weitere Methoden zur Manipulation an, z.B.
Integer.parseInt(“89“) zum Umwandeln einer Zeichenkette in
eine Zahl.
Werte der Basisdatentypen sind keine Objekte (Superklasse Object) und
können daher an einigen Stellen nicht verwendet werden. Beispiele:
Vector, Hashtable.
Vector v = new Vector();
// Vektor von Objekten
v.addElement(1);
// Fehler 1 ist kein Objekt
v.addElement(new Integer(1)); // o.k.
Seit JDK1.5 gibt es „autboxing“ 1 wird in Integer(1) verwandelt und
addElement(1) funktioniert automatisch...
Prof. Dr. Nikolaus Wulff
15
Basisdatentypen vs. Klassen (2)
Literale evaluieren zu Werten von Basisdatentypen, z.B. 1 zu int.
Ausnahme: Zeichenketten werden zu Objekten der Klasse String.
Objekte müssen explizit angelegt werden, z.B. new Integer(1).
public class Int {
private int value;
public Int(int aValue) {
value = aValue;
}
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Prof. Dr. Nikolaus Wulff
16
Basisdatentypen vs. Klassen (3)
Unterschiede beim Vergleich (Wertgleichheit vs. Objektidentität):
1 == 1
new Int(1) != new Int(1)
Unterschiede bei der Zuweisung (Kopie vs.Referenz):
int a = 75;
int b = 100;
b = a;
a = 200;
// b == 75
// a != b
a
b
75
100
a
b
200
75
Int a = new Int(75);
Int b = new Int(100);
b = a; // Objektreferenz wird geändert
a.setValue(200);
// b.getValue() == 200
// a == b
a
b
75
(2)
(1)
Prof. Dr. Nikolaus Wulff
100
a
b
(3)
200
17
Operatoren
Operator Funktion, boolesche
Operator Funktion, arithmetisch
*
/
%
+
++
--
Multiplikation
Division
Modulo
Addition
Subtraktion
Inkrement
Dekrement
!
<
<=
>
>=
&&
||
Der Gleichheitstest wird häufig mit der
Zuweisung verwechselt
saldo = 0;
saldo == 0;
saldo != 0;
Operator
==
!=
=
Funktion
Gleichheit
Ungleichheit
Zuweisung
Prof. Dr. Nikolaus Wulff
logisches NICHT (NOT)
“kleiner als”
“kleiner als oder gleich”
“größer als”
“größer als oder gleich”
logisches UND (AND)
logisches ODER (OR)
// Zuweisung
// Gleichheit
// Ungleichheit
Die Zuweisung liefert in Java ein Ergebnis:
int i, j;
i = j = 0;
// Auswertung von rechts
// nach links
Redundante Operatoren:
saldo++; saldo = saldo + 1;
18
Operationen mit Basisdatentypen
Zusammenziehen von Operationen und Zuweisungen
möglich:
sum = sum + count
sum = sum + 1
sum += count
sum++
Operationen mit Seiteneffekt:
(a != 0) &
((100 / a) > 10)
u.U. Division durch 0
Short Circuit (&& und ||): boolscher Ausdruck wird nur
solange ausgewertet, bis das Ergebnis feststeht:
(a != 0) && ((100 / a) > 10)
Prof. Dr. Nikolaus Wulff
immer o.k.
19
Variablen und Konstanten
Vor ihrer Verwendung müssen Variablen und Konstanten bekanntgemacht, d.h.
deklariert werden.
Das kann an jeder beliebigen Stelle im Source-Code geschehen:
Angabe des Typs, der die Wertemenge und die zulässigen Operationen bestimmt,
Nennung ihres Bezeichners.
Vom Laufzeitsystem wird jede Variable mit einem standardisierten Initialwert belegt.
Optional kann bei der Deklaration ein Initialwert zugewiesen werden.
Syntax in Java:
<VarDeklaration> := <Typ> <Bezeichner>
Beispiel:
int i;
double d = 1.123;
char c = 'a';
Prof. Dr. Nikolaus Wulff
Eine Konstante wird mit dem Schlüsselwort
final deklariert. Bei der Deklaration muß der
Wert der Konstanten angegeben werden.
Beispiel:
final int i = 10;
final double pi = 3.1415; 20
final char a = 'a';
Attribute
Ein Attribut wird in der Klasse im Anschluß an die Operationen oder vor den
Operationen deklariert (Wichtig: einheitliche Konvention im Projekt!). Dies
geschieht durch:
Festlegung der Sichtbarkeit,
Angabe des Typs,
Nennung ihres Bezeichners.
Über die Sichtbarkeit wird festgelegt, ob und wer von Außen auf die
Exemplarvariable zugreifen darf (näheres später).
Auch die Exemplarvariablen können mit einem Initialwert versehen werden.
Syntax in Java:
<VarDeklaration> := <Sichtbarkeit> <Typ> <Bezeichner>
Beispiel:
private float zinssatz;
private float saldo = 0.0;
Prof. Dr. Nikolaus Wulff
21
Array
Datentyp, der eine Menge von Elementen des gleichen Typs (Elementtyp)
repräsentiert.
Die Anzahl der Elemente ist fest und heißt Länge des Array.
Der Name einer Array-Variablen bezeichnet den gesamten Array.
Ein einzelnes Array-Element wird durch eine Nummer (Index) identifiziert.
Ein Index ist eine ganze Zahl zwischen 0 und (Länge - 1).
Arrays sind Objekte, es gibt aber keine explizite Array-Klasse(!)
die Größe wird bei Erzeugung des Array-Objektes zur Laufzeit festgelegt. Eine
dynamische Größenänderung ist nicht möglich.
Die Länge des Arrays kann mit length ermittelt werden. length ist keine
Operation, sondern eine Art „Read-Only-Attribut“.
a
0
Index
Prof. Dr. Nikolaus Wulff
a[i]
i
N-1
Länge = N
22
Beispiel: Array
public class Liste {
private int[] array;
private int anzahl;
public Liste()
{
array = new int[10];
anzahl = 0;
}
public void elementHinzufügen(int e){
array[anzahl++] = e;
}
Array des Typs int
deklarieren, ohne
Angabe der Arraygröße
Erzeugen des Array-Objektes
Zuweisung auf ein
Element des Arrays
...
}
Prof. Dr. Nikolaus Wulff
23
Operationen
Die nach Außen sichtbare Schnittstelle eines Objektes wird durch seine
möglichen Operationen bestimmt.
Der Aufruf einer Operation wird häufig auch Nachricht oder Botschaft
genannt.
Beispiel: Der EventService sendet die Nachricht aktualisierePostkorb an die
Postkorb Instanz des Benutzers.
Manchmal werden Operationen auch (etwas künstlich) in Prozeduren und
Funktionen unterteilt.
Prof. Dr. Nikolaus Wulff
24
Deklaration von Prozeduren
Prozeduren sind verändernde bzw. manipulierende Operationen, die den Zustand des
Objektes, mit dem sie gerufen werden, verändern. Eine Operation wird in Java dadurch
als Prozedur gekennzeichnet, daß ihre Deklaration mit void eingeleitet wird.
nach Außen
sichtbar
benutzerdefinierter Bezeichner für die
Prozedur (in Java kleingeschrieben)
public void einzahlen(float betrag );
Parametername
Prozeduren liefern keinen
Rückgabewert
formaler Parameter vom Typ float
Werden mehrere Parameter angegeben, muß für jeden Parameter der Typ
mitgegeben werden. Die Parameter werden durch Komma getrennt.
public void setzeKonditionen(float habenzins, float sollzins);
Prof. Dr. Nikolaus Wulff
25
Deklaration von Funktionen
Funktionen sind sondierende Operationen, die den Zustand des Objektes, mit dem sie
gerufen werden, nicht verändern dürfen. Der Funktionsname steht - im Unterschied zu
einem Prozedurnamen - nicht nur für eine Anweisungsfolge, sondern auch für einen
(Ergebnis-) Wert von einem vereinbarten (Ergebnis-) Typ. Funktionen können deshalb als
Teil von Ausdrücken verwendet werden. Das Funktionsergebnis wird explizit (mittels der
return Anweisung) zurückgegeben.
Rückgabetyp float
benutzerdefinierter Bezeichner
für die Funktion
public float gibSaldo( );
nach Außen
sichtbar
Prof. Dr. Nikolaus Wulff
diese Funktion hat
keine Parameter
26
Klassenimplementation
Die Implementation einer Java-Klasse wird mit der Definition zusammen in
derselben Datei .java durchgeführt. Beispiel: Sparbuch.java
public class Sparbuch {
private float saldo = 0;
Für jedes Argument in der Liste
der Parameter wird gesondert
der Typ angegeben.
public void einzahlen(float wert){ Eine Funktion gibt ihren
Rückgabewert mit return
this.saldo += wert;
zurück.
}
Wo immer im Code der Funktion
public float getSaldo() {
die return-Anweisung steht,
return this.saldo;
wird die Funktion verlassen.
}
Prof. Dr. Nikolaus Wulff
27
Kommentare
Einzeiliger Kommentar:
r = p % q;
// Rest berechnen
Mehrzeiliger Kommentar:
/*
in den Zeilen nach diesem
Kommentar wird der Rest
einer Division berechnet
*/
r = p % q;
Kommentare sind ein wichtiger
Bestandteil eines Programms.
Mittels JavaDoc wird eine HTML
Dokumentation generiert.
Dies erleichtert das Verständniss und
die Wartbarkeit.
Durch entsprechende Tools, wie z.B.
Jalopy, lassen sich Regel zur
Dokumentation einhalten.
Kommentare immer eine logische Abstraktionsebene höher als der Code.
Nicht:
b = (a / 100) * 16; // 16% von a berechnen
Sondern:
b = (a / 100) * 16; // MWSt. berechnen
Prof. Dr. Nikolaus Wulff
28
Ausnahmen
Was passiert bei fehlerhaften Abläufen? Beispielsweise:
Parameter haben falsche oder inkonsistente Werte.
Bedingungen gelten nicht.
Es fehlen Werte.
int teile(int a, int b) {
if (b == 0) { /* ??? */ }
else return a / b;
Was soll hier passieren?
}
Rückgabe von „Fehlerwerten“ (0, -1, null, "", "ERROR") nicht
empfehlenswert, weil bei jedem Aufruf eine Prüfung erfolgen muss:
int ergebnis = teile(8, 0);
if (ergebnis == 0) { /* Fehler */ }
else ...
Prof. Dr. Nikolaus Wulff
29
Erzeugung von Ausnahmen
Ausnahme bedeutet: Die Bearbeitung kann nicht ordnungsgemäß fortgesetzt
werden.
Eine Ausnahme ist ein Objekt.
Auslösen einer Ausnahme:
Konstruktor
if (b == 0)
throw new ArithmeticException();
Ausnahmen können Parameter erhalten, wie bei jedem Konstruktor:
Parameter
if (t == null)
throw new NullPointerException("t==null");
Mit dem throw Konstrukt wird der aktuelle Programmfluß unterbrochen
und die Methode verlassen.
Prof. Dr. Nikolaus Wulff
30
Ausnahmebehandlung
try {
...
Block, der evtl. Ausnahmen auslöst
} catch(ExceptionTyp1 e1) {
...
Behandle die Ausnahmen des Typs ExceptionTyp1
} catch(ExceptionTyp2 e2) {
...
Behandle die Ausnahmen des Typs ExceptionTyp2
}
Beispiel
try {
throw new Exception("Here's my Exception");
} catch(Exception e) {
e.printStackTrace();
}
Prof. Dr. Nikolaus Wulff
31
Einfangen von Ausnahmen
Alle eigenen Ausnahmen werden von der Klasse Exception
abgeleitet.
Exception
MyException1
MyException11
MyException2
try { ...
} catch(MyException1 e) {
...
Behandle die Ausnahmen des Typs
MyException1und der Subklassen
} catch(Exception e) {
...
Behandle
alle weiteren Ausnahmen
}
Achtung: Beim Einfangen einer Ausnahme einer bestimmten
Klasse werden auch alle Ausnahmen von Subklassen
eingefangen.
Prof. Dr. Nikolaus Wulff
32
Ausnahme-Klassenhierarchie
Alle Ausnahmen müssen behandelt werden (in try-catch-Blöcken), bis auf
Ausnahmen der Klasse RuntimeException und deren Subklassen.
Systemfehlermeldungen sind von der Klasse Error abgeleitet.
Throwable
Exception
MyException
Error
RuntimeException
NullPointerException
IlegalArgumentException
Prof. Dr. Nikolaus Wulff
33
Die if-else-Anweisung
Beispiel 1:
if (expression)
statement-1;
else
statement-2;
if (x < 0)
y = -1;
else if (x > 0)
y = 1;
else
y = 0;
Beispiel 2:
if (x > 0)
if (x == 42)
y = 4711;
else
y = 0;
Prof. Dr. Nikolaus Wulff
Beispiel 3:
if (x > 0) {
if (x == 42) {
y = 4711;
} else {
y = 0;
}
}
Vorsicht bei geschachtelten ifAnweisungen: ein else-Zweig
bezieht sich immer auf die
letzte if-Anweisung ohne
else-Zweig.
Explizite Klammerung hilft,
Fehler zu vermeiden !
34
Die for-Schleife
for (init-statement; expression-1; expression-2)
statement;
Beispiel 1:
int fak;
for (fak=6; n > 1; n--)
{
fak = fak * (n - 1)
}
Beispiel 2:
for (;;)
{
/* looping forever ... */
}
Vergleiche eine “saubere”
For-Schleife:
r := 0;
FOR i := 1 TO 99 BY 2
DO r := r + i
END;
Prof. Dr. Nikolaus Wulff
Bei Eintritt in die for-Schleife kann keine
feste Anzahl von Durchläufen garantiert
werden, da der Wert der Laufvariablen
innerhalb des Rumpfes der for-Anweisung
verändert werden darf.
Da expression-2 ein beliebiger Ausdruck
sein kann, ist nicht gewährleistet, daß die
Laufvariable bei jedem Durchlauf erhöht
bzw. erniedrigt wird.
Da expression-1 ein beliebiger Ausdruck
sein kann, ist nicht einmal gewährleistet,
daß die Steuerung und der Abbruch der
Schleife überhaupt mit Hilfe einer
Laufvariablen erfolgt.
35
Beispiel
Wir schreiben ein Programm zur Berechnung der Fakultät.
Ziele:
Anwenden der for-Schleife und des if-Konstrukts.
Kennenlernen des rekursiven Methodenaufruf.
Implementierung einer Fehlerbehandlung.
Def.: a) als Produkt
n
n! :=
Prof. Dr. Nikolaus Wulff
k
k=1
b)
per Rekursion
1! := 1
n! := n*(n-1)!
36
Die switch-Anweisung
Beispiel:
ch = ‘a’;
case label
switch ( ch )
{
case ‘A’:
case ‘a’: a_counter++;
break;
case ‘E’:
case ‘e’: e_counter++;
break;
case ‘I’:
case ‘i’: i_counter++;
break;
case ‘O’
case ‘o’: o_counter++;
break;
case ‘U’:
case ‘u’: u_counter++;
break;
default:
consonant_counter++;
break;
Als case label verwenden wir
Konstanten vom Typ int,
long oder char.
Sei
t JD
auc K1.7 g
hS
t ri n e h t
g
Was passiert, wenn
die break-Anweisung fehlt ?
zwei case label denselben Wert
haben ?
keiner der Fälle zutrifft und die
default-Anweisung fehlt ?
};
Prof. Dr. Nikolaus Wulff
37
Die while- und do-Schleife
Beispiel einer while-Schleife:
r = p
while
{
p
r
}
% q;
(r != 0)
= q; q = r;
= p % q;
Dasselbe Beispiel als do-Schleife:
r = p % q;
if (r != 0)
do
{
p = q; q = r;
r = p % q;
} while (r != 0);
while-Schleifen lassen sich immer
als do-Schleifen formulieren.
Prof. Dr. Nikolaus Wulff
while (expression)
statement;
do
statement;
while (expression)
Vorsicht: die do-Schleife ist genau wie
die while-Schleife eine “SolangeNoch” Schleife. Der Schleifenkörper
wird ausgeführt, solange die Wiederholungsbedingung noch gültig ist.
while-Schleifen testen die Wiederholungsbedingung vor dem ersten
Durchlauf. Ungeschützte do-Schleifen
laufen vor dem Test mindestens einmal
durch.
38
Konvertierungen
Automatisch
short nach int
int nach long
long nach float
float nach double
String
Automatische Konvertierung
mit + Operator.
Z.B. 15 + „ DM“
2 + 11 + „ DM“
„DM „ + 11 + 2
Manuelle Konvertierungen
Explizit casten
Z.B.:
double d = 1.23;
float f = (float) d;
Prof. Dr. Nikolaus Wulff
39
Werkzeuge im JDK
Falls keine IDE zur Verfügung steht...
Java - Interpreter führt Java-Byte-Code aus.
Javac - Compiler für Java-Programme. Übersetzt Java-Quellcode in
Java-Byte-Code.
Jdb - Kommandozeilen-Debugger.
Javap - Disassembler für Java-Byte-Code.
Javadoc - Erzeugt Dokumentation zu Java-Klassen in HTML.
Appletviewer - Führt Applets aus.
Java-Quellen haben die Endung „.java“.
Java-Byte-Code hat die Endung „.class“.
Prof. Dr. Nikolaus Wulff
40
JavaDoc
Die Dokumentation gehört - ebenso wie lauffähige Tests zur Qualitätssicherung eines jeden Projekts!
Dokumentation kann durch Meta-Tags angereichert werden.
Notwendige Kommentarform:
/**
* @author Dr. Nikolaus Wulff
*/
Weitere mögliche Meta-Tags, die von JavaDoc verwendet werden:
@author
@version
@param
@return
@exception
@since
@see
Prof. Dr. Nikolaus Wulff
41
Die JDK API als JavaDoc
Packages
Klassenbeschreibung
Klassen
Prof. Dr. Nikolaus Wulff
42
Beispiel
Entwickelung eines Taschenrechners.
Er bietet die vier grundlegenden Operationen +,-,*,/, die als Zeichen
oder Text (add, sub, mult, div) eingegeben werden können.
Die Ein- und Ausgabe erfolgt per Console.
Prof. Dr. Nikolaus Wulff
43
Beispiel Taschenrechner
Ziele:
Anwenden des switch-case Konstrukts.
Verwendung von Arrays.
Auswerten der Kommandozeile
Erweiterung der Fehlerbehandlung durch das Konzept der
Assertions.
Erstellung einer Dokumentation mit Javadoc.
Prof. Dr. Nikolaus Wulff
44
Hinweis
Trennen Sie das Parsen der Kommandozeile von der Berechnung.
Verzweigen Sie in die eigentliche Berechnung mit einem switch-case
Konstrukt.
Zur Typumwandlung von String nach double die Klasse
java.lang.Double verwenden. In JavaDoc nachschauen...
Geben Sie eine Fehlermeldung bei falschen Argumenten aus.
Prof. Dr. Nikolaus Wulff
45
Herunterladen