Während einer von Java Stärken ist das Konzept der Vererbung, in dem man Klasse kann von einer anderen abgeleitet sein, manchmal ist es wünschenswert, die Vererbung durch eine andere Klasse zu verhindern. Verwenden Sie beim Erstellen der Klasse das Schlüsselwort "final", um eine Vererbung zu verhindern.
Wenn beispielsweise eine Klasse wahrscheinlich von anderen Programmierern verwendet wird, möchten Sie möglicherweise die Vererbung verhindern, wenn erstellte Unterklassen Probleme verursachen können. Ein typisches Beispiel ist das String-Klasse. Wenn wir eine String-Unterklasse erstellen wollten:
öffentliche Klasse MyString erweitert String {
}
Wir wären mit diesem Fehler konfrontiert:
kann nicht von final java.lang erben. String
Die Designer der String-Klasse haben erkannt, dass es sich nicht um einen Vererbungskandidaten handelt, und haben verhindert, dass sie erweitert wird.
Warum Vererbung verhindern?
Der Hauptgrund zu verhindern Erbe soll sicherstellen, dass das Verhalten einer Klasse nicht durch eine Unterklasse beschädigt wird.
Angenommen, wir haben ein Klassenkonto und eine Unterklasse, die es erweitert, OverdraftAccount. Klassenkonto hat eine Methode getBalance ():
public double getBalance ()
{
return this.balance;
}
Zu diesem Zeitpunkt in unserer Diskussion hat die Unterklasse OverdraftAccount diese Methode nicht überschrieben.
(Hinweis: Weitere Informationen zur Verwendung dieser Account- und OverdraftAccount-Klassen finden Sie unter a Unterklasse kann als Oberklasse behandelt werden).
Erstellen wir jeweils eine Instanz der Klassen Account und OverdraftAccount:
Konto bobsAccount = neues Konto (10);
bobsAccount.depositMoney (50);
OverdraftAccount jimsAccount = neues OverdraftAccount (15.05.500,0.05);
jimsAccount.depositMoney (50);
// ein Array von Account-Objekten erstellen
// wir können jimsAccount einschließen, weil wir
// möchte es nur als Account-Objekt behandeln
Account [] accounts = {bobsAccount, jimsAccount};
// Zeigen Sie für jedes Konto im Array den Kontostand an
für (Konto a: Konten)
{
System.out.printf ("Der Kontostand beträgt% .2f% n", a.getBalance ());
}
Die Ausgabe ist:
Der Restbetrag beträgt 60,00
Der Restbetrag beträgt 65,05
Hier scheint alles wie erwartet zu funktionieren. Was aber, wenn OverdraftAccount die Methode getBalance () überschreibt? Nichts hindert es daran, so etwas zu tun:
public class OverdraftAccount erweitert Account {
private doppelte ÜberziehungsgrenzeLimit;
private doppelte Überziehungsgebühr;
// Der Rest der Klassendefinition ist nicht enthalten
public double getBalance ()
{
Rückgabe 25.00;
}
}
Wenn der obige Beispielcode erneut ausgeführt wird, ist die Ausgabe anders, da das Verhalten von getBalance () in der OverdraftAccount-Klasse für jimsAccount aufgerufen wird:
Die Ausgabe ist:
Der Restbetrag beträgt 60,00
Der Restbetrag beträgt 25,00
Leider wird die Unterklasse OverdraftAccount noch nie Stellen Sie den richtigen Kontostand bereit, da das Verhalten der Account-Klasse durch Vererbung beschädigt wurde.
Wenn Sie eine Klasse entwerfen, die von anderen Programmierern verwendet werden soll, berücksichtigen Sie immer die Auswirkungen potenzieller Unterklassen. Aus diesem Grund kann die String-Klasse nicht erweitert werden. Es ist äußerst wichtig, dass Programmierer wissen, dass sich ein String-Objekt beim Erstellen immer wie ein String verhält.
So verhindern Sie Vererbung
Um zu verhindern, dass eine Klasse erweitert wird, muss in der Klassendeklaration ausdrücklich angegeben werden, dass sie nicht vererbt werden kann. Dies wird durch die Verwendung des Schlüsselworts "final" erreicht:
öffentliches Konto der letzten Klasse {
}
Dies bedeutet, dass die Account-Klasse keine Oberklasse sein kann und die OverdraftAccount-Klasse nicht länger ihre Unterklasse sein kann.
Manchmal möchten Sie möglicherweise nur bestimmte Verhaltensweisen einer Oberklasse einschränken, um eine Beschädigung durch eine Unterklasse zu vermeiden. Beispielsweise könnte OverdraftAccount immer noch eine Unterklasse von Account sein, es sollte jedoch verhindert werden, dass die Methode getBalance () überschrieben wird.
Verwenden Sie in diesem Fall das Schlüsselwort "final" in der Methodendeklaration:
öffentliches Konto {
privates Doppelguthaben;
// Der Rest der Klassendefinition ist nicht enthalten
öffentliches Finale double getBalance ()
{
return this.balance;
}
}
Beachten Sie, dass das endgültige Schlüsselwort in der Klassendefinition nicht verwendet wird. Unterklassen des Kontos können erstellt werden, sie können jedoch die Methode getBalance () nicht mehr überschreiben. Jeder Code, der diese Methode aufruft, kann sicher sein, dass er wie vom ursprünglichen Programmierer beabsichtigt funktioniert.