Einstieg in die Informatik mit Java

Post on 22-Apr-2022

4 views 0 download

Transcript of Einstieg in die Informatik mit Java

Einstieg in die Informatik mit JavaObjektorientierte Programmierung und Klassen mit

Instanzmethoden

Gerd Bohlender

Institut fur Angewandte und Numerische Mathematik

1 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

2 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

3 / 39

Uberblick: Klassen und Objektorientierung

In diesem Kapitel werden Klassen und objektorientierteProgrammierung in Java beschrieben.

Objektorientierte ProgrammierungVorteile, Paradigmen

KlassenDarstellung in Java,Klassen- und Instanzkomponenten

4 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

5 / 39

Philosophie der Objektorientierten Programmierung

Paradigmen(1) Generalisierung: Gemeinsame Strukturen von Objekten

werden in Superklassen zusammengefasst.(2) Vererbung: Eigenschaften einer Superklasse werden

automatisch an eine Subklasse vererbt.(3) Daten-Kapselung: Variablen und Methoden werden in

einem Objekt zusammengefasst. Die interne Struktur wirdvor dem Benutzer versteckt, der Zugriff erfolgt nur ubergenau definierte Schnittstellen.

(4) Polymorphie: Eine Methode kann in verschiedenenSubklassen individuell angepasst werden.

Vorteile• Es entsteht weniger Quelltext.• Es bestehen weniger Fehlermoglichkeiten.• Das Programm erhalt eine bessere Strukturierung.• Der Quelltext ist besser wartbar. 6 / 39

Die Philosophie

Beispiel

Superklasse

6 6

Subklasse Subklasse

6 6

Lebewesen

6 6

Tiere Pflanzen

. . . . . .

6 6

7 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

8 / 39

Definition von Klassen

SyntaxModifizierer class Bezeichner {Elementliste}

Die Elementliste besteht u.a. aus• Attributen (d. h. Instanzvariablen),• Instanzmethoden,• Konstruktoren, sowie• Klassenvariablen und• Klassenmethoden.

Zweck der Instanzmethoden:• Bearbeitung der Attribute,• Klassen werden zu ”aktiven“ Objekten,•

”Kommunikation“ mit anderen Klassen.

9 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

10 / 39

Datenkapselung

Mogliche Modifiziererprivate Element kann nur von der eigenen Klasse verwendet werden.nichts Standard-Rechte, auch friendly oder package private genannt.

Element kann in der Klasse selber sowie in allen Klassendes gleichen ”Pakets“ (i.a. = Verzeichnis) verwendet werden.

protected (wird spater behandelt)public Element kann von jeder Klasse verwendet werden.

• Datenelemente werden aus Grunden der Datenkapselungoft mit dem Modifizierer private versehen.

• Der Zugriff auf die Komponente name wird dann oftrealisiert mit public-Methoden getName() bzw.setName(...)

• Der Vorteil dabei ist: hierbei konnen ggf. Tests undKontrollen durchgefuhrt werden.

11 / 39

Zugriffsrechte bei der Klasse

• Die Klasse selber darf nur Standardrechte oderpublic–Rechte besitzen.

• In einer Datei durfen mehrere Klassen definiert werden,jedoch darf nur eine davon public–Rechte besitzen. DieseKlasse muss den gleichen Namen wie die Datei tragen.

12 / 39

Beispiel: Point

Beispiel zur Klassendefinition und DatenkapselungNachfolgend wird der neue Datentyp Point definiert:

class Poin t {private double x , y ; / / geschu tz t vor unberecht . Z u g r i f fpublic double getx ( ) {

return x ;}public double gety ( ) {

return y ;}void move ( double dx , double dy ) {

x += dx ; y += dy ;}

public s t a t i c void main ( S t r i n g [ ] args ) {Poin t p = new Poin t ( ) ; / / b i l d e t Ins tanz der Klasse

} / / Po in t durch Au f ru f des} / / S tandardkonst ruk tors

13 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

14 / 39

Instanzen

AchtungUnterscheidung zwischen Klasse und Instanz!

Klasse Datentyp,es wird noch kein Speicher fur Komponenten reserviert.

Instanz Variable des Datentyps, auch Objekt genanntes wird fur Komponenten Speicher reserviert(→ Instanzvariablen, Instanz–Methoden).

• Von einer Klasse konnen viele Instanzen (bzw. Objekte)gebildet werden.

• Die Instanzen sind dann zwar vom selben Datentyp, belegenaber nicht die selben Speicherbereiche. Dadurch sind sievoneinander unabhangig handhabbar.

• Eine Ausnahme bilden Komponenten mit dem Modifiziererstatic. Diese werden fur die gesamte Klasse nur einmalangelegt, unabhangig davon, ob keine, eine oder mehrereInstanz(en) der Klasse gebildet wurden (→ Klassenvariablen,Klassenmethoden).

15 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

16 / 39

Zugriff auf Elemente

Erinnerung: SyntaxModifizierer class Bezeichner {Elementliste}

Elementvariablen und Elementmethoden werden auch unterdem Begriff Komponenten zusammengefasst.

• Innerhalb der Klasse ist der Zugriff auf alle ihreKomponenten erlaubt.

• Klassenkomponenten (Klassenmethoden,Klassenvariablen) sind mit dem Modifizierer staticversehen

• Sie durfen andere Klassenkomponenten verwendeneinfach durch Angabe des entsprechenden Bezeichners.

• Klassenkomponenten durfen auf Instanzkomponen-ten nur zugreifen, wenn eine konkrete Instanz genannt wird:

Instanzname.Bezeichner

17 / 39

Zugriff auf Elemente: Instanzkomponenten

• Instanzkomponenten (Instanzmethoden, Instanzvariablen)werden ohne den Modifizierer static definiert.

• Sie durfen andere Instanzkomponenten der gleichenInstanz sowie Klassenkomponenten verwenden einfachdurch Angabe des entsprechenden Bezeichners.

• Instanzkomponenten durfen auch auf Instanzkomponentenanderer Instanzen zugreifen, wenn diese konkrete Instanzgenannt wird:

Instanzname.Bezeichner

18 / 39

Zugriff auf Elemente: Beispiel

Beispiel zum Zugriff auf Instanzkomponenten

class Poin t {double x , y ;double abstand ( Po in t p ) {

double dx = p . x−x ;/ / x = x−Koordinate der a k t ue l l e n Ins tanz/ / p . x = x−Koordinate der Ins tanz pdouble dy = p . y−y ;/ / analogreturn Math . s q r t ( dx∗dx + dy∗dy ) ;

}}

19 / 39

Zugriff auf Elemente, this

• Wird der Bezeichner durch eine gleichnamige lokaleVariable verdeckt, kann mit

this.Bezeichner

auf die Komponenten der gerade aktiven Instanzzugegriffen werden.

• this ist dabei eine Referenz auf die momentan betrachteteInstanz. Diese wird beim ersten Aufruf einerInstanzmethode vor dem Punkt angegeben und dann anweitere darin aufgerufene Instanzmethoden weitergereicht:

Instanz.Instanzmethode ()

Achtungthis ist nur in Instanzmethoden definiert! In Klassenmethodenist es unzulassig, da es dort keine Referenz auf die momentanbetrachtete Instanz gibt.

20 / 39

Zugriff auf Elemente

Beispiel zu this

public class Point2{private double x , y ; / / I ns tanzva r i ab lenpublic double getx ( ) {

return x ;}public double gety ( ) {

return y ;}void move( double x , double y ){

th is . x = x ; / / Ueberschreiben der I n s t . var .th is . y = y ; / / m i t den gleichnamigen Var . x , y

}

public s t a t i c void main ( S t r i n g s ){Point2 p2 = new Point2 ( ) ; / / Ins tanz erzeugenp2 . move (100 , 200) ; / / Punkt p2 verschieben

}}

21 / 39

Zugriff auf Elemente

Außerhalb der Klasse, d.h. in einer anderen Klasse, ist derZugriff nur auf sichtbare Komponenten erlaubt. Diese sindfolglich mit offentlichen Zugriffsrechten bzw. fur den Fall, dasssich die Klasse im gleichen Verzeichnis befindet, mitStandardrechten ausgestattet.

Syntax

Klassenname.Komponente bei KlassenkomponentenInstanzname.Komponente bei Instanzkomponenten

auch moglich:Instanzname.Komponente bei Klassenkomponenten

Beispiel (erweiterte Klasse Point2)

. . . / / im Hauptprogramm :System . out . p r i n t l n ( ” x−Koodinate von p ” + p . getx ( ) ) ;System . out . p r i n t l n ( p . x ) ; / / s yn tak t i s ch r i c h t i g ,

/ / aber Z u g r i f f verboten !22 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

23 / 39

Konstruktoren

Beim letzten Beispiel gab es die Moglichkeit, Werte fur dieVariablen x und y uber die Methode move vorzugeben.

Beispiel

. . . / / im Hauptprogramm :Point2 p2 = new Point2 ( ) ; / / erzeuge Ins tanzp2 . move(1000 , 1000) ;/ / be leg t x , y mi t 1000. . .

AchtungNachteil: Die Methode move muss fur jedes neue Objektaufgerufen werden! Besser ist die Verwendung einesKonstruktors.

24 / 39

Konstruktoren

• Konstruktoren erlauben es sehr komfortabelInstanzvariablen schon bei der Erzeugung einerInstanz/eines Objektes zu initialisieren.

• Ein Konstruktor ist eine spezielle Methode ohneErgebnistyp (auch nicht void), die den gleichen Namenwie die Klasse tragt.

• Konstruktoren konnen uberladen werden, d.h. es durfenmehrere Konstuktoren existieren.

• Konstruktoren durfen nicht static sein und keinereturn-Anweisung enthalten.

• Ein Konstruktor ohne Argumente wird Standardkonstruktorgenannt. Werden keine Konstruktoren definiert, so erzeugtder Kompiler automatisch den Standardkonstruktor,andernfalls nicht.

• Ein Konstruktor kann einen anderen Konstruktor mit derNotation this(...) aufrufen. Dieser Aufruf ist allerdingsnur als erste Anweisung eines Konstruktors erlaubt.

25 / 39

Konstruktoren: Aufruf

Aufruf von Konstruktoren:• Ein Konstruktor wird mit dem Zusatz new ahnlich wie eine

Methode aufgerufen.• Als Ergebnis liefert er eine Referenz auf die neue Instanz.• Diese Referenz kann in einer Referenzvariablen vom

passenden Typ gespeichert werden.• new beschafft den benotigten Speicher fur die

Instanzvariablen, diese werden initialisiert, dann werdendie angegebenen Anweisungen im Konstruktor ausgefuhrt.

Syntax Konstruktoraufrufnew Klassenname (Wert, ...)

26 / 39

Beispiel zur Verwendung von Konstruktoren

Beispiel, Erganzung zu Point

public Poin t ( double x , double y ) { / / 1 . Kons t ruk to rth is . x = x ;th is . y = y ;

}public Poin t ( ) { / / 2 . Kons t ruk to r = Standardkons t ruk tor

x = 0; / / a l t e r n a t i v ueber Au f ru fy = 0; / / des 1 . Kons t ruk to rs : t h i s ( 0 , 0 ) ;

}public Poin t ( double xy ) { / / 3 . Kons t ruk to r

th is ( xy , xy ) ; / / Au f ru f des 1 . Kons t ruk to rs/ / a l t e r n a t i v : x = y = xy ;

}/ / im Hauptprogramm :public s t a t i c void main ( S t r i n g [ ] args ) {

Poin t q = new Poin t ( 1 , 2 ) ; / / Au f ru f des 1 . Konstr .Poin t r = new Poin t ( ) ; / / Au f ru f des 2 . Konstr .Poin t s = new Poin t ( 5 ) ; / / Au f ru f des 3 . Konstr .

}27 / 39

Beispiel: Fehlerhafte KonstruktorenBeispiel zu fehlerhaften Konstruktoren

class Fehler {i n t x , y ;Fehler ( i n t x ) { / / K1

x = th is . x ; / / Unsinn !}Fehler ( i n t x , i n t y ) { / / K2

th is . y = y ; / / Ze i l e 1th is ( x ) ; / / Ze i l e 2 r u f t K1 , h i e r verboten !/ / Ze i len 1 und 2 ver tausch t : waere okay

}Fehler ( i n t x , boolean diag ) { / / K3

i f ( d iag ) th is ( x , x ) ; / / r u f t K2 , h i e r verboten !else th is ( x ) ; / / r u f t K1 , h i e r verboten !/ / t h i s ( . . . ) i n bed ing te r Anweisung etc . n i c h t moeglich

}public s t a t i c void main ( S t r i n g [ ] args ) {

Fehler f = new Fehler ( ) ; / / S tandardkons t ruk tor/ / d ieser Kons t ruk to r e x i s t i e r t n i c h t !

}} 28 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

29 / 39

Garbage Collection

In Java gibt es kein Gegenstuck zum Konstruktor – etwa einen

”Destruktor“ wie in manchen anderen Programmiersprachen.Der Speicher von nicht mehr referenzierten Objekten wirdfruher oder spater automatisch freigegeben, im schlimmstenFall erst am Programmende → Garbage collection.

Expliziter Aufruf der Garbage CollectionSystem.gc();

Beispiel

S t r i n g s = ” blub ” ;. . .s = nul l ; / / Ref . auf ” blub ” geht ver lo ren ,/ / so fern keine we i te re Referenz ex .

30 / 39

Garbage Collection

Beispiel

class Demo { } . . .Demo d = new Demo ( ) ; / / Ins tanz der Klasse Demo. . .d = new Demo ( ) ; / / neue Instanz , a l t e geht ve r l o ren

AchtungSelbst beim expliziten Aufruf des Garbage collectors muss derSpeicher nicht komplett freigegeben werden!

31 / 39

finalize

Sind weitere Aufraumarbeiten wie das Zahlen lebenderObjekte, Abbau der Internetverbindung usw. notig, dann kannman eine Methode finalize() definieren. Diese wirdaufgerufen, bevor ein Objekt vom Garbage collectorfreigegeben wurde.

Syntax

protected void f i n a l i z e ( ) throws Throwable {. . .}

32 / 39

Lebenszyklen von Klassen und Instanzen

(1) Ein Klasse wird ”geladen“ (z. B. von der Festplatte in denHauptspeicher), sobald sie benotigt wird und wiederentfernt, sobald sie nicht mehr benotigt wird.

(2) Instanzen werden i. allg. mit new erzeugt. Sobald keineReferenz mehr auf die Instanz existiert, kann sie vomJava–System uber die automatische Garbage collectionwieder entfernt werden. Dies kann allerdings spater oderauch gar nicht geschehen (siehe oben).

33 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

34 / 39

Variable Argumentliste

SyntaxTyp ... Bezeichner

Wird in der Methode als Feld vom angegebenen Typinterpretiert

class F l e x i b e l {void ausgeben ( i n t . . . x ) {

for ( i n t i =0; i <x . leng th ; i ++)System . out . p r i n t l n ( x [ i ] ) ;

}}. . .F l e x i b e l f = new F l e x i b e l ( ) ;f . ausgeben ( 1 , 2 , 3 ) ; / / d r e i e in fache i n t/ / 1 2 3

35 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

36 / 39

Laufanweisung fur Felder

Syntaxfor (Komponententyp Bezeichner : Feldname ) ...

Der Bezeichner durchlauft alle Feldelelemente.

double [ ] x = {1.5 , 2 .3 , 3 .7} ;/ / bekannte Var ian te :for ( i n t i =0; i <x . leng th ; i ++)

System . out . p r i n t l n ( x [ i ] ) ;/ / neue Var ian te :for ( double x i : x )

System . out . p r i n t l n ( x i ) ;

• In dieser Variante: kein Zugriff auf Index i moglich bzw.notig.

37 / 39

Gliederung

1 Uberblick: Klassen und Objektorientierung

2 Philosophie der Objektorientierten Programmierung

3 Definition von Klassen

4 Datenkapselung

5 Instanzen

6 Zugriff auf Elemente

7 Konstruktoren

8 Speicherverwaltung

9 Variable Argumentliste

10 Laufanweisung fur Felder

11 Methode toString()

38 / 39

Methode toString()

Syntaxpublic String toString() {return ...; // Attribute als Text

}

toString() wird automatisch aufgerufen, wenn eineString-Darstellung eines Objekts gebraucht wird – z.B. bei derAusgabe.

class Punkt {double x , y ;public S t r i n g t o S t r i n g ( ) {

return x + ” , ” + y ;}

} . . .Punkt p = new Punkt ( ) ;System . out . p r i n t l n ( p ) ; / / r u f t t o S t r i n g ( ) auf/ / Ausgabe : 0 , 0 39 / 39