Informatik

Klassen in Java: Bauplan für Objekte verstehen

Klassen in Java: Bauplan für Objekte verstehen
Klassen in Java: Bauplan für Objekte verstehen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

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.

Deine Lernziele

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.

Definition

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.

Definition

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.

Merke

Die Klasse beschreibt Gemeinsamkeiten. Jedes Objekt trägt seine eigenen Instanzwerte.

Teste dich
Frage 1 von 1LeichtWelche Aussage unterscheidet Klasse und Objekt richtig?
Lösung: Spielfigur kann eine Klasse sein; die Figur „Nova“ kann ein Objekt dieser Klasse sein. — Eine Klasse beschreibt einen Typ. Ein Objekt ist eine konkrete Instanz dieses Typs und existiert mit seinem Zustand während der Programmausführung.
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.

Definition

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.

Definition

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 name vom Typ String: speichert den Namen des jeweiligen Objekts.
  • Feld punkte vom Typ int: 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.

Lückentext

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 .

Lösungen: Lücke 1: Aufbau; Lücke 2: Feld; Lücke 3: Methode; Lücke 4: Objekt. Denke an die Rollen: Die Klasse legt den Aufbau fest, Felder speichern Zustand, Methoden führen Verhalten aus und jedes Objekt besitzt seine Instanzwerte.
Der Konstruktor startet neue Objekte

Beim Erzeugen einer Spielfigur sollen Name und Anfangspunktestand sofort sinnvoll gesetzt werden. Dafür dient in Java ein Konstruktor.

Definition

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.name ist das Feld des gerade entstehenden Objekts.
  • name ist der übergebene Parameter.

Danach setzt punkte = 0; den Startwert. Ein Aufruf wie new Spielfigur("Nova") erzeugt ein Objekt und initialisiert es mit diesem Konstruktor.

Merke

Ein Konstruktor ist keine gewöhnliche Methode: In Java hat er denselben Namen wie die Klasse und keinen Rückgabetyp.

Teste dich
Frage 1 von 1MittelWelche Deklaration ist ein passender Java-Konstruktor für die Klasse Spielfigur?
Lösung: public Spielfigur(String name) — Der Konstruktor heißt genau wie die Klasse. Vor seinem Namen steht in Java kein 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.

Definition

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.

Definition

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.

Teste dich
Frage 1 von 2MittelZwei Spielfiguren haben 3 beziehungsweise 7 Punkte. Was gehört sinnvoll zur Instanz?
Lösung: Der jeweilige Punktestand — Ein Wert ist ein Instanzwert, wenn jedes Objekt seinen eigenen Wert benötigt. Darum gehört punkte jeweils zu einer Figur.
Frage 2 von 2SchwerEine Methode soll nur die gemeinsam gespeicherte Anzahl aller Figuren zurückgeben. Welche Deklaration passt?
Lösung: public static int gibAnzahlFiguren() — Die Operation betrifft die Klasse als Ganzes. static kennzeichnet sie als Klassenmethode; der Rückgabetyp int passt zur Anzahl.
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.

Beispiel

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.

Teste dich
Frage 1 von 1MittelWas liefern nova.gibPunkte() und pixel.gibPunkte() nach den Schritten im Beispiel?
Lösung: 2 und 0 — Nur an nova wurde sammlePunkt() zweimal aufgerufen. Die beiden Instanzen behalten getrennte Punktestände.
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: titel und ausgeliehen
  • Konstruktor: erhält den Titel und setzt ausgeliehen auf false
  • Instanzmethoden: ausleihen() und zurueckgeben()

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:

  1. den Klassennamen,
  2. zwei Instanzfelder mit passenden Typen,
  3. den Konstruktorparameter und die beiden Initialisierungen,
  4. zwei passende Methoden.

Musterlösung zur Planungsaufgabe

Beispiel
  • Klasse: Aufgabe
  • Instanzfeld bezeichnung vom Typ String: Jede Aufgabe kann einen anderen Text besitzen.
  • Instanzfeld erledigt vom Typ boolean: Jede Aufgabe braucht ihren eigenen Wahrheitswert für offen oder erledigt.
  • Konstruktor Aufgabe(String bezeichnung): Er setzt this.bezeichnung = bezeichnung; und erledigt = false;. Damit erfüllt er beide Startanforderungen.
  • Methode erledigen(): setzt erledigt auf true.
  • Methode wiederOeffnen(): setzt erledigt auf false.

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.

Teste dich
Frage 1 von 1SchwerEin Programm verwaltet mehrere Bibliotheksbücher. Wo sollte der Ausleihstatus gespeichert werden?
Lösung: Als Instanzfeld jedes Buch-Objekts — Jedes Buch kann einen anderen Zustand haben. Darum benötigt jede Instanz ihren eigenen Wert für ausgeliehen.
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.

Teste dich
Frage 1 von 1SchwerEine Lernende sagt: „Der Konstruktor ist eine Methode mit void, die ich später beliebig aufrufe.“ Was ist die kleinste richtige Korrektur?
Lösung: Der Konstruktor hat keinen Rückgabetyp und wird beim Erzeugen eines neuen Objekts verwendet. — Die ähnliche Schreibform kann täuschen. In Java ist ein Konstruktor eine eigene Art von Deklaration ohne Rückgabetyp.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • 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
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWas ist ein Konstruktor in Java?
Lösung: Eine Deklaration ohne Rückgabetyp, die ein neues Objekt initialisiert — Der Konstruktor heißt wie die Klasse und wird bei der Objekterzeugung verwendet.
Frage 2 von 3MittelNach Buch a = new Buch("Atlas"); und Buch b = new Buch("Lexikon"); wird nur a.ausleihen() aufgerufen. Welche Modellierung ermöglicht, dass nur Atlas ausgeliehen ist?
Lösung: ausgeliehen ist ein Instanzfeld. — Die beiden Objekte brauchen unabhängige Zustände. Deshalb gehört der Ausleihstatus zu jeder Instanz.
Frage 3 von 3SchwerEin Spiel soll die Punkte jeder Figur und zusätzlich die Gesamtzahl aller erzeugten Figuren speichern. Welche Zuordnung passt?
Lösung: punkte als Instanzfeld, anzahlFiguren als statisches Feld — Frage bei jedem Wert: Braucht jedes Objekt eine eigene Ausprägung oder gibt es genau einen gemeinsamen Wert für die Klasse? Punkte sind individuell, die Gesamtzahl ist gemeinsam.

Passend dazu