Java-Programmierkurs Anweisungen zur Ablaufsteuerung WS 2012/2013 - - PowerPoint PPT Presentation

java programmierkurs
SMART_READER_LITE
LIVE PREVIEW

Java-Programmierkurs Anweisungen zur Ablaufsteuerung WS 2012/2013 - - PowerPoint PPT Presentation

Java-Programmierkurs Anweisungen zur Ablaufsteuerung WS 2012/2013 Prof. Dr. Margarita Esponda-Argero M. Esponda-Argero 1 Anweisungen zur Ablaufsteuerung if switch while do-while for M. Esponda-Argero 2 Anweisungen zur


slide-1
SLIDE 1
  • M. Esponda-Argüero

1

  • Prof. Dr. Margarita Esponda-Argüero

WS 2012/2013 Anweisungen zur Ablaufsteuerung

Java-Programmierkurs

slide-2
SLIDE 2
  • M. Esponda-Argüero

Anweisungen zur Ablaufsteuerung

2

if switch while do-while for

slide-3
SLIDE 3
  • M. Esponda-Argüero

Anweisungen zur Ablaufsteuerung

3

while ( Bedingung ) { Anweisungen } switch ( Ausdruck ) { case Konstante1: Anweisungen break; case Konstante2: Anweisungen break; . . . . . . . usw. default : Anweisungen } if ( Ausdruck ) { Anweisungen } else { Anweisungen } do { Anweisungen } while ( Bedingung ) ; for ( Initialisierung ; Bedingung ; Inkrement ) { Anweisungen }

Semikolon

slide-4
SLIDE 4
  • M. Esponda-Argüero

if-else-Anweisung

4

if (Ausdruck) { Anweisungen } else { Anweisungen }

Wahrheitswert → boolean Runde Klammern

slide-5
SLIDE 5
  • M. Esponda-Argüero

if-else-Anweisung

5

Kontrollfluss

Anweisungen Bedingung Anweisungen Anweisungen falsch wahr

if

Anweisungen Bedingung Anweisungen falsch wahr

if

slide-6
SLIDE 6
  • M. Esponda-Argüero

if-else-Anweisung

6

if( count == max ) { count = 0; } if (a < b) max = b; else max = a; if( count == max ) count = 0;

Am Ende der if-Anweisung ist der Inhalt der Variablen max gleich der größten Zahl zwischen a und b.

slide-7
SLIDE 7
  • M. Esponda-Argüero

if-else-Anweisung

7

if( punkte >= 90 ) { note = 1; } else { if ( punkte >= 80 ) { note = 2; } else { if ( punkte >= 70 ) { note = 3; } else { if ( punkte >= 60 ) { note = 4; } else { note = 5;} } } }

slide-8
SLIDE 8
  • M. Esponda-Argüero

if-else-Anweisung

8

... if( punkte >= 90 ) note = 1; else if ( punkte >= 80 ) note = 2; else if ( punkte >= 70 ) note = 3; else if ( punkte >= 60 ) note = 4; else note = 5; ...

slide-9
SLIDE 9
  • M. Esponda-Argüero

Pathologisches Beispiel

9

count = 13; if (count == 5); { count ++; count += 5; } count--;

;

Kein Semikolon nach der Bedingung! count?

18

slide-10
SLIDE 10
  • M. Esponda-Argüero

10

switch (Ausdruck) { case Konstante1: Anweisungen break; case Konstante2: Anweisungen break; . . . . . . . usw. default : Anweisungen }

switch-Anweisung

slide-11
SLIDE 11
  • M. Esponda-Argüero

switch-Anweisung

11

  • Click to edit Master

text styles

switch ( Ausdruck ) { case Konstante1 : { Anweisung1 Anweisung2 . . . } break; case Konstante2 : Anweisungen break; . . . . . . . usw. default: Anweisungen }

short int long char Die switch-Anweisung erlaubt die Verzweigung in Abhängigkeit vom Wert eines ganzzahligen Ausdrucks, der mit einer Reihe von Konstanten verglichen wird.

slide-12
SLIDE 12
  • M. Esponda-Argüero

switch-Anweisung

12

Kontrollfluss

Beispiel: a = k; switch (a)

case 1: Anweisungen für a=1

ja ja nein nein

Anweisungen für a=2 Anweisungen für a=3 case 2: case 3:

break? break?

slide-13
SLIDE 13
  • M. Esponda-Argüero

switch-Anweisung

13

int zahl; String word; ... switch( zahl ) { case 1: word = "eins"; break; case 2: word = "zwei"; break; case 3: word = "drei"; break; case 4: word = "vier"; break; case 5: word = "fünf"; break; case 6: word = "sechs"; break; case 7: word = "sieben"; break; case 8: word = "acht"; break; case 9: word = "neun"; break; case 0: word = "null"; break; default: word = "error"; }

slide-14
SLIDE 14
  • Click to edit Master

text styles

switch-Anweisung

int monat, jahr, tage; ... switch( monat ) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: tage = 31; break; case 4: case 6: case 9: case 11: tage = 30; break; case 2: if ( jahr % 4 = = 0 && ( jahr % 100 != 0 || jahr % 400 = = 0 ) ) tage = 29; else tage = 28; break; default: System.out.println("falsche Monatsangabe"); }

slide-15
SLIDE 15
  • M. Esponda-Argüero

