Während eine der Stärken von Java das Konzept der Vererbung ist, bei dem eine Klasse von einer anderen abgeleitet werden kann, ist es manchmal 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 eine Klasse beispielsweise wahrscheinlich von anderen Programmierern verwendet wird, möchten Sie möglicherweise die Vererbung verhindern, wenn eventuell erstellte Unterklassen Probleme verursachen könnten. Ein typisches Beispiel ist die String-Klasse. Wenn wir eine String-Unterklasse erstellen wollten:
öffentliche Klasse MyString erweitert String
Wir würden mit diesem Fehler konfrontiert sein:
kann nicht von final java.lang.String erben
Die Designer der String-Klasse haben erkannt, dass es sich nicht um einen Vererbungskandidaten handelt, und haben eine Erweiterung verhindert.
Der Hauptgrund, um die Vererbung zu verhindern, besteht darin, sicherzustellen, 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 ()
gib das zurück. balance;
Zu diesem Zeitpunkt in unserer Diskussion hat die Unterklasse OverdraftAccount diese Methode nicht überschrieben.
(Hinweis: Eine weitere Erläuterung zur Verwendung der Klassen "Account" und "OverdraftAccount" finden Sie unter "Eine Unterklasse als Superklasse behandeln"..
Erstellen wir eine Instanz für jede der Klassen Account und OverdraftAccount:
Konto bobsAccount = neues Konto (10);
bobsAccount.depositMoney (50);
Überziehungskonto jimsAccount = neues Überziehungskonto (15.05.500,0.05);
jimsAccount.depositMoney (50);
// ein Array von Account-Objekten erstellen
// wir können jimsAccount einbinden, 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 ist% .2f% n", a.getBalance ());
Die Ausgabe ist:
Der Restbetrag beträgt 60,00
Der Restbetrag ist 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 Konto
private double overdraftLimit;
private doppelte Überziehungsgebühr;
// Der Rest der Klassendefinition ist nicht enthalten
public double getBalance ()
Rückkehr 25.00;
Wenn der obige Beispielcode erneut ausgeführt wird, unterscheidet sich die Ausgabe, da derDas Verhalten von getBalance () in der OverdraftAccount-Klasse wird für jimsAccount aufgerufen: