Home > Informatik > Begriffe und Konzepte > Klassen

Klasse

Klassen sind der grundlegende Baustein der Objektorientierten Programmierung (OOP).

Bereits bei der ersten Begegnung mit BlueJ hatten wir es mit Klassen zu tun. In dem Shapes-Projekt gibt es die Klassen Circle, Square, Triangle und Canvas. Bereits in der Folge 1 haben wir diese vier Java-Klassen um eine selbst geschriebene Klasse Zeichnung ergänzt, in der Objekte der Klassen Circle, Square und Triangle angelegt und manipuliert wurden.

Drei Typen von Klassen in Java

In der Programmiersprache Java gibt es drei Kategorien von Klassen:

  1. konkrete Klassen
  2. Schnittstellenklassen
  3. abstrakte Klassen

Konkrete Klassen

Unter diesem Begriff versteht man die "normalen" Java-Klassen, die man zu Beginn eines Java-Kurses kennenlernt. Die Klassen aus dem Shapes-Projekt sind beispielsweise solche konkreten Klassen, oder die Klasse Held aus dem Adventuregame-Projekt.

Die konkrete Klasse Held

Dieses Bild zeigt den Quelltext der konkreten Klasse Held. Wie man an dem Schlüsselwort extends erkennen kann, handelt es sich bei dieser Klasse um eine Unterklasse der Klasse Person, es liegt also eine Vererbungsbeziehung vor.

Die Klasse Held hat wie alle konkreten Klassen drei wesentliche Bestandteile:

  1. Die Instanzvariablen - hier nur int gold
  2. Die Konstruktoren - hier nur der Konstruktor Held(String name)
  3. Die Methoden - hier zwei Methoden trinkeHeiltrank() und findeGold()

Von einer solchen konkreten Klasse können beliebig viele Objekte angelegt werden, die auch als Instanzen der Klasse bezeichnet werden. Die Werte der Instanzvariablen können sich bei zwei Objekten der gleichen Klasse unterscheiden, man sagt dann, die Objekte haben einen unterschiedlichen Status.

Schnittstellenklassen

Schnittstellenklassen werden mit dem Schlüsselwort interface statt class erzeugt. Hier ein Beispiel für das Adventuregame:

Beschreibung siehe folgenden Text

Das Interface Kaempfer

Dieses Bild zeigt den kompletten Quelltext der Schnittstellenklasse Kaempfer. Dieses Interface stellt nur die Signaturen von zwei Methoden zur Verfügung, angreifen() und schadenNehmen().

Alle Klassen, die dieses Interface einbinden, sind verpflichtet, diese beiden Methoden zu implementieren. Die Signatur der Methoden muss dabei beibehalten werden, sie darf nicht verändert oder ergänzt werden.

Betrachten wir jetzt die Klasse Person, die dieses Interface einbindet.

Beschreibung siehe folgenden Text

Der Anfang der Klasse Person

Wichtig ist hier das Schlüsselwort implements. Dadurch verpflichtet sich die Klasse Person, alle vom Interface vorgeschriebenen Methoden zu implementieren.

Damit die Methode schadenNehmen() funktioniert, wurden die Instanzvariablen der Klasse Person jetzt als double-Variablen angelegt; die Berechnungen sind dann einfacher.

Schauen wir uns nun an, wie die Klasse Person die beiden vorgeschriebenen Methoden implementiert:

Beschreibung siehe folgenden Text

Die beiden Interface-Methoden werden implementiert

Warum überhaupt Interfaces ?

Man könnte doch die Methoden angreifen() und schadenNehmen() auch direkt in der Klasse Person implementieren, ohne zuvor ein Interface zu entwerfen. Es stellt sich also die Frage, welchen Sinn und Nutzen solche Schnittstellenklassen überhaupt haben.

Es gibt Programmiersprachen, die eine Mehrfachvererbung erlauben. Eine Klasse X kann also gleichzeitig Unterklasse von A und Unterklasse von B sein. Stellen Sie sich die beiden Klassen Auto und Boot vor. Eine Klasse Amphibienfahrzeug könnte durch eine solche Mehrfachvererbung nun alle Eigenschaften der Klasse Auto erben und gleichzeitig alle Eigenschaften der Klasse Boot.

In Java ist das mithilfe von Schnittstellenklassen (Interfaces) möglich. Dazu definieren wir ein Interface Fahrbar, das folgende Methoden vorschreibt:

  • void lenken(double grad): Ändert die Richtung des Fahrzeugs.
  • void beschleunigen(double kmh): Erhöht die Geschwindigkeit.
  • void bremsen(): Reduziert die Geschwindigkeit auf null.
  • int getAnzahlRaeder(): Gibt die Anzahl der Räder zurück, da dies ein typisches Merkmal von Landfahrzeugen ist