while-Schleife

15

while (Bedingung) { Anweisungen }

Wahrheitswert → boolean Runde Klammern

slide-16
SLIDE 16
  • M. Esponda-Argüero

16

while-Anweisung

Kontrollfluss Bedingung Anweisungen wahr falsch

while

slide-17
SLIDE 17
  • M. Esponda-Argüero

while-Anweisung

17

public class Gluecksspieler { public static void main( String[] args ){ int bargeld = Integer.parseInt(args[0]); while ( bargeld > 0 ) { if (( (int)(Math.random()*1000)%2)==0) ++bargeld; else

  • -bargeld;

System.out.println( bargeld ); } System.out.println( "You're a big loser! \n" ); } }

slide-18
SLIDE 18
  • M. Esponda-Argüero

Die Math-Klasse

18

static double sin (double a) static double cos (double a) static double tan (double a) static double log (double a) static double pow (double a, double b) static double exp (double a) static double sqrt (double a) static double random () static long round (double a) static double ceil (double a) static double floor (double a) double x,y; . . . .. double zufallszahl = Math.random(); . . . . x = Math.sin (y); . . . . .

Anwendungsbeispiel:

slide-19
SLIDE 19
  • M. Esponda-Argüero

do-while-Anweisung

19

Bei der do-while-Anweisung wird zunächst der Schleifen-Rumpf ausgeführt und anschließend die Bedingung überprüft.

do { Anweisungen } while (Bedingung) ;

slide-20
SLIDE 20
  • M. Esponda-Argüero

do-while-Anweisung

20

Kontrollfluss

Bedingung Anweisungen

wahr falsch

do-while

slide-21
SLIDE 21
  • M. Esponda-Argüero

21

Die Keyboard-Klasse

public static int readInt(); public static double readDouble(); public static boolean readBool(); public static float readFloat(); public static short readShort(); public static long readLong(); public static byte readByte(); public static String readText(); public static BigInteger readBigInteger();

Ohne Gewähr! Einfache Klasse ohne Fehlerbehandlung Die Methoden stürzen ab, wenn die Eingabe mit dem Datentyp der Methoden nicht übereinstimmt.

slide-22
SLIDE 22
  • M. Esponda-Argüero

22

Die Keyboard-Klasse

public class TestKeyboard { public static void main(String[] args ){ int n, factorial = 1; int counter = 0; do{ System.out.print("n = "); n = Keyboard.readInt(); counter = n; while (counter>0){ factorial = factorial * counter; counter--; } System.out.println(n+"! = "+factorial); factorial = 1; } while (n>=0); } }// end of class TestKeyboard 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 1932053504 14! = 1278945280 15! = 2004310016 16! = 2004189184 17! = -288522240

Überlauf!

slide-23
SLIDE 23
  • M. Esponda-Argüero

for-Anweisung

23

  • 3. Nach jedem Durchlauf des Rumpfes wird die Anweisung im

Inkrement einmal ausgeführt und die Bedingung erneut geprüft. for-Schleifen verwenden wir, wenn die Einschränkungen der Schleife (Initialisierung, Bedingung und Inkrementierung) bekannt sind.

for ( Initialisierung ; Bedingung ; Inkrement ) { Anweisungen }

  • 1. Die Initialisierung wird einmal zu Beginn ausgeführt.
  • 2. Der Schleifenrumpf wird ausgeführt, solange die Bedingung

erfüllt ist.

slide-24
SLIDE 24
  • M. Esponda-Argüero

for-Anweisung

24

... for (int i=0; i<=100; i++ ) { System.out.println( i*i ); } ...

Die Initialisierung wird einmal zu Beginn ausgeführt. Vor jedem Durchlauf des Rumpfes wird die Bedingung geprüft. Nach jedem Durchlauf des Rumpfes wird die Anweisung im Inkrement einmal ausgeführt.

slide-25
SLIDE 25
  • M. Esponda-Argüero

for-Anweisung

25

Kontrollfluss

Initialisierung Bedingung Anweisungen

true false for

Inkrement

slide-26
SLIDE 26
  • M. Esponda-Argüero

for-Anweisung

26

for (int i=0; i<=100; i++ ) { if ( i%7 == 0 ) System.out.println( i ); } … Alle Zahlen zwischen 0 und 100, die genau durch 7 geteilt werden können, werden ausgegeben.

Ausgabe

0 7 14 21 28 35 42 49 56 63 70 77 84 91 98

slide-27
SLIDE 27
  • M. Esponda-Argüero

for-Anweisung

27

public class ForStatements { /*Hier berechnen wir die Fakultätsfunktion für alle Zahlen von 1 bis n. 1! 2! 3! 4! ... n! */ public static void main(String[] args) { int n=17; int fac = 1; for ( int index = 1; index <= n; index++ ) { fac = fac * index; System.out.println(index + "! = " + fac); } } }

slide-28
SLIDE 28

... double sum = 0; for(int i=1; i<=n; i++) { sum += 1/(i*i); } double pi = Math.sqrt(sum*6); ...

  • M. Esponda-Argüero

28

Rn = 1 i2

i=1 n

= 1 12 + 1 22 + ...+ 1 n2 ≈ π 2 6

… double sum = 0; for(int i=1; i<=n; i++) { sum += 1/i*i; } double pi = Math.sqrt(sum*6); ... ... double sum = 0; for(int i=1; i<=n; i++) { sum += 1.0/(i*i); } double pi = Math.sqrt(sum*6); ... ... double sum = 0; for(int i=1; i<=n; i++) { sum += 1/(1.0*i*i); } double pi = Math.sqrt(sum*6);

2.449489742783178 2.449489742783178 3.1414971639472147 3.141583104326456 ArithmeticException Infinity

falsch! falsch! falsch! richtig!

for-Anweisung

slide-29
SLIDE 29
  • M. Esponda-Argüero

29

Methoden enthalten den ablauffähigen Programmcode. Es gibt keine Methoden außerhalb von Klassen. Methoden dürfen nicht geschachtelt werden. Beispiel: public static int umfang (int width, int height) { return 2*(width + height); }

Klassenmethode Rückgabetyp Parameter Methodenname

Klassenmethoden

slide-30
SLIDE 30
  • M. Esponda-Argüero

return-Anweisung

30

Wenn eine Methode kein Ergebnis zurückgibt, wird das Schlüsselwort void als Rückgabetyp verwendet, und eine return- Anweisung ist nicht erforderlich. Die return-Anweisung beendet frühzeitig die Ausführung einer Methode. In einer Methode kann es mehrere return-Anweisungen geben. Methoden, die als Funktionen definiert sind, d.h. ein Ergebnis liefern, müssen durch eine return-Anweisung dieses Ergebnis zurückgeben.

slide-31
SLIDE 31

return-Anweisung

public static int fakultaet ( int zahl ) { int fak = 1; if ( ( zahl == 0 ) || ( zahl == 1 ) ) return fak ; else { while ( zahl > 1 ) { fak = fak*zahl; zahl = zahl - 1; } return fak ; } } // end of factorial

Die return-Anweisung beendet den Lauf der Funktion (Methode) und sorgt für die Übergabe des Ergebnisses.

slide-32
SLIDE 32
  • M. Esponda-Argüero

32

public class ForStatements { public static double pi_leibnitz( int n_max ){ double sum = 0; for (int n = 0; n<=n_max; n++ ){ if ( n%2 == 0 ) sum = sum + (1.0)/(2*n+1); else sum = sum - (1.0)/(2*n+1); } return 4*sum; } }

Klassenmethoden

slide-33
SLIDE 33
  • M. Esponda-Argüero

Klassenmethoden

33

Klassenmethoden werden als static deklariert und über den Klassennamen aufgerufen:

class FirstClass { static void factorial( int n ) { . . . } }

... FirstClass.factorial( 29 ); ...

innerhalb anderer Klassen

slide-34
SLIDE 34
  • M. Esponda-Argüero

for-Anweisung

34

für Morgen

slide-35
SLIDE 35
  • M. Esponda-Argüero

35

Java-Typsystem

Primitive Datentypen Referenz Datentypen nur 8 byte short int long float double char boolean String Arrays alles was nicht primitiv ist + alle Objekte

slide-36
SLIDE 36
  • M. Esponda-Argüero

Java-Typsystem

36

Java ist streng typisiert, d.h. jeder Ausdruck hat einen wohldefinierten Typ. Die Einhaltung aller durch das Typsystem definierten Regeln wird Neue Objekttypen werden durch Klassen definiert. Variablen solcher Typen sind Referenzen:

  • zuerst statisch vom Übersetzer überprüft.
  • und dann dynamisch vom Interpreter.
slide-37
SLIDE 37
  • M. Esponda-Argüero

for-Anweisung

37

... for ( i=0,j=20,k=5; i<=10; i++,j--,k+=5 ) { System.out.println( (i+j)*k ); } ...

Die Initialisierung kann mehrere Initialisierungen von Variablen beinhalten. Nach jedem Durchlauf können mehrere Variablen verändert werden.

slide-38
SLIDE 38
  • M. Esponda-Argüero

for-Anweisung

38

. . . for ( int i=1; i<=10; i++ ) { for ( int j=1; j<=10; j++ ) { . . . } . . . } . . . For-Schleifen können beliebig verschachtelt werden.

slide-39
SLIDE 39
  • M. Esponda-Argüero

for-Anweisung

39

Jede for-Anweisung lässt sich auch als while-Anweisung formulieren. ... for (int n=1, int m = 1; n<=16; n++ ){ m = m*n; } … ... int n = 1; int m = 1; while ( n <= 16 ){ m = m*n; n++; } ...

/* Initialisierung */ /* Schleifenzähler */

slide-40
SLIDE 40
  • M. Esponda-Argüero

for-Anweisung

40

for (;;) { ... } while ( true ) { ...

}

Jeder der drei Ausdrücke in der for-Schleife kann auch fehlen; die Semikola müssen aber trotzdem gesetzt werden. Endlosschleifen!!

slide-41
SLIDE 41
  • M. Esponda-Argüero

Modellierung von Rechteck-Objekten

41

  • (x, y)

Breite Höhe

Fläche Umfang verkleinern vergrößern verschieben klonen

Eigenschaften Operationen

slide-42
SLIDE 42
  • M. Esponda-Argüero

java-Anwendungen

42

packet packet_1 ; class Klasse_1 { . . . . . }

slide-43
SLIDE 43

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Warum Objektorientierte Programmierung?

Hauptproblem bei prozeduraler Programmierung

