Implementierung von Klassen

[Startseite]


Vorwort ] Voraussetzungen ] JAVA ] [ Implementierung von Klassen ] Erste Programme ] Klassenbibliothek ] Installation ] Applets ] Mehr JAVA ] Inside stiftUndCo ] Beispiele ] Downloads ]

 

Implementierung von Klassen

Was es in JAVA bei der Implementierung von Klassen zu beachten gibt, soll an folgendem Beispiel illustriert werden, das eine Klasse Kreis implementiert. Dieses Beispiel ist dem PASCAL-Anhang entnommen, so daß direkte Vergleiche zwischen Pascal und JAVA möglich sind.

Ein Kreis kann sich selbst darstellen, seinen Radius bekanntgeben und seinen Stift zur Verfügung stellen. Darüber hinaus kann er initialisiert und wieder abgebaut werden.

 

Klassenbeschreibung

Implementierung

verwendet Klassenbeschreibungen von Stift und Co import stiftUndCo.*;
 

Klasse Kreis

 

 

(* Attribute *)

zHmitte,

zVMitte,

zRadius : Zahl

(* Objekte, die der Kreis

hat *)

hStift : Stift;

 

public class Kreis

{

/* Zustandsvariablen */

private double zHMitte,

zVMitte, zRadius;

 

/* Variable zur Verwaltung der Objekte des Kreises */

private Stift :hStift;

Auftrag Init

(px,py,pr : Zahl)

public Kreis(double x, double y, double r)

{

/* Implementierung */

}

Auftrag Zeige

 

public void zeige()

{

/* Implementierung*/

}

Anfrage Radius : Zahl

 

public double radius()

{

/* Implementierung*/

}

Anfrage DerStift : Stift public Stift stift()

{

/* Implementierung*/

}

Auftrag GibFrei public void gibFrei()

{

/* Implementierung*/

} /* Ende gibFrei */

Ende } /* Ende der Deklaration */

 

 

Erläuterungen

Jede (öffentliche) Klasse muß in einer eigenen Datei deklariert werden, die das Suffix ".java" besitzt. Der Name der Klassendatei muß ansonsten mit dem Namen der Klasse übereinstimmen, das gilt auch für die Groß-Kleinschreibung.

Die für eine Klassendeklaration erforderlichen Bezüge zu anderen Klassen, müssen importiert werden. Dazu gibt man den Namen der Klasse oder des entsprechenden Paketes hinter dem Schlüsselwort import an.

import stiftUndCo.*;

bedeutet: Benutze die Klassen des Pakets stiftUndCo zu. Soll nur die Klasse Stift dieses Paketes angesprochen werden, so gibt man statt des Jokers "*" den Klassennamen an:

import stiftUndCo.Stift;

 

Jede Klassendeklaration beginnt mit dem Schlüsselwort class, dem in der Regel der "Modifier" public vorangestellt wird, der den Zugriff auf diese Klasse bzw. Objekte dieser Klasse von anderen Objekten aus erst grundsätzlich ermöglicht.

 

public class <Bezeichner>

{

< Deklaration von Variablen>

< Methodendeklaration >

}

Attribute werden mit Hilfe von Variablen realisiert. Da der Zugriff auf die Attribute über Methoden erfolgen sollte, werden die Variablen für vor der Manipulation von außen geschützt, indem man sie als private deklariert. Dieses Schlüsselwort setzt man der Deklaration voran. Analog verfährt man mit der Implementierung von Variablen zur Verwaltung von Objekten, die in Hat- oder Kennt-Beziehung zu den Objekten der deklarierten Klasse stehen:

private <Datentyp> <Folge von Bezeichnern> ;

Alle Methoden mit Ausnahme des Konstruktors (s.u.) erhalten die Angabe eine Rückgabetyps. Dieser heißt void, wenn die Methode keine Rückgabe liefert. Eine Methode mit Rückgabetyp void entspricht der procedure in PASCAL, jede andere der function. Jede Methode besitzt eine Parameterliste, die auch leer sein kann.

Soll eine Methode von anderen Klassen oder Objekten benutzt werden können, so ist sie als public zu deklarieren, ansonsten als private. Dieses Schlüsselwort wird dem Methodennamen vorangestellt. Diese vorangestellten Bezeichner nennt man Modifier.

Die Initialisierungsmethode heißt genauso wie die Klasse, sie wird auch exakt gleich geschrieben. Ein Rückgabetyp (auch void) wird nicht angegeben. Eine Parameterliste kann dem Namen der Methode folgen. Diese Methoden bezeichnet man in JAVA als Konstruktoren.

Die Implementierung der Methoden selbst erfolgt unmittelbar auf die Deklaration des Methodenkopfes. Sie wird von geschweiften Klammern umgeben.

Die Ableitung einer Klasse aus einer Oberklasse

Soll eine Klasse aus einer Oberklasse abgeleitet werden, so benutzt man hierfür das Schlüsselwort extends:

public class Kreis extends GrafikKlasse {.....}

 

Verwendung von Objekten

a) Initialisierung und Freigabe von Objekten

Konkrete Objekte werden mit Hilfe von Variablen der Klasse realisiert:

private Kreis meinErsterKreis;

Zunächst wird ein Objekt mit Hilfe von new und mit Hilfe des Konstruktoraufrufs initialisiert. Das Ganze hat die syntaktische Struktur einer Zuweisung

meinErsterKreis = new Kreis(50,200,70);

 

Die Freigabe im Sinne einer Speicherplatzfreigabe ist unter JAVA nicht nötig. JAVA verfügt ebenso wie Oberon über einen automatischen Garbage-Collector. Die Methode gibFrei() bündelt in der Regel alle Abschlußaktionen eines Objektes, bevor es nicht mehr verwendet wird. Man kann dem Garbage-Collector des Systems eine kleine "Hilfe" geben, indem man der Variablen explizit den Wert null (entspricht NIL in PASCAL) zuweist.

meinErsterKreis.gibFrei();

meinErsterKreis=null;

b) Senden von Nachrichten an Objekte (Methodenaufruf):

Zunächst wird der Name des Empfängerobjekts angegeben, es folgt ein Punkt und abschließend der Name der Methode mit einer (gegebenenfalls auch leeren(!)) Parameterliste:

Beispiel:

meinErsterKreis.zeige();

Wie man sieht entspricht auch der Aufruf der Methode gibFrei() dieser Vorgehensweise.

Schickt ein Objekt eine Nachricht an sich selbst, so benutzt man für die Bezeichnung des Empfängers das Schlüsselwort this.

this.zeige();

 

Anfragen werden im Zusammenhang mit Zuweisungen benutzt:

derRadius=meinErsterKreis.radius();

 

Abschließend hier die vollständige Implementierung der Klasse Kreis:

 

class Kreis

{

/* Zustandsvariablen */

private double zHMitte, zVMitte, zRadius;

/* Variable zur Verwaltung der Objekte des Kreises */

 

private Stift :hStift;

 

/* Methodendeklaration */

/* Der Konstruktor */

 

public Kreis(double x, double y, double r)

{

/* Erzeugen des Stifts: */

hStift=new Stift();

 

/* Initialisierung der Zustandsvariablen */

zHMitte=x;

zVMitte=y;

zRadius=r;

} /* Ende Konstruktor */

 

public void zeige()

{

hStift.hoch();

hStift.bewegeBis(zHMitte,zVMitte);

hStift.normal();

hStift.zeichneKreis(zRadius);

}

public double radius()

{

return zRadius;

}

 

public Stift stift()

{

return hStift;

}

 

public void gibFrei()

{

/* Stift abbauen */

hStift.gibFrei();

hStift=null; //kleine Hilfe für den Garbage-Collector J

}

 

} /* Ende der Deklaration von Kreis */

 

 

 


Seitenanfang

© Georg Dick