Ein zweites Interface Schwimmbar schreibt vor, welche Methoden ein Boot oder ein anderes schwimmendes Fahrzeug implementieren muss:

  • void ruderStellen(double grad): Ändet die Richtung im Wasser.
  • void ankerWerfen(): Stoppt das Fahrzeug im Wasser und fixiert es.
  • void ankerLichten(): Löst den Anker, um die Fahrt fortzusetzen.
  • double getTiefgang(): Gibt den Tiefgang des Fahrzeugs in Metern an.

Eine Klasse Amphibienfahrzeug könnte nun beide Interfaces implementieren:

public class Amphibienfahrzeug implements Fahrbar, Schwimmfaehig
{
 ...
}

So haben wir quasi eine Zweifachvererbung simuliert. Auch eine Dreifach- oder Mehrfachvererbung ist mithilfe solcher Interfaces möglich.

Interface

Auf dieser Seite erfahren Sie noch mehr zum Thema "Interface", ein weiteres Beispiel erläutert hier das wichtige Konzept. Auch das Thema "Abstrakte Klassen" wird auf dieser Seite vertieft.

Abstrakte Klassen

Abstrakte Klassen sind im Prinzip "normale" bzw. konkrete Klassen, die aber mindestens eine abstrakte Methode besitzen.

Eine abstrakte Methode ist im Grunde genau das Gleiche, was ein Interface an Methoden zur Verfügung stellt: Es wird nur die Signatur der Methode definiert, aber keine Implementation. Die Implementation muss von der Unterklasse der abstrakten Klasse gewährleistet werden - zwingend. Der Compiler liefert eine Fehlermeldung, wenn die Unterklasse die abstrakte Methode der abstrakten Oberklasse nicht implementiert.

Insofern sind abstrakte Klassen ein Mittelding zwischen konkreten Klassen und Schnittstellenklassen.

Interface vs. abstrakte Klasse

Ein Interface sollte man einsetzen, wenn unterschiedliche Klassen (mit verschiedenen Oberklassen) dieselbe Fähigkeit besitzen sollen. Beispielsweise sind die Klassen Superheld und Flugzeug überhaupt nicht miteinander verwandt, sollen aber beide die Fähigkeit bzw. die Methode fliegen() besitzen. Dies lässt sich über ein Interface Fliegbar realisieren.

Eine abstrakte Klasse sollte man einsetzen, wenn man gemeinsamen Code mehreren verwandten Klassen zur Verfügung stellen will. Eine abstrakte Klasse kann nämlich durchaus fertig implementierte Methoden zur Verfügung stellen, die sich alle Unterklassen teilen. Sie kann aber auch nur die Schnittstelle einer Methode präsentieren, die dann von allen Unterklassen implementiert werden muss.

Ich habe mir von ChatGPT eine Tabelle erstellen lassen, die den Unterschied zwischen diesen beiden Klassentypen genauer darstellt-

ChatGPT-Tabelle zum Unterschied Interface - Abstrakte Klasse
Aspekt Interface Abstrakte Klasse
Zweck Legt reines Verhalten fest, das beliebige Klassen (auch völlig verschiedene Hierarchien) umsetzen können. Dient als gemeinsame Basisklasse mit teilweise fertiger Implementierung.
Vererbung Eine Klasse kann mehrere Interfaces implementieren → Mehrfachvererbung von Verhalten möglich. Eine Klasse kann nur eine abstrakte Klasse erben → Einfachvererbung.
Methoden Ab Java 8: abstrakte Methoden, default-Methoden (mit Standardimplementierung) und static-Methoden. Kann abstrakte und vollständig implementierte Methoden enthalten.
Attribute Nur public static final-Konstanten. Alle Arten von Attributen erlaubt (Instanz- und Klassenvariablen, beliebige Sichtbarkeit).
Wann benutzen?
  • Wenn nur ein Vertrag (Methodensignaturen) festgelegt werden soll.
  • Wenn unterschiedliche Klassen gleiche Funktionalität anbieten sollen, ohne gemeinsame Oberklasse zu benötigen.
  • Für Rollen oder Fähigkeiten (z. B. Serializable, Comparable).
  • Wenn es gemeinsame Daten oder Standardimplementierungen für Unterklassen gibt.
  • Wenn ein gemeinsames Grundverhalten für verwandte Klassen vorgegeben werden soll.
  • Als Teilskelett für eine Klassenhierarchie.

Auf den ersten Blick sieht das gar nicht mal so schlecht aus.

Quellen:

  1. Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
  2. Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
  3. Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
  4. Martin: Clean Code - A Handbook of Agile Software Craftmanship, Pearson Education 2009