Trennung zwischen Prozeduren (Funktionen) und Daten

✴ welche Daten sollen lokal und welche global existieren? ✴ Probleme, einen geeigneten Zugriffsschutz auf die

globalen Daten zu finden

✴ Probleme der realen Welt sind schwer prozedural zu

simulieren

✴ ungeeignet für große Softwaresysteme ✴ schlechte Wiederverwendbarkeit der Software

43

slide-44
SLIDE 44

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Erste Objektorientierte Ideen

  • 1968. Xerox
  • erste objektorientierte Konzepte für die Gestaltung von

Benutzeroberflächen

  • Dynabook-Konzept
  • Smalltalk-Programmiersprache

Alan Kay

„The best way to predict the future is to invent it.“

44

slide-45
SLIDE 45

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Was ist ein Objekt?

Objekte sind verwandt mit:

struct Student { int matrikelnummer; int alter; int semester; }; C/C++ struct-Datentyp TYPE datum = RECORD tag, monat, jahr : INTEGER; END;

Pascal Records

Mit dem wesentlichen Unterschied, dass Objekte immer einen zusätzlichen Zeiger auf die Tabelle der Klasse haben, nach deren Vorgabe diesen erzeugt wurden. V-Table des Objekts … Methoden …

Objekt

45

vptr

slide-46
SLIDE 46

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Die OOP betrachtet eine Programmausführung als ein System kooperierender Objekte.

O3 O1 O2

OO-Programmausführung

Speicher

46

slide-47
SLIDE 47

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

area

perimeter

translate Rectangle Rectangle x y height width x = 0 y = 0 height = 10 width = 10 rectangle_A rectangle_B x = 0 y = 0 height = 10 width = 10 rectangle_C x = 33 y = 45 height = 15 width = 15 clone

Rectangle-Klasse

scale equal

Rectangle-Objekte

area scale translate …

Konstruktoren

area scale translate … area scale translate …

47

slide-48
SLIDE 48

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Klasse Rectangle

public class Rectangle{ // Attribute int x; int y; int width; int height; // Konstruktoren public Rectangle() { x = 0; y = 0; width = 10; height = 10; } // Methoden public int perimeter() { return 2*(width + height); } public int area() { return (width * height); } } // end of class Rectangle public class TestRectangle{ // main-Methode public static void main( String[] args ) { Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(); int u = r1.area(); int f = r2.perimeter(); } } // end of class TestRectangle

in Java

48

slide-49
SLIDE 49

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

  • Objekte haben einen lokalen Zustand.
  • Objekte empfangen und bearbeiten Nachrichten.

Ein Objekt kann – seinen Zustand ändern, – Nachrichten an andere Objekte verschicken, – neue Objekte erzeugen oder existierende Objekte löschen.

  • Objekte sind grundsätzlich selbständige Ausführungseinheiten, die

unabhängig voneinander und parallel arbeiten können.

OOP: Das Grundmodell

49

slide-50
SLIDE 50

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Variante der for-Schleife

for ( Typ Element : Datenstrukturname ) { Anweisungen } for-Schleifen besuchen oft jede Position eines Arrays oder einer Datenstruktur, und aus diesem Grund haben die Java-Entwickler ab Java 1.5 eine abgekürzte Form der for-Schleife eingeführt. Jedes Element der Datenstruktur wird der Variablen "Element" zugewiesen und innerhalb der Anweisungsblöcke benutzt.

50

slide-51
SLIDE 51
  • M. Esponda-Argüero

51

public class ForStatements { public static double pi_leibnitz( int n_max ){ double sum = 0; for (int n = 0; n<=n_max; n++ ){ if ( n%2 == 0 ) sum = sum + (1.0)/(2*n+1); else sum = sum - (1.0)/(2*n+1); } return 4*sum; } }

Klassenmethoden

slide-52
SLIDE 52
  • M. Esponda-Argüero

Java-Operatoren

Bezeichnung Operator Priorität Komponentenzugriff bei Klassen . 15 Komponentenzugriff bei Feldern [ ] 15 Methodenaufruf ( ) 15 Unäre Operatoren ++,--,+,-,~,! 14 Explizite Typkonvertierung ( ) 13 Multiplikative Operatoren *, /, % 12 Additive Operatoren +, - 11 Schiebeoperatoren <<, >>,>>> 10 Vergleichsoperatoren <, >, <=, >= 9 Vergleichsoperatoren (Gleichheit, Ungleichheit) ==, != 8 bitweise UND & 7 bitweise exklusives ODER ^ 6 bitweise inklusives ODER | 5 logisches UND && 4 logisches ODER || 3 Bedingungsoperator ? : 2 Zuweisungsoperatoren =,*=,-=, usw. 1

slide-53
SLIDE 53

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Variablendeklarationen

Typ Name Wert int breite ; int hoehe = 10 ; Modifizierer public float radius = 0.0 ; private float radius = 0.0 ;

Der Modifizierer bestimmt die Zugriffsrechte, die andere Objekte auf eine Variable (Attribut) haben. Im Unterschied zu Python müssen in Java alle Variablen vor der ersten Anwendung deklariert werden.

53

slide-54
SLIDE 54

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Java-Typsystem

  • Java ist streng typisiert, d.h. jeder Ausdruck hat einen

wohldefinierten Typ.

  • Die Einhaltung aller durch das Typsystem definierten

Regeln wird

  • Neue Objekttypen werden durch Klassen definiert.

Variablen solcher Typen sind Referenzen:

  • zuerst statisch vom Übersetzer überprüft.
  • und dann dynamisch vom Interpreter.

54

slide-55
SLIDE 55
  • M. Esponda-Argüero

Klasse Rectangle

55

public class Rectangle{ // Attribute int x; int y; int width; int height; // Konstruktoren public Rectangle() { x = 0; y = 0; width = 10; height = 10; } // Methoden public int perimeter() { return 2*(width + height); } public int area() { return (width * height); } } // end of class Rectangle public class TestRectangle{ // main-Methode public static void main( String[] args ) { Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(); int u = r1.area(); int f = r2.perimeter(); } } // end of class TestRectangle

slide-56
SLIDE 56
  • M. Esponda-Argüero

Variablendeklarationen

56

Typ Name Wert int breite ; int hoehe = 10 ; Modifizierer public float radius = 0.0 ; private float radius = 0.0 ;

Der Modifizierer bestimmt die Zugriffsrechte, die andere Objekte auf eine Variable (Attribut) haben.

slide-57
SLIDE 57
  • M. Esponda-Argüero

Was ist Kapselung?

57

Kapselung ist die Einschränkung des Zugriffs auf die Instanzvariablen eines Objektes durch Objekte anderer Klassen. Man spricht von einer Kapselung des Objektzustands. Kapselung schützt so den Objektzustand vor “unsachgemäßer” Änderung und unterstützt Datenabstraktion. API Application Programming Interface.

Attribut 1 Attribut 2 usw . . . .

Öffentliche Methoden (API) Privater Zustand Kapselung erfolgt durch die Zugriffsmodifizierer (public, private, protected und package)

slide-58
SLIDE 58
  • M. Esponda-Argüero

Sichtbarkeit von Java-Variablen

58

Zugriffsangabe

  • der

Sichtbarkeit Klasse Unterklassen Paket Welt

privat package protected public Kein Modifikator ist äquivalent zur package

slide-59
SLIDE 59
  • M. Esponda-Argüero

Zugriffsangabe oder Sichtbarkeit von Variablen

59

Klasse

privat …

Nur das Objekt selbst kann den Inhalt einer privaten Variablen mittels seiner Methoden modifizieren. Klasse

package x;

Klasse Klasse Paket- oder Verzeichnis-x

package x; package x;

package …

Alle Objekte innerhalb eines Verzeichnisses haben direkten Zugriff auf eine package-Variable.

methode a() …. methode a() ….

slide-60
SLIDE 60
  • M. Esponda-Argüero

Zugriffsangabe oder Sichtbarkeit von Variablen

60

Klasse A

protected ..

Klasse Klasse Paket oder Verzeichnis

Unterklasse von A

Paket oder Verzeichnis

Unterklasse von A

methode a() …. methode b() …. methode c() ….

Zugriff innerhalb der Klassen-Hierarchie

slide-61
SLIDE 61
  • M. Esponda-Argüero

Zugriffsangabe oder Sichtbarkeit von Variablen

61

Klasse public …. Klasse Klasse Paket oder Verzeichnis Klasse Klasse Paket oder Verzeichnis Klasse Klasse Klasse Paket oder Verzeichnis Klasse Klasse Paket oder Verzeichnis

Die Welt aller Java-Klassen

slide-62
SLIDE 62

Kapselung

public class Time { // Instanzvariablen oder Eigenschaften private int hours ; private int minutes ; private int seconds ; // Konstruktor public Time( ) { hours = 0; minutes = 0; seconds = 0; } // Methoden public int getHours ( ) { return hours; } public void setHours ( int neuHours ) { if ( neuHours>=0 && neuHours<24 ) { hours= neuHours; } } public int toSeconds( ) { // Lokale Variablen int temp ; temp = seconds + minutes*60 + hours*3600; return temp; } . . . . } // Ende der Klassedeklaration Time t1; t1 = new Time (); . . . . . . t1.setSeconds( 54 ); Eine Variable t1 wird erzeugt, um die Referenz (Adresse) eines Objektes des Typs "Time" zu speichern. Hier wird ein Time-Objekt erzeugt und eine Referenz zum Objekt in der Variablen t1 gespeichert.

slide-63
SLIDE 63
  • M. Esponda-Argüero

Beispiel:

63

. . . public void setTime( int h, int m, int s ) { if ( (s>59) || (s<0) || (m>59) || (m<0) || (h>23) || (h<0) ){ System.out.println("Falsche Zeitangabe:"+h+":"+m+":"+s); } else { hours = h; minutes = m; seconds = s; } } . . .

Definition der setTime-Methode

slide-64
SLIDE 64
  • M. Esponda-Argüero

Beispiel:

64

public class Kreis { // Instanzvariablen float x; float y; float radio; // Klassenvariable public final float PI = 3.141598f; // Methoden public float area() { // Lokale Variable float a; a = PI*radio*radio; return a; } . . . }

ab hier!

slide-65
SLIDE 65

Beispiel:

public class Kreis { //Instanzvariablen ´ float x; float y; float radio; // Klassenvariable public final float PI = 3.141598f; // Methoden public float area() { // Lokale Variable float a; a = PI*radio*radio; return a; } }

public static void main ( String[] args ) { Kreis k1 = new Kreis(); Kreis k2 = new Kreis(); Kreis k3 = new Kreis(); float flaeche = k1.area(); }

Speicher

k1

x=0.0 y=0.0 radio=0.0

k2

x=0.0 y=0.0 radio=0.0

k3

x=0.0 y=0.0 radio=0.0

PI 3.141598

a 0.0

slide-66
SLIDE 66
  • M. Esponda-Argüero

66

Objekterzeugung

Objekte werden durch den Aufruf von Konstruktoren erzeugt. Ein Konstruktor wird mit Hilfe der new-Operatoren aufgerufen. Eine Klassendefinition kann mehrere Konstruktoren haben mit verschiedenen Initialisierungen der Objekteigenschaften. Wenn in einer Klasse keine Konstruktoren definiert worden sind, werden die Eigenschaften von Objekten mit Defaultwerten initialisiert. Kreis k1 = new Kreis();

slide-67
SLIDE 67
  • M. Esponda-Argüero

Variablen in Java

67

Variablen Klassenvariablen Instanzvariablen Lokale Variablen

float delta = Kreis.PI / 10;

Zugriff

Kreis k1 = new Kreis(); k1.radio = 5.0;

bezüglich des Klassennamens nur in Bezug zu einem Objekt

int num; num = 5.0;

wie in C

slide-68
SLIDE 68
  • M. Esponda-Argüero

Was ist eine Referenz?

68

. .

Referenz Datentypen

. . . . . .

p2 p1

null null 1024

1024

( 0, 0 ) 1000

1000

( 10, 25 )

Point p2; Point p1; p2 = new Point ( 0, 0 ); p1 = new Point ( 10, 25 );

Speicher für Variablen mit fester Größe

sind Variablen, wo die Adresse eines Objekts gespeichert wird

slide-69
SLIDE 69
  • M. Esponda-Argüero

Referenz-Variablen

69

. . . . . . . .

p2 p1

null null

1024 ( 0, 0 ) 1000 ( 10, 25 ) p1 = p2 ;

1024

garbage!!

1000 1024

In Java ist Arithmetik mit Referenz-Variablen verboten. Nur die Operatoren =, ==, != sind erlaubt.

slide-70
SLIDE 70
  • M. Esponda-Argüero

Weitere vordefinierte Operationen, die mit Referenz- Variablen erlaubt sind

70

(Typ)_Operator Object objekt = null; Button button = (Button) objekt; Der ( . ) Operator Mit dem ( . )-Operator hat man Zugriff auf die Eigenschaften und Methoden eines Objekts. int x_koord = p1.x ; Punkt p1 = new Punkt ( 10, 35 );

slide-71
SLIDE 71
  • M. Esponda-Argüero

null

71

Das Schlüsselwort null bezeichnet immer ungültige, d.h. nicht initialisierte Referenzen. null kann überall da verwendet werden, wo eine Referenz erwartet

