Použitie finále kľúčových slov s dedičnosťou v Jave

Zatiaľ čo jeden z Java je silnými stránkami je pojem dedičstva, v ktorom jeden trieda môže pochádzať z inej, niekedy je žiaduce zabrániť dedičstvu inej triedy. Ak chcete zabrániť dedičstvu, pri vytváraní triedy použite kľúčové slovo „final“.

Napríklad, ak triedu pravdepodobne používajú iní programátori, možno budete chcieť zabrániť dedeniu, ak by akékoľvek vytvorené podtriedy mohli spôsobiť problémy. Typickým príkladom je Stringová trieda. Ak by sme chceli vytvoriť podtriedu String:

public class MyString rozširuje String {
}

Budeme čeliť tejto chybe:

 nemôže zdediť z konečného java.lang. povrázok 

Dizajnéri triedy String si uvedomili, že to nie je kandidát na dedičstvo a bránili jej rozširovaniu.

Prečo zabrániť dedičstvu?

Hlavným dôvodom, prečo tomu zabrániť dedičstvo je, aby sa ubezpečilo, že správanie sa triedy nie je poškodené podtriedou.

Predpokladajme, že máme účet triedy a podtriedu, ktorá ho rozširuje, OverdraftAccount. Účet triedy má metódu getBalance ():

 verejné dvojité getBalance ()

{

 vrátiť túto rovnováhu;

 } 

instagram viewer

V tejto chvíli v našej diskusii podtrieda OverdraftAccount neprepísala túto metódu.

(Poznámka: Pre ďalšiu diskusiu s použitím tried Účty a Účty kontokorentného účtu si pozrite, ako a podtrieda sa môže považovať za nadtriedu).

Vytvorme inštanciu každej z tried Account a OverdraftAccount:

 BobsAccount = nový účet (10);

 bobsAccount.depositMoney (50);

 Kontokorentný účet jimsAccount = nový Kontokorentný účet (15.05.500,0.05);

 jimsAccount.depositMoney (50);

 // vytvoriť pole objektov účtu

 // môžeme zahrnúť jimsAccount, pretože my 

 // chcú to považovať iba za objekt účtu

 Účet [] accounts = {bobsAccount, jimsAccount};


 // pre každý účet v poli zobrazte zostatok

 pre (Účet a: účty)

 {

 System.out.printf („Zostatok je% .2f% n“, a.getBalance ());

 }

 Výstup je:

 Zostatok je 60,00

 Zostatok je 65,05 

Zdá sa, že všetko funguje podľa očakávania. Čo ak však OverdraftAccount nahradí metódu getBalance ()? Nič nebráni tomu, aby niečo také urobil:

 Verejný debet prečerpania účtu rozširuje účet {


 súkromné ​​dvojnásobné prečerpanieLimit;

 súkromné ​​dvojnásobné debetné poplatky;


 // zvyšok definície triedy nie je zahrnutý


 verejné dvojité getBalance ()

 {

 návrat 25,00;

 }

 } 

Ak sa vyššie uvedený vzorový kód spustí znova, výstup bude iný, pretože pre jimsAccount sa volá správaniegetgetBalance () v triede OverdraftAccount:

 Výstup je:

 Zostatok je 60,00

 Zostatok je 25,00 

Bohužiaľ, podtrieda OverdraftAccount bude nikdy poskytnúť správny zostatok, pretože sme porušili správanie triedy Account z dôvodu dedičstva.

Ak navrhujete triedu, ktorú majú používať iní programátori, vždy zvážte dôsledky prípadných podtried. Z tohto dôvodu nie je možné triedu String rozšíriť. Je mimoriadne dôležité, aby programátori vedeli, že keď vytvoria objekt String, bude sa vždy správať ako reťazec.

Ako zabrániť dedičstvu

Aby sa zabránilo rozšíreniu triedy, musí vyhlásenie triedy výslovne tvrdiť, že nemôže byť zdedené. Dosahuje sa to pomocou kľúčového slova „final“:

 verejný účet konečnej triedy {


 } 

To znamená, že trieda Account nemôže byť nadtriedou a trieda OverdraftAccount už nemôže byť jej podtriedou.

Niekedy možno budete chcieť obmedziť iba určité správanie nadtriedy, aby ste predišli korupcii podtriedy. Napríklad OverdraftAccount stále môže byť podtriedou Account, malo by sa však zabrániť tomu, aby nahradil metódu getBalance ().

V takom prípade použite „konečné“ kľúčové slovo v deklarácii metódy:

 účet verejnej triedy {


 súkromná dvojitá rovnováha;


 // zvyšok definície triedy nie je zahrnutý


 verejné konečné dvojité getBalance ()

 {

 vrátiť túto rovnováhu;

 } 

 } 

Všimnite si, ako sa v definícii triedy nepoužije konečné kľúčové slovo. Je možné vytvoriť podtriedy účtu, ale už nemôžu prepísať metódu getBalance (). Každý kód, ktorý volá túto metódu, môže mať istotu, že bude fungovať podľa pôvodného plánovaného programátora.