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