  • wird. Zugriff auf eine Referenz, die gleich null ist, erzeugt einen

Laufzeitfehler. Rechteck r1; Rechteck r2 = null; ... r1.gleich( r2 );

Verursacht einen Laufzeitfehler!

( NullPointerException )

slide-72
SLIDE 72
  • M. Esponda-Argüero

Typ-Operatoren

72

Operator Zeichen Rtg. Beispiel Priorität "cast"-Operator (typ) (int) a 13

unär binär

Typvergleich für Objekte instanceof a instanceof Button 9

Button knopf = new Button(); … if ( knopf instanceof Button ) knopf.setBackground(Color.yellow); …

slide-73
SLIDE 73

Java-Operatoren

Bezeichnung Operator Priorität Komponentenzugriff bei Klassen . 15 Komponentenzugriff bei Feldern [ ] 15 Methodenaufruf ( ) 15 Unäre Operatoren ++,--,+,-,~,! 14 Explizite Typkonvertierung ( ) 13 Multiplikative Operatoren *, /, % 12 Additive Operatoren +, - 11 Schiebeoperatoren <<, >>,>>> 10 Vergleichsoperatoren <, >, <=, >= 9 Vergleichsoperatoren (Gleichheit, Ungleichheit) ==, != 8 bitweise UND & 7 bitweise exklusives ODER ^ 6 bitweise inklusives ODER | 5 logisches UND && 4 logisches ODER || 3 Bedingungsoperator ? : 2 Zuweisungsoperatoren =,*=,-=, usw. 1

slide-74
SLIDE 74
  • M. Esponda-Argüero

Konzepte

  • bjektorientierter

Programmierung

74

Objekte Klassen Nachrichten Kapselung Vererbung Polymorphismus

  • 1. Was ist eine Variable ?
  • 3. Deklaration von Variablen (OOP)
  • 2. Primitive Datentypen in Java
  • 5. Die vielen Operatoren von Java
  • 6. Einfache Anweisungen in Java
  • 7. Anweisungen zur Ablaufsteuerung
  • 4. Ausdrücke in Java

Imperative Grundbestandteile

slide-75
SLIDE 75
  • M. Esponda-Argüero

OOP: Das Grundmodell

75

  • Objekte haben einen lokalen Zustand
  • Objekte empfangen und bearbeiten Nachrichten

Ein Objekt kann – seinen Zustand ändern, – Nachrichten an andere Objekte verschicken, – neue Objekte erzeugen oder existierende Objekte löschen.

