Skip to main content

3 Möglichkeiten um Vererbung von Java Klassen zu verhindern, zu verbieten oder ausschließen

Die ganze Java Vererbung für bestimmte Klassen ausschließen bzw. verhindern oder verbieten.

Was soll das?
Für bestimmte Java Klassen soll die Vererbung ausgeschlossen werden.
Es soll also verhindert werden, dass Elternklassen – Kindklassen bekommen können.

Klingt ein bisschen wie Verhütung, oder?

Denn wie auch im echten Leben, können Kinder zu kleinen Tyrannen werden.
Sie bedienen sich der elterlichen Ressourcen und machen damit was sie wollen. 🙂

Wo soll das nur enden?
Nun stell dir mal folgendes vor:
Du hast eine Klasse Tier und diese Klasse hat weitere Unterklassen zum Beispiel Pferd.
Das Pferd hat wiederum Unterklassen für Haflinger, Ponys oder Przewalski-Pferde.

Irgendwann muss doch auch mal Schluss sein.
Nach dem Przewalski-Pferd – was soll da noch kommen?
Eine Unterklasse, wie kleines und großes Przewalski-Pferd macht keinen Sinn.

Hier endet diese Vererbungslinie also.
Jede weitere Kindklasse von dieser Pferdeart würde das Programm nicht verbessern.
Ganz im Gegenteil – Es würde das Programm nur noch verschlechtern, es unnütz aufblähen und unverständlich machen.

Du, als Entwickler, so eines Pferdeprogrammes solltest darauf achten, dass du die Vererbungslinie irgendwann einmal enden lässt.

Denn die Superklassen kennen ihre Kinder nicht.

Das einfache Setzen des Keywort extends reicht völlig aus.
Und schwuppdiwupp sind die Super- oder Oberklassen stolze Eltern.
Aus einer ganz allgemeinen Klasse „Tier“, wird die speziellere Kindklasse „Pferd“.
So wie hier.

public class Tier {
	int alter; //Alter des Tieres
	int groesse;//Größe des Tieres
	int anzahlBeine;//Anzahl der Beine
}

Und die Klasse Pferd erbt von Tier.

public class Pferd extends Tier{

}

Und diese Kindklasse kann dann einfach die Variablen zur Größe, zum Alter oder zur Anzahl-der-Beine übernehmen.
Frechheit, oder? 🙂

Wenn du dann eine Programmstartklasse mit main-Methode anlegen würdest, könntest du dort die Kindobjekte erzeugen.
Und dieses neue Kindobjekt hätte Zugriff auf alle Instanzvariablen der Elternklasse.

public class ProgrammStart {
	public static void main(String[] args) {
		Pferd pferdEins = new Pferd ();//neues Pferd-Objekt
		pferdEins.alter=12;//Pferd hat ein Alter von 12
		pferdEins.groesse=122;//Pferd hat eine Größe von 122 cm
		pferdEins.anzahlBeine=4;//Pferd hat vier Beine
	}
}

Krass oder?
Hier das Bild dazu.

Java-Vererbung-verhindern-Superklassen

Das Schlimmste dabei ist, dass die Elternklassen dies gar nicht mitbekommen.
Sie wissen nicht einmal, dass sie Kinder haben.

Die Kindklassen kennen ihre Eltern schon.
Denn schließlich erweitern sie die Elternklassen ganz bewusst, durch den Zusatz extends.
Unfair, oder?

Damit muss Schluss sein.
Wir leben schließlich im 21. Jahrhundert, sind aufgeklärt worden und kennen die Möglichkeit zur Verhütung. 🙂

Also sind hier drei Möglichkeiten, wie du die Vererbungsmöglichkeiten für Klassen eindeutig verhindern kannst.

Nicht öffentliche Klassen verhindern die Vererbung für ganz bestimmte Klassen.

Öffentliche Klassen sind mit dem Keywort public ausgezeichnet.
Unsere beiden Klassen „Tier“ und „Pferd“ sind ebenfalls public-Klassen.

Ich lege jetzt einmal eine weitere Klasse, namens „Hund“ für speziellere Pferde an.
Blöd oder?
Aber theoretisch möglich.
Das Pferd hätte nicht einmal ein Mitbestimmungsrecht.

Java Vererbung verhindern Hund und Pferd Beispiel

Ich lege jetzt drei Packages an.
Eines für Hunde, eines für Pferde und eines für allgemeine Tiere.
Java Vererbung verhindern package

Und verschiebe dann per Drag and drop die Klassen in die Packages.
Java Vererbung verhindern durch package

Durch das verschieben passiert so Einiges.

  • In allen Klassen befinden sich danach die package-Importe ganz oben.
  • Da die Tierklasse sich jetzt in einem neuen package befinden – kann die Programmstartklasse nicht mehr auf die Instanzvariablen der Tierklasse zugreifen.
  • Du musst also die Instanzvariablen auch als public anbieten.

Java Vererbung verhindern package Anweisungen

Und was passiert noch?
Hund erbt immer noch von einem Pferd.
Java Vererbung verhindern Hund erbt Pferd

Alles bis hierher war nur die Vorbereitung – das Warm Up.
Jetzt kommt das Entscheidende.

Mach einmal die Klasse „Pferd“ nicht explizit öffentlich.
Streiche also das Keywort public.


Java-vererbung-implizit-verhindern

Und jetzt ist es für den Hund unmöglich ein Pferd zu sein. 🙂

Das bedeutet jetzt für Dich:
Eine Klasse kann nur von einer anderen package-fremden Klasse erben, wenn diese public ist.
Von einer nicht-public oder nicht-öffentlichen Klasse können nur innerhalb des gleichen Package – Kindklassen gebildet werden.

Aber….
Dies ist sehr ungewöhnlich und auch nicht der beste Weg, um in Java Vererbung zu verhindern.

Die zweite Möglichkeit die Vererbung in Java zu verbieten – läuft über den Konstruktor.

Und zwar kannst du in der Superklasse einen privaten default-Konstruktor anbieten.
Somit wird das einfache Erstellen eines neuen Objektes nicht möglich.

Und die Kindklasse, welche sich auf den Konstruktor der Superklasse beruht – kann diesen ebenfalls nicht nutzen.

Java Vererbung verhindern Konstruktor

Aber auch diese Lösung ist suboptimal.

Die beste Lösung um in Java Vererbung zu verhindern, bietet das Keywort final.

Stichwort sind finale Klassen.
Diese können nicht überschrieben werden.

package pferdepackage;
import tierpackage.Tier;

public final class Pferd extends Tier{

}

Sobald du eine Klasse als final kennzeichnest, ist eine Erweiterung durch Unterklassen ausgeschlossen.

Und dies ist die herkömmliche Lösung.
Diese finale-Klassen-Lösung solltest du eigentlich immer nutzen.

Und deshalb….
Nur wenn du dir wirklich irgendetwas besonderes dabei denkst, nutze die beiden anderen Lösungen.

Zusammenfassung:

  • Es macht immer Sinn den Ausstieg zu planen.
    An irgendeiner Stelle ist immer Schluss mit Vererbung.
  • Einen noch spezielleren Typen einer Klasse gibt es dann nicht mehr bzw. es macht keinen Sinn dies anzubieten.
    Und deshalb solltest du in Java Vererbung auch verhindern bzw. verbieten.
    Nicht gänzlich.
    Du solltest nur einige bestimmte Klassen von der Java Vererbung ausschließen.
  • Dabei stehen dir drei Möglichkeiten zur Verfügung. Neben privaten Konstruktoren, nicht-öffentlichen Klassen in fremden Packages – bietet es sich an, Klassen mit dem Modifier final auszuzeichen.

Ähnliche Beiträge

So verwendest du die Java Codeblöcke zur Automatisierung

Java Codeblöcke

In diesem Beitrag geht es um den Einsatz von Java Codeblöcken oder Initialisierungsblöcken. Viele Wege führen nach Rom. Oder Alle Wege führen nach Rom. Heißt es in einem alten Sprichwort. Und so ähnlich ist es bei der Java Programmierung. In diesem Beitrag möchte ich dir einen weiteren Weg vorstellen, wie du Variablen eines Java Objektes […]

Hier sind ein paar richtig nette Features, die dich beim Java lernen unterstützen

Java lernen Eclipse

Was ist das Wichtigste beim Einstieg in ein neues Wissensgebiet? Nein, kein gutes Sachbuch oder ein besonders guter Lehrer. Es ist Spaß. Beim Java Lernen brauchst du Spaß. Es gibt Lehrer, welche ihren Stoff so vermitteln, dass Lernen Spaß bereitet. Aber die Grundvoraussetzung ist und bleibt der Spaß. Und nichts ist so spaßhemmend wie Langeweile […]

