Klassen in Java: Bauplan für Objekte verstehen
Eine Klasse beschreibt, welche Daten gleichartige Objekte speichern und welches Verhalten sie besitzen. Ein Objekt ist dagegen ein konkretes Exemplar, das während der Programmausführung nach diesem Bauplan entsteht. Auf dieser Seite siehst du die allgemeinen Grundideen der objektorientierten Programmierung an Java. Andere Programmiersprachen können dafür eine andere Schreibweise verwenden.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Klasse und Objekt auseinanderhalten
Stell dir ein Spiel mit vielen Spielfiguren vor. Jede Figur hat einen Namen und einen Punktestand. Jede Figur kann einen Punkt sammeln. Diese Gemeinsamkeiten gehören in die Klasse Spielfigur.
Klasse
Eine Klasse ist eine Beschreibung für eine Gruppe gleichartiger Objekte. Sie legt deren Datenstruktur und mögliche Operationen fest. In Java ist eine Klasse zugleich ein selbst definierter Typ.
Die Klasse ist nicht mit einem einzelnen Objekt zu verwechseln. Aus Spielfigur können zum Beispiel die Objekte „Nova“ und „Pixel“ entstehen. Beide folgen derselben Klassenbeschreibung, können aber unterschiedliche Punktestände besitzen.
Objekt
Ein Objekt, auch Instanz genannt, ist ein konkretes Exemplar einer Klasse zur Laufzeit. Es besitzt einen eigenen Zustand. Eine Variable wie nova speichert in Java eine Referenz, also einen Verweis auf dieses Objekt.
Die Klasse beschreibt Gemeinsamkeiten. Jedes Objekt trägt seine eigenen Instanzwerte.
Attribute speichern, Methoden handeln
Eine Klasse bündelt Zustand und Verhalten. Dadurch liegt zusammen, welche Daten zu einem Objekt gehören und was das Objekt damit tun kann.
Attribut
Ein Attribut beschreibt eine gespeicherte Eigenschaft. In Java heißt die entsprechende Variable im Klassenrumpf Feld. Ein Instanzfeld wie punkte besitzt für jedes Objekt einen eigenen Wert.
Methode
Eine Methode ist eine benannte Operation einer Klasse. Ihr Methodenrumpf enthält Anweisungen. Eine Instanzmethode wie sammlePunkt() arbeitet für das Objekt, an dem sie aufgerufen wird.
Für eine Spielfigur passen beispielsweise:
- Feld
namevom TypString: speichert den Namen des jeweiligen Objekts. - Feld
punktevom Typint: speichert dessen aktuellen Punktestand. - Methode
sammlePunkt(): erhöht den Punktestand dieses Objekts. - Methode
gibPunkte(): liefert den Punktestand zurück.
Das Zugriffswort private schützt ein Feld vor einem direkten Zugriff von außen. Öffentliche Methoden mit public können einen kontrollierten Zugang anbieten. Diese Trennung hilft, den Zustand nur auf vorgesehenen Wegen zu verändern.
Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.
Eine Klasse beschreibt den gemeinsamen ihrer Objekte. Ein Java- speichert Daten. Eine beschreibt eine Operation. Der Wert eines Instanzfelds gehört jeweils zu einem .
Der Konstruktor startet neue Objekte
Beim Erzeugen einer Spielfigur sollen Name und Anfangspunktestand sofort sinnvoll gesetzt werden. Dafür dient in Java ein Konstruktor.
Konstruktor
Ein Konstruktor ist eine besondere Deklaration zur Initialisierung eines neuen Objekts. In Java trägt er den Namen der Klasse und hat keinen Rückgabetyp, auch nicht void. Er wird im Zusammenhang mit new aufgerufen.
Der Konstruktor public Spielfigur(String name) erhält einen Startnamen. Die Anweisung this.name = name; unterscheidet zwei Dinge:
this.nameist das Feld des gerade entstehenden Objekts.nameist der übergebene Parameter.
Danach setzt punkte = 0; den Startwert. Ein Aufruf wie new Spielfigur("Nova") erzeugt ein Objekt und initialisiert es mit diesem Konstruktor.
Ein Konstruktor ist keine gewöhnliche Methode: In Java hat er denselben Namen wie die Klasse und keinen Rückgabetyp.
Instanz oder static entscheiden
Der Name und die Punkte gehören jeweils zu einer bestimmten Spielfigur. Die Zahl aller erzeugten Figuren soll dagegen einmal für die gesamte Klasse geführt werden. Java kennzeichnet solche Klassenelemente mit static.
Instanzelement
Ein nicht mit static deklariertes Feld oder eine solche Methode gehört zu den Instanzen. Jedes Objekt besitzt seine eigenen Instanzfeldwerte; eine Instanzmethode wird an einer Objektreferenz aufgerufen.
Klassenelement
Ein mit static deklariertes Feld oder eine solche Methode gehört zur Klasse als Ganzes. Ein statisches Feld wird von allen Instanzen gemeinsam genutzt. Eine statische Methode wird üblicherweise über den Klassennamen aufgerufen.
Im Beispiel ist private static int anzahlFiguren ein Klassenfeld. Der Konstruktor erhöht es bei jeder neuen Figur. Die Instanzmethode wird mit nova.sammlePunkt() aufgerufen; die statische Methode mit Spielfigur.gibAnzahlFiguren().
Eine statische Methode hat kein automatisch ausgewähltes Spielfigur-Objekt. Sie kann daher nicht einfach auf das Instanzfeld punkte zugreifen. Dafür bräuchte sie eine konkrete Objektreferenz. Das Klassenfeld anzahlFiguren kann sie dagegen direkt verwenden.
Eine vollständige Klasse lesen
Hier ist die Klasse Spielfigur zeilenweise dargestellt. Die Inline-Codezeilen ergeben zusammen den Java-Klassenrumpf:
- private String name; - private int punkte; - private static int anzahlFiguren = 0; - public Spielfigur(String name) { - this.name = name; - punkte = 0; - anzahlFiguren = anzahlFiguren + 1; - } - public void sammlePunkt() { - punkte = punkte + 1; - } - public int gibPunkte() { - return punkte; - } - public static int gibAnzahlFiguren() { - return anzahlFiguren; - }
class Spielfigur {}
void bei sammlePunkt() bedeutet, dass die Methode keinen Wert zurückgibt. int bei gibPunkte() bedeutet, dass die Methode eine ganze Zahl zurückgibt. Diese Rückgabetypen gehören zu Methoden, nicht zum Konstruktor.
Zuerst läuft Spielfigur nova = new Spielfigur("Nova");. Es entsteht eine Figur mit 0 Punkten; nova verweist auf sie und die gemeinsame Anzahl wird 1.
Dann läuft Spielfigur pixel = new Spielfigur("Pixel");. Ein zweites Objekt entsteht mit eigenen 0 Punkten; die gemeinsame Anzahl wird 2.
Nach nova.sammlePunkt(); und einem zweiten Aufruf derselben Methode hat Nova 2 Punkte. Pixel bleibt bei 0 Punkten. Spielfigur.gibAnzahlFiguren() liefert 2, weil dieses Klassenfeld beiden Objekten gemeinsam ist.
Aus Anforderungen eine Klasse planen
Bevor du Code schreibst, frage: Welche Objekte braucht das Programm? Welche Daten ändern ihren Zustand? Welche Operationen sollen erlaubt sein? Nicht jedes Hauptwort einer Beschreibung muss automatisch eine Klasse werden. Eine Klasse ist ein zweckgebundenes Modell: Sie enthält nur, was das Programm für seine Aufgaben benötigt.
Angenommen, ein Bibliotheksprogramm soll Bücher mit Titel und Ausleihstatus verwalten. Ein Buch soll ausgeliehen und zurückgegeben werden können.
Eine passende erste Planung ist:
- Klasse:
Buch - Instanzfelder:
titelundausgeliehen - Konstruktor: erhält den Titel und setzt
ausgeliehenauffalse - Instanzmethoden:
ausleihen()undzurueckgeben()
In einem einfachen UML-Klassendiagramm steht der Klassenname oben, darunter stehen Attribute und anschließend Methoden. Die Notation - titel: String bezeichnet ein privates Attribut; + ausleihen(): void eine öffentliche Operation. Das Diagramm plant die Struktur, während Java-Code sie für ein Programm umsetzt.
Jetzt planst du selbst
Eine Schul-App verwaltet Aufgaben. Jede Aufgabe hat eine Bezeichnung und kann entweder offen oder erledigt sein. Beim Erzeugen wird die Bezeichnung übergeben; die Aufgabe beginnt offen. Später soll man sie als erledigt markieren und wieder öffnen können.
Notiere zuerst selbst:
- den Klassennamen,
- zwei Instanzfelder mit passenden Typen,
- den Konstruktorparameter und die beiden Initialisierungen,
- zwei passende Methoden.
Musterlösung zur Planungsaufgabe
- Klasse:
Aufgabe - Instanzfeld
bezeichnungvom TypString: Jede Aufgabe kann einen anderen Text besitzen. - Instanzfeld
erledigtvom Typboolean: Jede Aufgabe braucht ihren eigenen Wahrheitswert für offen oder erledigt. - Konstruktor
Aufgabe(String bezeichnung): Er setztthis.bezeichnung = bezeichnung;underledigt = false;. Damit erfüllt er beide Startanforderungen. - Methode
erledigen(): setzterledigtauftrue. - Methode
wiederOeffnen(): setzterledigtauffalse.
Die Felder sind Instanzfelder, weil zwei Aufgaben gleichzeitig unterschiedliche Bezeichnungen und Zustände haben können. Ein gemeinsames static-Feld wäre dafür ungeeignet.
Typische Verwechslungen vermeiden
Bauplan oder Exemplar? Buch bezeichnet die Klasse; meinBuch kann eine Referenz auf ein konkretes Buchobjekt sein.
Attribut oder aktueller Wert? punkte ist im Modell ein Attribut beziehungsweise im Java-Code ein Feld. Die Zahl 7 ist ein möglicher Wert dieses Felds bei einem bestimmten Objekt.
Methode oder Konstruktor? Beide können Parameter besitzen. Nur der Konstruktor heißt wie die Klasse und hat keinen Rückgabetyp. Eine Methode besitzt einen Rückgabetyp wie int oder void.
Instanz oder Klasse? Ein individueller Zustand gehört zur Instanz. Ein wirklich gemeinsamer Wert oder eine objektunabhängige Operation kann static sein. Verwende static nicht bloß, damit ein Zugriff bequemer wirkt.
Referenz oder Objekt? Bei Spielfigur nova = new Spielfigur("Nova"); ist nova die Referenzvariable. new Spielfigur("Nova") erzeugt das Objekt, auf das sie verweist.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- Klasse
- beschreibt Felder und Methoden
- dient als Typ für Objekte
- Objekt
- entsteht mit `new` und einem Konstruktor
- besitzt eigene Instanzwerte
- Verhalten
- Instanzmethode arbeitet an einem Objekt
- statische Methode gehört zur Klasse
- Modellierung
- wählt nur zweckmäßige Daten und Operationen
- kann als UML-Klassendiagramm geplant werden
Mit Google fortfahren