  • Objekte sind grundsätzlich selbständige Ausführungseinheiten, die

unabhängig voneinander und parallel arbeiten können.

slide-76
SLIDE 76
  • M. Esponda-Argüero

Klassenmethoden

76

Klassenmethoden haben keinen Zugriff auf Instanzvariablen. Klassenmethoden dürfen nur andere Klassenvariablen oder lokale Variablen verwenden. Innerhalb einer als static deklarierten Methode (Klassenmethode) dürfen nur andere statische Methoden aufgerufen werden.

slide-77
SLIDE 77
  • M. Esponda-Argüero

Weitere Konventionen

77

Variablennamen Klassennamen Konstante Methoden beginnen mit Kleinbuchstaben beginnen mit Großbuchstaben nur Großbuchstaben beginnen mit Kleinbuchstaben myName Rechteck BLAU setColor ( BLAU ) Klassenvariablen

slide-78
SLIDE 78

Klassendefinition

public class Kreis { public static final double PI = 3.141598; public double x; public double y; private double radio; public Kreis(){ x = 0.0; y = 0.0; radio = 1.0; } public double getRadio() { return radio; } public void setRadio( double r ) { if ( r>0 ) radio = r; else System.err.println( "Fehler:...." ); } public double flaeche(){ return PI*radio*radio; } public double umfang() { return PI*2*radio; } } // Ende der Kreis-Klasse

Klassenvariable Instanzvariablen Konstruktor get-Methode

set-Methode

Methode

slide-79
SLIDE 79
  • M. Esponda-Argüero

Instanzvariablen

79

Die Klasse Kreis vereinbart drei Instanzvariablen mit jeweils einem Typ, einem Namen und einem Wert. Instanzvariablen werden beim Erzeugen des Objekts entweder mit dem im Konstruktor angegebenen Wert initialisiert oder mit einem Standardwert: Zugriff nach dem Muster <Referenz> . <Feldname> ... Kreis k = new Kreis(); k.x = 0; k.y = 0; ...

slide-80
SLIDE 80
  • M. Esponda-Argüero

Konstruktoren

80

Ein guter OOP-Stil bedeutet, geeignete Konstruktoren zu definieren, die Objekte initialisieren und evtl. initiale Berechnungen durchführen. public class Beverage { String name; int price, int stock; // Konstruktor Beverage( String name, int price, int stock ) { this.name = name; this.price = price; this.stock = stock; } . . . }

slide-81
SLIDE 81
  • M. Esponda-Argüero

81

Sobald ein expliziter Konstruktor definiert ist, fällt der implizite Konstruktor weg! Ist kein Konstruktor definiert, wird ein impliziter Konstruktor

  • hne Argumente angenommen.

public class Kreis { double x, y, radio; public Kreis(){ } ... } public class Kreis { double x, y, radio; ... }

=

slide-82
SLIDE 82
  • M. Esponda-Argüero

this

82

Das Schlüsselwort this bezeichnet immer eine Referenz auf das aktuelle Objekt selbst. this kann in Methoden und in Konstruktoren verwendet werden, um durch Argumentnamen “verschattete” Variablennamen zu erreichen:

slide-83
SLIDE 83
  • M. Esponda-Argüero

this

83

public class Kreis { public final double PI = 3.141598; public double x; public double y; private double radio; public Kreis( double x, double y ){ this.x = x; this.y = y; } public double getRadio() { return this.radio; } public void setRadio( double r ) { if ( r>0 ) this.radio = r; else System.err.println( "Fehler:...." ); } . . .

Referenz auf das aktuelle Objekt selbst

slide-84
SLIDE 84
  • M. Esponda-Argüero

Konstruktoren

84

"gute Regel" bei mehreren Konstruktoren: Schreibe genau einen Konstruktor, der alle Initialisierungen vornimmt und rufe ihn aus den anderen mit geeigneten Parametern auf. Dies vermindert die Zahl potentieller Fehler.

public class Kreis { double x, y, r; public Kreis ( double x, double y, double radio ) { this.x = x; this.y = y; this.radio = radio; } public Kreis ( double r ) { this ( 0.0, 0.0, radio ); } public Kreis ( Kreis c ) { this ( c.x, c.y, c.radio ); } public Kreis () { this ( 1.0 ); } }

slide-85
SLIDE 85
  • M. Esponda-Argüero

Objekterzeugung

85

. . . Kreis first_circle = new Kreis ( 0.0, 0.0, 1.0 ); Kreis second_circle = new Kreis ( first_circle ); Kreis four_circle = new Kreis ( 5.0 ); Kreis third_circle = new Kreis ( ); . . .

slide-86
SLIDE 86
  • M. Esponda-Argüero

Instanzmethoden

86

Instanzmethoden definieren das Verhalten von Objekten. Sie werden innerhalb einer Klassendefinition angelegt und haben Zugriff auf alle Variablen des Objekts. Sie haben immer den impliziten Parameter this public class Person { private String name = ""; ... String getName() { return this.name; } void setName( String name ) { this.name = name; } }

slide-87
SLIDE 87
  • M. Esponda-Argüero

Test-Beispiel für die Kreis-Klasse

87

public class TestKreis { public static void main(String[] args) { Kreis k = new Kreis(); k.x = 1.0; k.y = 5.0; k.setRadio( 30 ); k.setRadio( -6 ); System.out.println( k.flaeche() ); System.out.println( k.umfang() ); double radio = k.getRadio(); System.out.println(radio); System.out.println( k.getRadio() ); } }

Fehler:.... 2827.4382 188.49588 30.0 30.0

slide-88
SLIDE 88
  • M. Esponda-Argüero

Packages

88

Java bietet die Möglichkeit, miteinander in Beziehung stehende Klassen zu Paketen (packages)

  • zusammenzufassen. Die Zugehörigkeit zu einem Paket

wird über die package-Direktive deklariert. Einzelne oder alle Klassen eines anderen Pakets werden mit der import-Direktive "sichtbar" gemacht.

slide-89
SLIDE 89
  • M. Esponda-Argüero

Packages und Klassennamen

89

Wird kein Package bestimmt, so gehört die Klasse automatisch ins globale, unbenannte Package. Der vollständig qualifizierte Name einer Klasse wird aus dem Klassennamen und allen umschließenden Package-Namen gebildet, z.B. . . . java.awt.Button button; . . . Wenn eine entsprechende import-Anweisung vorhanden ist import java.awt.*; . . . Button button; schreibe ich nur

slide-90
SLIDE 90
  • M. Esponda-Argüero

Packages

90

package beispiele; import java.lang.*; // Standard public class Person { ... } package uebungen; import beispiele.*; ... java.lang.String str = ""; Person p1; ...

slide-91
SLIDE 91
  • M. Esponda-Argüero

Zugriffskontrolle

91

Ein guter OOP-Stil tendiert dazu, alle Instanzvariablen privat zu deklarieren und den Zugriff nur durch "set"- und "get"- Methoden zu ermöglichen. public class Person { private int alter; ... ... Person person = new Person( ); int a = person.alter; ...

Übersetzerfehler!!

andere Klasse

slide-92
SLIDE 92
  • M. Esponda-Argüero

Zugriffskontrolle auf Methoden

92

Der Zugriff auf Methoden kann auch durch Modifizierer gesteuert werden: − public: überall zugänglich. − private: nur innerhalb der eigenen Klasse zugänglich. − protected: in anderen Klassen des selben Packages und in Unterklassen zugänglich. − kein Modifizierer: sind nur für Code im selben Paket zugänglich.

slide-93
SLIDE 93

ALP II: Margarita Esponda, 13. Vorlesung, 31.5.2012

Algorithmen und Programmieren II

Objektorientiertes Programmieren (Einführung)

  • Prof. Dr. Margarita Esponda

SS 2012

{P} S {Q}

93

slide-94
SLIDE 94
  • M. Esponda-Argüero

Beispiel:

94

Die Haus-Klasse

Eigenschaften:

Nutzfläche Wohnfläche Etagen Adresse

Operationen: sanieren verkaufen renovieren

Ein konkretes Haus Objekt

zwei Etagen 100 m2 Wohnfläche 200 m2 Nutzfläche

  • Takustr. 20

kann saniert werden kann renoviert werden kann verkauft werden Zustand: Operationen: Klassendefinition

slide-95
SLIDE 95
  • M. Esponda-Argüero

Variablen in Java

95

Diese Klassifikation richtet sich nach folgenden zwei Aspekten: Variablen Klassenvariablen Instanzvariablen Lokale Variablen (static)

  • Ort der Deklaration
  • Vorhandensein der (static)-Deklarationsspezifizierer
slide-96
SLIDE 96
  • M. Esponda-Argüero

Variablen in Java

96

(Feldvariablen, Attribute)

Lokale Variablen Variablen, in denen die Eigenschaften von Objekten gespeichert werden Hilfsvariable für Berechnungen Sie werden innerhalb von Methoden deklariert. Lebenszeit: nur solange das Objekt existiert. Lebenszeit: nur solange die Methode ausgeführt wird. Instanzvariablen Klassenvariablen Variablen, die zu einer Klasse gehören Lebenszeit: solange das Programm ausgeführt wird.

slide-97
SLIDE 97
  • M. Esponda-Argüero

Klassenvariablen

97

static Variablen sind klassenbezogen

..d.h. speichern Eigenschaften, die für eine ganze Klasse gültig sind, und von denen nur ein Exemplar für alle Objekte der Klasse existiert; ihre Lebensdauer erstreckt sich über das ganze Programm.

sind nicht modifizierbar

Klassenvariablen haben den Deklarationsspezifizierer static

final

slide-98
SLIDE 98
  • M. Esponda-Argüero

98

Die Mensch-Klasse in Java

public class Mensch { int beine; int arme; int kopf; String name; String geschlecht; public Mensch(){ beine = 2; arme = 2; kopf = 1; name = "Felix"; geschlecht = "männlich"; } public String sagDeineName(){ return name; } }

Eigenschaften Konstruktor Methode

slide-99
SLIDE 99
  • M. Esponda-Argüero

Beispiel:

99

Die Haus-Klasse

Eigenschaften:

Nutzfläche Wohnfläche Etagen Adresse

Operationen: sanieren verkaufen renovieren

Ein konkretes Haus Objekt

zwei Etagen 100 m2 Wohnfläche 200 m2 Nutzfläche

  • Takustr. 20

kann saniert werden kann renoviert werden kann verkauft werden Zustand: Operationen: Klassendefinition