Java Übung: Alles beginnt mit Hello World

Java Übung Hello World

Alles beginnt mit „Hello World“. Sämtliche Java Bücher beginnen mit diesem ersten Beispiel. Auch die Java Übungen sollen mit diesem ersten Programm starten. Definiere eine Klasse „Hello World“. Implementiere die Main Methode. Die Main Methode soll bei Programmaufruf die Bildschirmanzeige „Hallo Welt“ zurückgeben. Die Lösung zur Java Übung „Hallo Welt“ public class HelloWorld{ public static […]

Lexikalik, Syntax und Semantik in Programmiersprachen

Programmiersprachen Semantik Programmiersprachen Syntax Programmiersprachen Lexikalik Java

Java ist eine Programmiersprache. Und wie jede andere Programmiersprache ist auch Java, lediglich eine künstliche Sprache.   Normalerweise bieten künstliche Projekte immer jede Menge Spielraum für Eigenkreationen. Bei der Programmierung ist dies nicht ganz so. Denn Programmiersprachen sind auch immer sehr exakt.   Jede Programmiersprache und auch jede gesprochene Sprache folgt immer einer Abstraktionsreihenfolge, welche […]

So kannst du Java Konstanten bei der Programmierung nutzen

Java Konstanten – was kann man sich darunter vorstellen? Du kennst Konstanten in der Mathematik. Die Kreiszahl Pi ist so eine konstante Zahl. Diese Zahl ändert sich niemals. Sie beträgt immer rund 3,141592. In der Physik gelten die Lichtgeschwindigkeit, der Erdradius oder der absolute Nullpunkt als konstant. Selbst die Geschwindigkeit mit der sich die Erde […]

10 ganz nützlichen Feature der Klasse Java Math

In diesem Beitrag geht es um eine spezielle Java Klasse. Die Klasse nennt sich Java Math. Diese ist in der Standardbibliothek von Java enthalten. Warum solltest du diese Klasse kennen? Die Math Klasse bietet dir einen Menge Methoden an, welche zur Berechnung von mathematischen Gleichungen ganz hilfreich sind. Aber auch für Nichtmathematiker ist etwas dabei. […]

Java Vererbung findet auch zwischen Einkaufstüten und Polizeiautos statt

Java Vererbung

„Manchmal findet Java Vererbung auch zwischen Einkaufstüten und Polizeiautos statt“ Irrer Titel, oder? Aber mal Hand aufs Herz. Was haben eigentlich eine Einkaufstüte und ein Polizeiwagen gemeinsam? Ich verrate dir etwas: Du kannst die Verbindung nicht erkennen, denn ich habe dir nicht alles verraten. Es fehlt noch ein wichtiger Aspekt – eine Verbindung zwischen beiden. […]

Heap & Stack – Die Speicherverwaltung in Java

Java Speicher

Java nutzt eine interne Speicherverwaltung. Eigentlich sind es mehrere. Uns interessieren lediglich zwei. Da das Thema Speicherverwaltung recht umfangreich ist, habe ich dir im Folgenden einmal die wichtigsten Artikel zusammengestellt. Die zwei Speichersysteme von Java Java Methoden werden auf dem Stack gestapelt. Der Speicher auf dem Java Methoden zu Hause sind, nennt sich Stack Speicher. […]

Java Strings landen im String Constant Pool

Java-Strings-Pool

Du kennst das. Es ist abends. Du sitzt gemütlich vor dem Fernseher. Das Smartphone bimmelt. Kein Anruf. Nein – Eine Nachricht. Du liest die Nachricht sofort und antwortest darauf. Minuten später bekommst du die nächste Nachricht. Und auch auf diese antwortest du. Im Laufe des Abends entsteht daraus eine nette kleine Konversation. Und eh du […]

Ende vom Java Blog?

Falls du hier schon länger dabei bist, wird dir aufgefallen sein – dass kaum noch Beiträge veröffentlicht werden. Das tut mir wirklich leid und dafür möchte ich mich auch entschuldigen. Ich weiß, dass Einige unter Euch den Java-Blog wirklich lieben. Aber es ist verdammt schwierig so ein aufwendiges Thema – stilvoll, unterhaltend und methodisch umzusetzen. […]