Î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.
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: