Hoe overerving in Java te voorkomen met behulp van de trefwoordfinale

Hoewel een van de sterke punten van Java het concept van overerving is, waarbij de ene klasse van een andere klasse kan worden afgeleid, is het soms wenselijk om overerving door een andere klasse te voorkomen. Gebruik het trefwoord "final" bij het maken van de klasse om overerving te voorkomen.

Als een klasse waarschijnlijk door andere programmeurs wordt gebruikt, wilt u misschien overerving voorkomen als gemaakte subklassen problemen kunnen veroorzaken. Een typisch voorbeeld is de klasse String. Als we een String-subklasse wilden maken:

openbare klasse MyString verlengt String 

We zouden met deze fout worden geconfronteerd:

 kan niet erven van final java.lang.String 

De ontwerpers van de String-klasse realiseerden zich dat het geen kandidaat was voor erfenis en hebben voorkomen dat het werd uitgebreid.

Waarom overerving voorkomen?

De belangrijkste reden om overerving te voorkomen, is ervoor te zorgen dat het gedrag van een klasse niet door een subklasse wordt beschadigd.

Stel dat we een klasse-account hebben en een subklasse die deze uitbreidt, OverdraftAccount. Class Account heeft een methode getBalance ():

 openbaar dubbel getBalance ()


 geef dit evenwicht terug;

  

Op dit punt in onze discussie heeft subklasse OverdraftAccount deze methode niet overschreven.

(Notitie: Zie voor een andere discussie met deze klassen Account en OverdraftAccount hoe een subklasse kan worden behandeld als een superklasse).

Laten we een exemplaar maken van elk van de klassen Account en OverdraftAccount:

 Account bobsAccount = nieuw account (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = nieuw OverdraftAccount (15.05.500,0.05);

 jimsAccount.depositMoney (50);

 // maak een reeks accountobjecten

 // we kunnen jimsAccount opnemen omdat we 

 // willen het alleen als een Account-object behandelen

 Account [] accounts = bobsAccount, jimsAccount;

 

 // Geef voor elke account in de array het saldo weer

 voor (Account a: accounts)

 

 System.out.printf ("Het saldo is% .2f% n", a.getBalance ());

 

 De output is:

 Het saldo is 60,00

 Het saldo is 65.05 

Alles lijkt te werken zoals verwacht, hier. Maar wat als OverdraftAccount de methode getBalance () overschrijft? Er is niets om te voorkomen dat het zoiets doet:

 public class OverdraftAccount verlengt Account 

 

 privé dubbel roodstandlimiet;

 privé dubbele rekening-courant

 

 // de rest van de klassedefinitie is niet inbegrepen

 

 openbaar dubbel getBalance ()

 

 retour 25,00;

 

  

Als de bovenstaande voorbeeldcode opnieuw wordt uitgevoerd, is de uitvoer anders omdat degetBalance () gedrag in de klasse OverdraftAccount wordt opgeroepen voor jimsAccount: