Uporaba ključne besede Final z dedovanjem v Javi

click fraud protection

Medtem ko je eden od Jave prednosti je koncept dedovanja, v katerem razred lahko izhajajo iz drugega, včasih je zaželeno, da se dedovanje prepreči po drugem razredu. Če želite preprečiti dedovanje, pri ustvarjanju razreda uporabite ključno besedo "končno".

Na primer, če bodo razred morda uporabljali drugi programerji, boste morda želeli preprečiti dedovanje, če bi kateri koli ustvarjen podrazred lahko povzročil težave. Tipičen primer je Razred strun. Če bi želeli ustvariti podrazred String:

MyString v javnem razredu razširja niz {
}

Soočili bi se s to napako:

 ne more podedovati od končnega java.lang. Vrvica 

Oblikovalci razreda String so spoznali, da ni kandidat za dediščino in so preprečili njegovo razširitev.

Zakaj preprečiti dedovanje?

Glavni razlog za preprečevanje dedovanje je, da se prepriča, da način podrazreda ni poškodovan.

Recimo, da imamo račun razreda in podrazred, ki ga razširja, OverdraftAccount. Račun razreda ima metodo getBalance ():

 javni dvojni getBalance ()

{

 vrni to ravnotežje;

 } 

instagram viewer

Na tej točki naše razprave podklasa OverdraftAccount te metode ni razveljavila.

(Opomba: Za drugo razpravo o uporabi teh razredov računa in prekoračitve računa poglejte, kako podrazred lahko obravnavamo kot nadrazred).

Ustvarimo primerek vsakega od razredov Account in OverdraftAccount:

 Account bobsAccount = nov račun (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = nov račun OverdraftAccount (15.05.500,0.05);

 jimsAccount.depositMoney (50);

 // ustvari matriko predmetov Account

 // lahko vključimo jimsAccount, ker smo 

 // želijo ga obravnavati samo kot objekt računa

 Account [] računi = {bobsAccount, jimsAccount};


 // za vsak račun v nizu prikaže stanje

 za (račun a: računi)

 {

 System.out.printf ("Stanje je% .2f% n", a.getBalance ());

 }

 Izhod je:

 Bilanca je 60,00

 Bilanca je 65,05 

Tu se zdi, da vse deluje, kot je bilo pričakovano. Kaj pa, če OverdraftAccount preglasi metodo getBalance ()? Nič ne preprečuje, da bi naredil kaj takega:

 javni razred OverdraftAccount podaljša račun {


 zasebni dvojni prekoračitev plačilLimit;

 zasebni dvojni overdraftFee;


 // preostala definicija razreda ni vključena


 javni dvojni getBalance ()

 {

 vrnitev 25.00;

 }

 } 

Če se zgornja zgledna koda ponovno izvede, bo izhodni rezultat drugačen, ker vedenje thegetBalance () v razredu OverdraftAccount kliče za jimsAccount:

 Izhod je:

 Bilanca je 60,00

 Saldo je 25.00 

Na žalost bo podrazred OverdraftAccount nikoli zagotoviti pravilno stanje, ker smo z dedovanjem pokvarili vedenje razreda Račun.

Če načrtujete razred, ki ga bodo uporabljali drugi programerji, vedno upoštevajte posledice morebitnih podrazredov. Zato niza razreda ni mogoče razširiti. Izjemno pomembno je, da programerji vedo, da se ob ustvarjanju predmeta String vedno obnaša kot String.

Kako preprečiti dedovanje

Če želite preprečiti razširitev razreda, mora izjava v razredu izrecno povedati, da ga ni mogoče podedovati. To dosežemo z uporabo ključne besede "končno":

 javni račun končnega razreda {


 } 

To pomeni, da razred Račun ne more biti nadstandard in razred OverdraftAccount ne more biti več njegov podrazred.

Včasih boste morda želeli omejiti le določeno vedenje nadrazreda, da se izognete korupciji s podrazredom. Na primer, OverdraftAccount bi še vedno lahko bil podrazred računa, vendar bi ga bilo treba preprečiti, če bi preglasili metodo getBalance ().

V tem primeru uporabite "končno" ključno besedo v deklaraciji metode:

 Račun v javnem razredu {


 dvojno zasebno ravnotežje;


 // preostala definicija razreda ni vključena


 javni končni dvojni getBalance ()

 {

 vrni to ravnotežje;

 } 

 } 

Opazite, kako končna ključna beseda ni uporabljena v definiciji razreda. Ustvari se lahko podrazredi računa, vendar ne morejo več preglasiti metode getBalance (). Vsaka koda, ki kliče to metodo, je prepričana, da bo delovala tako, kot je načrtoval izvirni programer.

instagram story viewer