Cum să preveniți moștenirea în Java folosind cuvintele cheie finale

În timp ce unul dintre punctele forte ale Java este conceptul de moștenire, în care o clasă poate deriva de la alta, uneori este de dorit să împiedici moștenirea de către o altă clasă. Pentru a preveni moștenirea, utilizați cuvântul cheie „final” atunci când creați clasa.

De exemplu, dacă o clasă este probabil să fie utilizată de alți programatori, este posibil să doriți să preveniți moștenirea dacă orice subclase create ar putea cauza probleme. Un exemplu tipic este clasa String. Dacă am fi dorit să creăm o subclasă String:

public class MyString extinde String 

Ne-am confrunta cu această eroare:

 nu se poate moșteni de la finalul java.lang.String 

Designerii clasei String și-au dat seama că nu este un candidat pentru moștenire și au împiedicat extinderea acesteia.

De ce să prevină moștenirea?

Motivul principal pentru a preveni moștenirea este să te asiguri că modul în care se comportă o clasă nu este corupt de o subclasă.

Să presupunem că avem un Cont de clasă și o subclasă care îl extinde, OverdraftAccount. Contul clasei are o metodă getBalance ():

 public dublu getBalance ()


 returnează acest.balanț;

  

În acest moment al discuției noastre, subclasa OverdraftAccount nu a înlocuit această metodă.

(Notă: Pentru o altă discuție folosind acest cont și clasele OverdraftAccount, vedeți cum o subclasă poate fi tratată ca o superclasă).

Haideți să creăm o instanță pentru fiecare clasă Cont și OverdraftAccount:

 Cont bobsAccount = Cont nou (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = new OverdraftAccount (15,05,500,0,05);

 jimsAccount.depositMoney (50);

 // creați o serie de obiecte Cont

 // putem include jimsAccount pentru că noi 

 // doresc doar să-l trateze ca pe un obiect de cont

 Cont [] conturi = bobsAccount, jimsAccount;

 

 // pentru fiecare cont din tablou, afișați soldul

 pentru (Contul: conturi)

 

 System.out.printf ("Soldul este% .2f% n", a.getBalance ());

 

 Produsul este:

 Soldul este de 60,00

 Soldul este de 65,05 

Totul pare să funcționeze așa cum era de așteptat, aici. Dar dacă OverdraftAccount înlocuiește metoda getBalance ()? Nu există nimic care să-l împiedice să facă așa ceva:

 public class OverdraftAccount extinde contul 

 

 overdraft dublu privatLimit;

 overdraft dublu privatFee;

 

 // restul definiției clasei nu este inclus

 

 public dublu getBalance ()

 

 retur 25,00;

 

  

Dacă exemplul de mai sus este executat din nou, ieșirea va fi diferită deoareceComportamentul getBalance () din clasa OverdraftAccount este apelat la jimsAccount: