Einstieg in die Informatik mit Java Objektorientierte Programmierung und Klassen

Gerd Bohlender Institut fur ¨ Angewandte und Numerische Mathematik

1 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

2 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

3 / 25

Die Philosophie 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 wird vor dem Benutzer versteckt, der Zugriff erfolgt nur uber ¨ genau definierte Schnittstellen. (4) Polymorphie: Eine Methode kann in verschiedenen Subklassen individuell angepasst werden.

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

4 / 25

Die Philosophie Beispiel Superklasse

6

6

Subklasse 6

Lebewesen

6

6

6

Tiere

Subklasse 6

...

Pflanzen 6

...

5 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

6 / 25

Definition von Klassen

Syntax Modifizierer class Bezeichner {Elementliste} Die Elementliste besteht aus Datenelementen (d. h. Variablen) und Methoden (d.h. Funktionen), die diese Daten berarbeiten (vgl. in Pascal: record und in C/C++: struct, class). Zur Datenkapselung kann die Sichtbarkeit der Elemente mit Hilfe von vorangestellten Modifizierern geregelt werden (siehe ¨ nachster Abschnitt).

7 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

8 / 25

Datenkapselung ¨ Mogliche Modifizierer nichts

public private protected

Standard-Rechte, auch friendly genannt. Element kann u. a. in der Klasse selber sowie in allen Klassen des gleichen Pakets verwendet werden. Element kann von jeder Klasse verwendet werden. Element kann nur von der eigenen Klasse verwendet werden. ¨ spater ...

• Datenelemente werden aus Grunden der Datenkapselung ¨

meistens mit dem Modifizierer private versehen. • Die Klasse selber darf nur Standardrechte oder

public–Rechte besitzen. • In einer Datei durfen mehrere Klassen definiert werden, ¨

jedoch darf nur eine davon public–Rechte besitzen. Diese Klasse muss den gleichen Namen wie die Datei tragen. 9 / 25

Beispiel zur Klassendefinition und Datenkapselung Nachfolgend wird der neue Datentyp Point definiert: class P o i n t { p r i v a t e double x , y ; / / g e s c h u¨ t z t v o r unberecht . Z u g r i f f public double g e t x ( ) { return x ; } public double g e t y ( ) { 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 P o i n t p = new P o i n t ( ) ; // } // // //

[ ] args ) { b i l d e t I n s t a n z der Klasse P o i n t durch A u f r u f des Standardkonstruktors −−> s i e h e K a p i t e l 11.4

Achtung Unterscheidung zwischen Klasse und Instanz! 10 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

11 / 25

Instanzen Klasse Instanz

Datentyp, es wird noch kein Speicher fur ¨ Komponenten reserviert. Variable des Datentyps, auch Objekt genannt es 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, belegen aber nicht die selben Speicherbereiche. Dadurch sind sie ¨ voneinander unabhangig handhabbar. Eine Ausnahme bilden Komponenten mit dem Modifizierer static. Diese werden fur ¨ die gesamte Klasse nur einmal angelegt, ¨ unabhangig davon, ob keine, eine oder mehrere Instanz(en) der Klasse gebildet wurden (→ Klassenvariablen, Klassenmethoden).

Achtung Im Gegensatz zu C++ ist keine separate Deklaration und ¨ Definition der Methoden moglich! 12 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

13 / 25

Zugriff auf Elemente Erinnerung: Syntax Modifizierer class Bezeichner {Elementliste} Elementvariablen und Elementmethoden werden auch unter dem Begriff Komponenten zusammengefasst. Innerhalb der Klasse ist der Zugriff auf alle Komponenten erlaubt, und zwar einfach durch Angabe des entsprechenden Bezeichners. Wird der Bezeichner durch eine gleichnamige lokale Variable verdeckt, kann mit this.Bezeichner auf die Komponenten der gerade aktiven Instanz zugegriffen werden. this ist dabei eine Referenz auf die momentan betrachtete Instanz.

Achtung this ist nur fur ¨ Instanz-, nicht fur ¨ statische Variablen und Methoden ¨ zulassig, da es von ihnen nicht mehrere zu unterscheidende Werte geben kann. 14 / 25

Zugriff auf Elemente Beispiel zu this public class P o i n t 2 { p r i v a t e double x , y ; / / Instanzvariablen public double g e t x ( ) { return x ; } public double g e t y ( ) { return y ; } void move ( double x , double y ) { this . x = x ; / / Ueberschreiben der I n s t . v a r . this . 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 ) { P o i n t 2 p2 = new P o i n t 2 ( ) ; / / I n s t a n z erzeugen } }

15 / 25

Zugriff auf Elemente Außerhalb der Klasse, d.h. in einer anderen Klasse, ist der Zugriff nur auf sichtbare Komponenten erlaubt. Diese sind ¨ folglich mit offentlichen Zugriffsrechten bzw. fur ¨ den Fall, dass sich die Klasse im gleichen Verzeichnis befindet, mit Standardrechten ausgestattet.

Syntax Klassenname.Komponenten Instanzname.Komponenten

bei Klassenkomponenten bei Instanzkomponenten

Beispiel (erweiterte Klasse Point2) ... / / im Hauptprogramm : System . o u t . p r i n t l n ( ” x−Koodinate von p ” + p . g e t x ( ) ) ; System . o u t . p r i n t l n ( p . x ) ; / / syntaktisch richtig , ... / / aber Z u g r i f f v e r b o t e n ! 16 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

17 / 25

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

Beispiel ... P o i n t 2 p2 = new P o i n t 2 ( ) ; p2 . move(1000 , 1 0 0 0 ) ; / / b e l e g t x , y m i t 1000 ...

/ / im Hauptprogramm : / / erzeuge I n s t a n z

Achtung Nachteil: Die Methode move muss fur ¨ jedes neue Objekt aufgerufen werden! Besser ist die Verwendung eines Konstruktors. 18 / 25

Konstruktoren • Konstruktoren erlauben es sehr komfortabel

Instanzvariablen schon bei der Erzeugung einer Instanz/eines Objektes zu initialisieren. • Ein Konstruktor ist eine spezielle Methode ohne

Ergebnistyp (auch nicht void), die den gleichen Namen ¨ wie die Klasse tragt. • Konstruktoren konnen ¨ uberladen werden, d.h. es durfen ¨ ¨ mehrere Konstuktoren existieren. • Konstruktoren ohne Argumente werden

Standardkonstruktoren genannt. Werden keine Konstruktoren definiert, so erzeugt der Kompiler automatisch den Standardkonstruktor, andernfalls nicht. • Konstruktoren konnen ¨ gegenseitig mittels this aufgerufen werden. Dieser Aufruf ist allerdings in jedem Konstruktor nur als erste Anweisung erlaubt. 19 / 25

Konstruktoren Beispiel public P o i n t ( double x , double y ) { / / 1 . K o n s t r u k t o r this . x = x ; this . y = y ; } public P o i n t ( ) { / / 2 . K o n s t r u k t o r = S t a n d a r d k o n s t r u k t o r x = 0 ; / / a l t e r n a t i v ueber A u f r u f y = 0 ; / / des 1 . K o n s t r u k t o r s : t h i s ( 0 , 0 ) ; } / / im Hauptprogramm : public s t a t i c void main ( S t r i n g [ ] args ) { P o i n t q = new P o i n t ( 1 , 2 ) ; / / A u f r u f des 1 . K o n s t r . P o i n t r = new P o i n t ( ) ; / / A u f r u f des 2 . K o n s t r . }

¨ Mittels new wird der benotigte Speicher beschafft, und die angegebenen Anweisungen im Konstruktor ausgefuhrt (evtl. ¨ noch weitere Operationen). 20 / 25

Gliederung 1 Die Philosophie 2 Definition von Klassen 3 Datenkapselung 4 Instanzen 5 Zugriff auf Elemente 6 Konstruktoren 7 Speicherverwaltung

Garbage Collection finalize Lebenszyklen von Klassen und Instanzen

21 / 25

Garbage Collection Im Gegensatz zu Pascal (new, delete) und C++ (new, delete, Konstruktor, Destruktor) gibt es in Java im Wesentlichen kein Gegenstuck ¨ zum Konstruktor. Der Speicher von nicht mehr ¨ referenzierten Objekten wird fruher oder spater automatisch ¨ freigegeben, im schlimmsten Fall erst am Programmende → Garbage collection.

Syntax System.gc();

Beispiel S t r i n g s = ” blub ” ; ... s = n u l l ; / / Ref . a u f ” b l u b ” geht v e r l o r e n , / / s o f e r n k e i n e w e i t e r e Referenz ex . 22 / 25

Garbage Collection

Beispiel class Demo { } . . . Demo d = new Demo ( ) ; / / I n s t a n z der Klasse Demo ... d = new Demo ( ) ; / / neue I n s t a n z , a l t e geht v e r l o r e n

Achtung Selbst beim expliziten Aufruf des Garbage collectors muss der Speicher nicht komplett freigegeben werden!

23 / 25

finalize

¨ ¨ Sind weitere Aufraumarbeiten wie das Zahlen lebender ¨ Objekte, Abbau der Internetverbindung usw. notig, dann kann man eine Methode finalize() definieren. Diese wird aufgerufen, bevor ein Objekt vom Garbage collector freigegeben wurde.

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

24 / 25

Lebenszyklen von Klassen und Instanzen

(1) Ein Klasse wird geladen“ (z. B. von der Festplatte in den ” ¨ Hauptspeicher), sobald sie benotigt wird und wieder ¨ entfernt, sobald sie nicht mehr benotigt wird. (2) Instanzen werden i. allg. mit new erzeugt. Sobald keine Referenz mehr auf die Instanz existiert, kann sie vom Java–System uber die automatische Garbage collection ¨ ¨ wieder entfernt werden. Dies kann allerdings spater oder auch gar nicht geschehen (siehe oben).

25 / 25