Klassen und Objekte

Erinnerst du dich noch an das T-Shirt Beispiel aus dem Teil zu Arrays? Natürlich hat Java keinen Datentyp für deine T-Shirts. In diesem Kapitel lernst du, wie du deine eigenen Klassen und Objekte erstellen kannst. Dies ist ein sehr wichtiger Bestandteil von Java, da deine eigenen Programme natürlich nicht nur aus Java's hauseigenen Klassen bestehen sollen.

Klassen

Beginnen wir zunächst mit dem Konzept von Klassen. Du kannst dir eine Klasse als eine Art Bauplan für Objekte vorstellen. Die Klasse T-Shirt beispielsweise hat Attribute wie eine Farbe, eine Marke, einen Herstellungsort etc. Allerdings sind diese Attribute noch nicht konkret. Es ist also an diesem Punkt noch vollkommen unklar welche Farbe, welche Marke und welchen Herstellungsort dieses T-Shirt hat. Es ist nur klar, dass diese Attribute bei T-Shirts vorhanden sind. Die Definition dieser Klasse sieht wie folgt aus:
public class TShirt {
  …
}

// Listing 9.1 Klasse T-Shirt (TShirt.java)
Zunächst legen wir die Sichtbarkeit fest, dies wird auch Datenkapselung genannt. In unserem Beispiel ist die Klasse publicpublic, auf sie kann also auch von außerhalb der Klasse zugegriffen werden. In der folgenden Tabelle findest du weitere Arten der Datenkapselung.

Sichtbarkeit

Zugriffsmöglichkeit

public

Zugriff von innerhalb und außerhalb der Klasse möglich

private

Zugriff nur innerhalb der Klasse möglich

protected

Nur für Objekte der eigenen Klasse und von abgeleiteten Klassen dieser Klasse zugreifbar

package

Zugriff im gesamten Paket möglich

 Tabelle 9.1 Datenkapselung
Nachdem wir die Sichtbarkeit festgelegt haben, wird definiert, dass es sich um eine Klasse handelt. Anschließend folgt der Name der Klasse. Es ist gängige Praxis diesen Klassennamen großzuschreiben, damit sofort erkannt werden kann, dass es sich um eine Klasse handelt. Eine weitere Konvention ist die, dass der Dateiname nach der Klasse benannt wird. Im Normalfall findet sich pro Datei auch nur eine Klasse, in unserem Fall wäre der Dateiname also TShirt.java. Nachdem du nun gelernt hast, wie Klassen erstellt werden, schauen wir uns an, wie wir die Attribute der Klasse festlegen können.
public class TShirt {
  String farbe;
  String marke;
  String herstellungsort;

  void gibInformationenAus() {
    System.out.println("Farbe: " + this.farbe +", Marke: " + this.marke + ", Herstellungsort: " + this.herstellungsort);
  }
}

// Listing 9.2 Erweiterung der Klasse T-Shirt (TShirt.java)
Die Attribute werden genauso festgelegt wie Variablen, allerdings normalerweise ohne die Zuweisung eines Wertes. Natürlich können Klassen auch Methoden enthalten. In diesem Fall hat die Klasse eine Methode zur Ausgabe aller Attribute. Das Wort thisthis meint nur, dass es sich um Attribute der aktuellen Klasse handelt und nicht etwa um Hilfsvariablen.

Konstruktor der Klasse
Natürlich soll die Klasse auch in der Lage sein, richtige Informationen zu speichern. Dafür benötigt die Klasse noch einen Konstruktor. Dieser verhält sich ähnlich wie eine Methode. Er wird aufgerufen, sobald ein Objekt der Klasse erstellt wird. Das klingt etwas komplizierter als es ist, deswegen schauen wir uns dazu ein Beispiel an:

public class TShirt {
  String farbe;
  String marke;
  String herstellungsort;

  public TShirt(String farbe, String marke, String herstellungsort) {
    this.farbe = farbe;
    this.marke = marke;
    this.herstellungsort = herstellungsort;
  }

  void gibInformationenAus() {
    System.out.println("Farbe: " + this.farbe +", Marke: " + this.marke + ", Herstellungsort: " + this.herstellungsort);
  }
}

// Listing 9.3 Klasse T-Shirt mit Konstruktor
Anders als bei einer Methode, musst du hier keinen Rückgabewert angeben, da ein Konstruktor nicht dazu gemacht ist, etwas zurückzugeben. Der Name des Konstruktors ist derselbe, wie der Name der Klasse. In unserem Fall dient der Konstruktor dazu, Informationen von dem Objekt in der Klasse zu speichern. Die Zuweisungen innerhalb des Konstruktors dienen dazu, den Klassenattributen (this.farbethis.farbe, this.markethis.marke, etc.) die Werte aus den Parametern zuzuweisen.

Objekte

Objekte sind im Gegensatz zu Klassen spezifisch. Hier bekommt die Klasse ihr „Leben“, also ihre Werte zugewiesen. Das Objekt TShirtTShirt repräsentiert also ein echtes T-Shirt, zum Beispiel aus deinem Kleiderschrank. Schauen wir uns nun an, wie wir ein entsprechendes Objekt unserer Klasse TShirtTShirt erstellen können:
TShirt erstesTShirt = new TShirt("Schwarz", "Beispielmarke", "Deutschland");

// Listing 9.4 Instanz der Klasse T-Shirt
Die Definition eines Objekts wird auch Instanziierung genannt. Sie erfolgt ähnlich wie die Definition einer Variable. Zunächst wird der Name der Klasse angegeben, danach kannst du dem Objekt einen eigenen Namen geben. Zuletzt erfolgt die Zuweisung: newTShirt()new TShirt(…) macht dabei nichts anderes, als den Konstruktor der Klasse TShirtTShirt aufzurufen. Dieser speichert dann die Parameterwerte in der Klasse. Du kannst nun alle Attribute und Methoden der Klasse an dem Objekt aufrufen. Möchtest du zum Beispiel Informationen über das T-Shirt haben, kannst du einfach die Funktion gibInformationenAus()gibInformationenAus() an dem Objekt aufrufen.
TShirt erstesTShirt = new TShirt("Schwarz", "Beispielmarke", "Deutschland");
erstesTShirt.gibInformationenAus();

Ausgabe: Farbe: Schwarz, Marke: Beispielmarke, Herstellungsort: Deutschland

// Listing 9.5 Zugriff auf Funktionen einer Klasse
Auf die gleiche Art kannst du natürlich auch auf Attribute zugreifen. Denk aber daran, dass diese nicht automatisch ausgegeben werden.

Zusammenfassung

Du hast nun eines der wichtigsten Konzepte der objektorientierten Programmierung kennengelernt. Da dieses Konzept durchaus etwas kompliziert ist, möchte ich dir hier nochmal die wichtigsten Punkte an die Hand geben:
  • Eine Klasse ist eine Art abstrakter Bauplan
  • Das Objekt ist der tatsächliche Gegenstand, welcher anhand der Klasse als Bauplan erstellt wurde
  • Eine Klasse hat verschiedene Sichtbarkeitsstufen. Diese werden unter dem Begriff der Datenkapselung zusammengefast.
  • Du solltest deine Klassennamen groß schreiben
  • Klassenname und Dateiname sollten identisch sein
  • Der Konstruktor speichert Objektinformationen in Klassenattributen
Kommentieren Kommentare