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

Java Übung 31: Speichere deine Würfe im Array

Java Übung Array Würfelspiel

In dieser Java Übung soll ein Würfelspiel simuliert werden. Lege eine Klasse namens, Würfelspiel an. Diese Klasse enthält eine statische Methode, namens würfeln(). Diese Methode erwartet einen Parameter vom Datentyp Integer, namens „anzahlWuerfe“. Diese Variable/Parameter repräsentiert die Anzahl der Würfe. Nachdem der Methode die Anzahl der Würfe übergeben wurde, soll die Methode Zufallszahlen zwischen 1 […]

Der bedeutende Unterschied zwischen Klassenvariablen und Instanzvariablen

Java Klassenvariablen

Bei der Java Programmierung unterscheidet man drei Arten von Variablen. Als erste Gruppe sind die lokalen Variablen zu nennen. Auf diese gehe ich in einem separaten Artikel ein. Mich interessieren die zwei anderen Variablentypen. Zum einen existieren Klassenvariablen. Und dann sind da noch die Instanzvariablen. Wo liegt der Unterschied? Instanzvariablen stehen einem Objekt zur Verfügung. […]

Polymorphie bringt Vorteile für Java Arrays

Java Polymorphie Arrays

Wenn Java Arrays, Schubladen oder Container sein sollen… Dann wäre der Gebrauch einer solchen Schublade ziemlich einseitig und festgefahren. Denn in jedes Array passen zwar mehrere Daten – aber immer nur vom gleichen Datentyp. Immer gleicher Datentyp? Also eine Schublade nur für Socken, Unterwäsche und der ganze andere Kram passt dann eben nicht hinein. Um […]

So lassen sich aus Java Klassen Instanzen erstellen

Java Klassen Instanzen erstellen

Lass uns jetzt aus den Java Klassen heraus Objekte anlegen. Im Einführungsbeispiel hast du bereits gelernt, wie du: Instanzvariablen bzw. Attribute anlegst Wie du aus einer normalen Java Klasse eine Programmstart Klasse machst In diesem Artikel erfährst du: Was Objekte bzw. Instanzen sind. Wie sich Objekte zusammensetzen. Wo und wie du Instanzen aus Java Klassen […]

Java Polymorphie – besserer Code und mehr Möglichkeiten

Java Polymorphie Vorteile

Polymorphie ist das Herzstück jeder objektorientierten Sprache. Nicht nur in Java – auch in Python, Javascript und in anderen Sprachen. Aber was bedeutet Polymorphie eigentlich? Polymorphie oder auch Polymorphismus genannt, kommt aus dem Griechischen. Es bedeutet Vielgestaltigkeit. Etwas freier übersetzt, kannst du es auch als Facettenreichtum bezeichnen. Im Grunde genommen zielt die ganze Java Vererbung […]

Java Übung 17: Char-Zeichen mit For-Schleife

Java Übung Char Zeichen For Schleife

In dieser Java Übung werden wir uns die Zeichen des Character Datentypen näher anschauen. Die einzelnen Zeichen sollen auf der Konsole ausgegeben werden. Und wie? Das ganze sollst du mit einer For Schleife machen. Erstelle deshalb eine Klasse „CharZeichen“. In dieser Klasse implementierst du dann eine Klassenmethode, namens „gibZeichen“. Und im Methodenrumpf durchläuft eine For-Schleife […]

So unterstützen dich Java Vererbungstabellen beim Entwurf

Java Vererbungstabellen

Bei der Java Vererbung gibt es zwei Klassenarten bzw. -stufen. Die Superklassen, welche einen allgemeinen Typen darstellen Und die spezielleren Unterklassen, welche die Superklasse um bestimmte Funktionen erweitern. Jetzt ist dieses ganze „Der-erbt-von-dem-Konzept“ mitunter sehr schwierig darzustellen. Zum Beispiel in einem Werkzeugkoffer. In einem Werkzeugkoffer befinden sich sämtliche Werkzeuge, von Säge bis Bohrmaschine. Wie machst […]

Das Java Leben ist einfacher mit For-Schleife

Java For Schleife Aufbau

In einem anderen Artikeln habe ich bereits über Schleifen in Java gesprochen. In diesem Artikel möchte ich dir eine ganz besondere Schleife vorstellen. Warum ist diese so toll? Sie hat einen integrierten Schleifenzähler. Die Schleife zählt also bei jedem Durchlauf automatisch mit. Aber dazu gleich mehr…. Lass uns einmal so eine For Schleife anlegen.

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 […]

Das Instanzieren von Java Klassen verhindern

Java Objekte Instanzieren verhindern

Die Instanzierung von Java Klassen verhindern. Was heißt das? Instanzen sind die Objekte einer Java Klasse. Und Instanzieren oder Instanzierung heißt nichts anderes, als Objekterstellung. Aber was soll das? Oder mal anders gefragt: Wieso sollte man verhindern, dass eine Java Klasse – Objekte erstellen kann? Schließlich sind doch Objekte der Sinn und Zweck jeder objektorientierten […]