Hur man förhindrar arv i Java med hjälp av sökordsfinal

Även om en av Java: s styrkor är arvet, där en klass kan härledas från en annan, är det ibland önskvärt att förhindra arv från en annan klass. För att förhindra arv använder du nyckelordet "final" när du skapar klassen.

Om till exempel en klass troligen kommer att användas av andra programmerare kanske du vill förhindra arv om några underklasser skapade kan orsaka problem. Ett typiskt exempel är String-klassen. Om vi ​​ville skapa en String-underklass:

public class MyString utökar String 

Vi skulle möta detta fel:

 kan inte ärva från final java.lang.String 

Formgivarna av String-klassen insåg att det inte var en kandidat till arv och har förhindrat att den utvidgades.

Varför förhindra ärft?

Det främsta skälet för att förhindra arv är att se till att en klass inte uppför sig skadas av en underklass.

Anta att vi har ett klasskonto och en underklass som utvidgar det, OverdraftAccount. Klasskonto har en metod getBalance ():

 public double getBalance ()


 returnera detta.balans;

  

Vid denna punkt i vår diskussion har underklass OverdraftAccount inte åsidosatt denna metod.

(Notera: För en annan diskussion med klasserna Konto och OverdraftAccount, se hur en underklass kan behandlas som en superklass).

Låt oss skapa en instans var och en av klasserna Konto och OverdraftAccount:

 KontobobsAccount = nytt konto (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = nytt OverdraftAccount (15.05 500,0,05);

 jimsAccount.depositMoney (50);

 // skapa en rad kontoobjekt

 // vi kan inkludera jimsAccount eftersom vi 

 // vill bara behandla det som ett kontoobjekt

 Konto [] konton = bobsAccount, jimsAccount;

 

 // för varje konto i arrayen, visa saldot

 för (Konto a: konton)

 

 System.out.printf ("Balansen är% .2f% n", a.getBalance ());

 

 Utgången är:

 Balansen är 60,00

 Saldot är 65,05 

Allt verkar fungera som förväntat, här. Men vad händer om OverdraftAccount åsidosätter metoden getBalance ()? Det finns inget som hindrar det från att göra något liknande:

 offentligt klass OverdraftAccount utökar konto 

 

 privat dubbel överdrivningskredit;

 privat dubbel överdrivna avgift;

 

 // resten av klassdefinitionen ingår inte

 

 public double getBalance ()

 

 retur 25,00;

 

  

Om exemplet ovan exekveras igen kommer utgången att vara annorlunda eftersomgetBalance () beteende i klassen OverdraftAccount kallas för jimsAccount: