Computerwissenschaften

Verwenden des Schlüsselworts Final with Inheritance in Java

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 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 die 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.String erben

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, um eine 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 ()

 

{

 

 return this.balance;

 

 }}

Zu diesem Zeitpunkt in unserer Diskussion hat die Unterklasse OverdraftAccount diese Methode nicht überschrieben.

( Hinweis : Weitere Informationen zur Verwendung dieser Klassen Account und OverdraftAccount finden Sie unter Wie eine Unterklasse als Oberklasse behandelt werden kann .)

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 Überziehungsgrenze;

 

 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 liefert die Unterklasse OverdraftAccount niemals den richtigen Saldo, da wir das Verhalten der Account-Klasse durch Vererbung beschädigt haben.

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:


 Konto der öffentlichen Klasse {

 


 

 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.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.