Míg az egyik Java az erősségek az öröklés fogalma, amelyben az egyik osztály származhat egy másikból, néha kívánatos, hogy megakadályozzuk egy másik osztály öröklését. Az öröklés elkerülése érdekében az osztály létrehozásakor használja a "végleges" kulcsszót.
Például, ha egy osztályt valószínűleg más programozók használnak, akkor érdemes lehet megakadályozni az öröklődést, ha a létrehozott alosztályok problémákat okozhatnak. Jellemző példa a Vonósági osztály. Ha String alosztályt akarunk létrehozni:
a MyString nyilvános osztály kibővíti a karakterláncot {
}
A következő hibával szembesülnénk:
nem örökölheti a java.lang végső sorozatától. Húr
A húrok osztályának tervezői rájöttek, hogy nem öröklési jelölt, és megakadályozták annak meghosszabbítását.
Miért akadályozható meg az öröklés?
A megelőzés fő oka öröklés annak biztosítása, hogy az osztály viselkedését nem sérti meg egy alosztály.
Tegyük fel, hogy van egy osztályfiók és egy alosztály, amely kiterjeszti azt, az OverdraftAccount. Az osztályfióknak van egy getBalance () metódusa:
nyilvános dupla getBalance ()
{
vissza ezt az egyensúlyt;
}
Megbeszélésünk ezen a pontján az OverdraftAccount alosztály nem felülbírálta ezt a módszert.
(jegyzet: Egy további megbeszéléshez, amely ezt a Fiókot és a OverdraftAccount osztályokat használja, lásd: a az alosztály szuperosztályként kezelhető).
Hozzunk létre egy példányt a Fiók és a OverdraftAccount osztályok közül:
BobsAccount = új fiók (10);
bobsAccount.depositMoney (50);
OverdraftAccount jimsAccount = új OverdraftAccount (15.05.500.0.05);
jimsAccount.depositMoney (50);
// hozzon létre egy tömb fiókobjektumokat
// felvehetjük a jimsAccount-ot, mert mi
// csak fiókobjektumként kívánja kezelni
Fiók [] számlák = {bobsAccount, jimsAccount};
// a tömb minden egyes számlájához jelenítse meg az egyenleget
for (a fiók: számlák)
{
System.out.printf ("Az egyenleg% .2f% n", a.getBalance ());
}
A kimenet:
Az egyenleg 60.00
Az egyenleg 65.05
Úgy tűnik, hogy itt minden a vártnak megfelelően működik. De mi van, ha a OverdraftAccount felülírja a getBalance () módszert? Semmi sem akadályozza meg, hogy így cselekedjen:
public class OverdraftAccount kiterjeszti a {
magán kettős folyószámlahitelLimit;
magán kettős folyószámlahitelFee;
// az osztálydefiníció többi része nincs benne
nyilvános dupla getBalance ()
{
visszatérés 25.00;
}
}
Ha a fenti példakódot újra végrehajtják, a kimenet eltérő lesz, mivel a overgetftAccount osztályban a thegetBalance () viselkedését jimsAccount hívja meg:
A kimenet:
Az egyenleg 60.00
Az egyenleg 25.00
Sajnos a OverdraftAccount alosztály lesz soha biztosítsa a megfelelő egyenleget, mert az öröklés révén megsértettük a Fiókosztály viselkedését.
Ha olyan osztályt tervez, amelyet más programozók használnak, mindig vegye figyelembe a potenciális alosztályok következményeit. Ez az oka annak, hogy a vonósági osztály nem bővíthető. Rendkívül fontos, hogy a programozók tudják, hogy amikor egy String objektumot hoznak létre, akkor mindig úgy viselkedik, mint egy String.
Az öröklés megelőzése
Az osztály meghosszabbításának megakadályozása érdekében az osztálynyilatkozatban kifejezetten meg kell mondani, hogy nem örökölhető. Ezt a "végső" kulcsszó használatával érik el:
nyilvános végső osztályfiók {
}
Ez azt jelenti, hogy a Fiókosztály nem lehet szuperosztály, és a OverdraftAccount osztály már nem lehet alosztálya.
Időnként korlátozhatja a szuperosztály bizonyos viselkedéseit, hogy elkerülje az alosztály korrupcióját. Például a OverdraftAccount továbbra is lehet a Fiók alosztálya, de meg kell akadályozni, hogy az felülírja a getBalance () módszert.
Ebben az esetben használja a "végső" kulcsszót a módszernyilatkozatban:
nyilvános osztályú fiók {
magán kettős egyenleg;
// az osztálydefiníció többi része nincs benne
nyilvános végső kettős getBalance ()
{
vissza ezt az egyensúlyt;
}
}
Figyelem: a végső kulcsszó nem kerül felhasználásra az osztály meghatározásában. Létrehozhatók a Fiók alosztályai, de ezek már nem bírálhatják felül a getBalance () metódust. Bármely kód, amely ezt a módszert hívja, biztos lehet abban, hogy az eredeti programozó szándéka szerint fog működni.