Klassenvariablen und -methoden, Konstruktoren, statischer

Werbung
3. Klassen
Statische Komponenten einer Klasse
Klassenvariablen
• Wir wollen die Zahl der instantiierten Studentenobjekte zählen.
• Dies ist jedoch keine Eigenschaft eines einzelnen Objektes. Vielmehr gehört die
Eigenschaft zu der Gesamtheit aller Studentenobjekte.
• Eigenschaften einer Klasse als Ganzes werden durch Klassenvariablen repräsentiert.
Syntax für eine private Klassenvariable:
private static Datentyp Variablenname = Initialwert;
Beispiel:
private static int studZaehler = 0;
• Das Schlüsselwort static “macht” eine Variable zur Klassenvariable.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
81
3. Klassen
Statische Komponenten einer Klasse
• Wenn die Zugriffsrechte nicht dagegen sprechen, erfolgt der Zugriff auf eine Klassenvariable durch:
Klassenname.Variablenname
• Beispiel: Wäre studZaehler öffentlich, könnte man den Zählerwert wie folgt ausgeben:
System.out.println(Student.studZaehler);
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
82
3. Klassen
Statische Komponenten einer Klasse
Klassenmethoden
Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:
public static int getZaehler() {
return studZaehler;
}
Nutzung der Klassenmethode:
System.out.println(Student.getZaehler());
• Eine Klassenmethode ist eine Methode, die der Klasse als Ganzes zugeordnet ist.
• In Klassenmethoden ist kein Zugriff auf Instanzvariablen möglich.
• Nutzung allgemein:
Klassenname.Methodenname( aktuelle Parameter )
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
83
3. Klassen
Statische Komponenten einer Klasse
Wie können wir dafür sorgen, dass bei der Erzeugung von Objekten der “Studentenzähler” korrekt erhöht wird?
Eine (noch nicht optimale) Möglichkeit: Wir “verpacken” die Erzeugung in einer Klassenmethode:
public static Student createStudent() {
studZaehler = studzaehler + 1;
return new Student();
}
Nutzung:
Student studi = Student.createStudent();
System.out.println(Student.getZaehler());
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
84
3. Klassen
• Warum nicht optimal? Bei älteren Programmen, die new verwenden, wird
der Zähler nicht erhöht.
• Wie können wir dies abstellen? Verwendung eines sogenannten Konstruktors (siehe folgendes Thema).
• Klassenmethoden und Klassenvariablen werden in Klassendiagrammen
durch Unterstreichung gekennzeichnet.
Statische Komponenten einer Klasse
Student
-name:
-nummer:
-studZaehler:
+getName()
+getNummer()
+setName(String)
+setNummer(int)
+validateNummer()
+toString()
+getZaehler()
+createStudent()
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
String
int
int
String
int
void
void
boolean
String
int
Student
85
3. Klassen
Statische Komponenten einer Klasse
Vereinbarung von Konstanten
• Die Vereinbarung von Konstanten erfolgt innerhalb einer Klassendefinition.
• Konstanten sind Klassenvariablen.
• Durch das Schlüsselwort final wird die nachträgliche Änderung des Variablenwerts verboten.
Syntax für die Deklaration öffentlicher Konstanten:
public static final Datentyp Variablenname = Initialwert;
Beispiel: Definition von Konstanten für Studienfächer:
public static final int MATHEMATIK STUDIUM = 1;
public static final int INFORMATIK STUDIUM = 2;
public static final int BIOLOGIE STUDIUM = 3;
...
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
86
3. Klassen
Statische Komponenten einer Klasse
• Der Zugriff erfolgt wie bei Klassenvariablen:
Klassenname.Variablenname
• Es hat sich die Schreibweise durchgesetzt, dass Konstantennamen ausschließlich
aus Großbuchstaben und Unterstrichen bestehen. Teilwörter werden durch einen
Unterstrich getrennt (siehe Java Code Conventions).
• Die Zuweisung an eine als Konstante vereinbarte Variable führt zu einem Fehler
bei der Übersetzung.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
87
3. Klassen
Konstruktor
Konstruktor
• Mit Konstruktoren können wir Einfluss auf die Erzeugung eines Objektes nehmen.
• Konstruktoren erlauben es, den Anfangszustand von Objekten zu parametrisieren.
• Der Aufruf des/der Konstruktoren erfolgt implizit bei Anwendung von new.
Syntax für einen öffentlichen Konstruktor:
public Klassenname( Parameterliste )
{
Anweisungen
}
• Ein Konstruktor heißt immer so wie die Klasse.
• In der Parameterliste werden Argumente vereinbart.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
88
3. Klassen
Konstruktor
Der einfachste Konstruktor für Student lautet:
public Student() { }
Allgemein ist dies der Standard-Konstruktor. Er wird automatisch angelegt, wenn kein
Konstruktor definiert wurde (aber nur genau für diesen Fall).
Wir sollten im Konstruktor dafür sorgen, dass automatisch der Zähler für die Studentenobjekte erhöht wird.
public Student() {
studZaehler = studZaehler + 1;
}
Damit ist die Klassenmethode createStudent überflüssig.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
89
3. Klassen
Konstruktor
Überladen von Konstruktoren
• Wie Methoden können auch Konstruktoren überladen werden.
• D.h., es darf mehrere Konstruktoren zu einer Klasse geben.
• Diese müssen sich aber in ihrer Signatur unterscheiden.
Weiterer möglicher Konstruktor für Student:
public Student(String name, int nummer) {
studZaehler = studZaehler + 1;
this.name = name;
this.nummer = nummer;
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
90
3. Klassen
Konstruktor
• Innerhalb eines Konstruktors darf als erste Anweisung ein anderer Konstruktor aufgerufen werden.
• Dies erfolgt durch das Schlüsselwort this in Verbindung mit aktuellen Parametern.
Beispiel:
public Student(String name, int nummer) {
this();
this.name = name;
this.nummer = nummer;
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
91
3. Klassen
Statische Komponenten einer Klasse
Der statische Initialisierer
• Ein Konstruktor ermöglicht uns eine objektbezogene Initialisierung.
• Gibt es auch eine klassenbezogene Initialisierung?
• Ja, mit Hilfe des statischen Initialisierers.
Syntax:
static
{
Anweisungen
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
92
3. Klassen
Statische Komponenten einer Klasse
• Ein statischer Initialisierer einer Klasse wird ausgeführt, wenn die Klasse geladen
wird.
• Eine Klasse wird vom Class Loader der virtuellen Maschinene geladen, wenn sie
das erste mal benötigt wird.
• Eine Klasse kann mehrere statische Initialisierer haben.
Für die Anweisungen gelten die Einschränkungen eines statischen Kontextes:
• Nur Zugriff auf statische Komponenten einer Klasse.
• Zugriff auf alle (auch private) Teile einer Klasse.
• Weitere Einschränkung: Statische Initialisierer haben nur Zugriff auf statische Komponenten, die im Programmcode vor ihnen definiert wurden.
☞ Beispiel zum statischen Initialisierer.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
93
3. Klassen
Beispiele
Nutzen der Kapselung
Wenn wir Programmlogik in einem Objekt kapseln, dann können wir
1. diese Logik mehrmals zur gleichen Zeit einsetzen,
Beispiel: gleichzeitig mehrere unabhängige Objekte
2. in unterschiedlichen Zusammenhängen nutzen und
Beispiel: Programm zum Zählen von Zeilen, Wörtern und Zeichen
3. komplexere Objekte aus einfacheren Objekten zusammensetzen.
Beispiel: Die Klassen TorZaehler und Spielstand
☞ Leichtere Wiederverwendbarkeit
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
94
3. Klassen
Beispiele
Weitere Beispiele:
• Klausuraufgabe Skyline
Entwerfen Sie eine Klasse zur Ermittlung der Skyline, die von einer Menge von
Gebäuden erzeugt wird.
5
5
0
5
10
15
0
Gebäude
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5
10
15
Skyline
95
3. Klassen
Beispiele
– Die Skyline reicht in der Breite von 0 bis B .
– Jedes Gebäude wird beschreiben durch ein Tripel (l, h, r) mit 0 ≤ l < r ≤ B .
Hierbei ist l der linke Rand, r der rechte Rand und h die Höhe des Gebäudes.
– Die oben angegebene Skyline wird beispielsweise durch B = 15 und die
Gebäude (3, 3, 10), (6, 6, 12), (11, 4, 14) erzeugt.
Die Klasse soll die folgenden Methoden aufweisen:
– Ermittlung der Breite B der Skyline.
– Einfügen eines Gebäudes (l, h, r) in die Skyline.
– Ermittlung der Höhe der Skyline an der Stelle i.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
96
3. Klassen
Beispiele
• Klausuraufgabe TextSpeicher
Definieren Sie eine Klasse für die Speicherung von Texten. Ein Objekt Ihrer
Klasse soll bis zu 15 Texte speichern können. Jedem Text ist dabei eine
Position im Speicher zugeordnet. Für die Verwaltung der Texte sollen die
folgenden Methoden zur Verfügung stehen:
– Löschen eines Textes
Der Text an Position i wird aus dem Speicher entfernt. Alle Texte mit einer
Position größer als i rücken um eine Position nach vorne.
– Speichern eines Textes
Der Text wird an der ersten freien Position gespeichert. Ist der Textspeicher
voll, so wird der an der ersten Position gespeicherte Text gelöscht und der
neue Text wird als letzter Text im Speicher abgelegt.
– Rückgabe des Textes an Position i
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
97
Herunterladen