Selles õpetuses tutvume näidete abil Java-meetodi alistamise võimalustega.
Viimases õpetuses õppisime tundma pärimist. Pärimine on OOP omadus, mis võimaldab meil tuletada olemasolevast klassist (superklassist) uus klass (alaklass). Alamklass pärib superklassi atribuudid ja meetodid.
Kui nüüd sama meetod on määratletud nii superklassis kui ka alaklassis, siis alamklassi meetod alistab superklassimeetodi. Seda nimetatakse meetodi ülimuslikuks.
Näide 1: meetodi ülimuslikkus
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Väljund :
Olen koer.
Ülaltoodud programmis on displayInfo()
meetod olemas nii looma superklassis kui ka koera alaklassis.
Kui kutsume displayInfo()
objekti d1 (alamklasside objekt) abil, kutsutakse alamklassis Koer olevat meetodit. displayInfo()
Meetod alamklassi alistab samal meetod ülemklassi.
Pange tähele @Override
märkuse kasutamist meie näites. Javas on märkused metaandmed, mida kasutasime kompilaatorile teabe edastamiseks. Siin @Override
täpsustab annotatsioon kompilaatori, et selle annotatsiooni järgne meetod alistab superklassimeetodi.
Kasutamine pole kohustuslik @Override
. Kuid kui me seda kasutame, peaks meetod järgima kõiki ülimuslikke reegleid. Vastasel juhul genereerib kompilaator vea.
Java ülimuslikud reeglid
- Nii super- kui ka alaklassil peab olema sama meetodi nimi, sama tagastustüüp ja sama parameetrite loend.
- Me ei saa alistada meetodit, mis on deklareeritud kui
final
jastatic
. - Me peaksime alati alistama superklassi abstraktsed meetodid (seda arutatakse hilisemates õpetustes).
super märksõna Java ülimuslikus
Tavaline küsimus, mis tekib Java-s ülekandmise ajal, on järgmine:
Kas pääseme superklassi meetodile juurde pärast alistamist?
Noh, vastus on jah . Alamklassist superklassimeetodile juurde pääsemiseks kasutame super
märksõna.
Näide 2: super-märksõna kasutamine
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Väljund :
Olen loom. Olen koer.
Ülaltoodud näites alistab alamklass Koer displayInfo()
superklassist looma meetodi .
Kui me nimetame meetodit displayInfo()
koera alamklassi objekti d1 abil, nimetatakse meetodit koera alamklassis; meetodit superklassis sees ei kutsuta.
displayInfo()
Koera alaklassi sees oleme harjunud superklassile super.displayInfo()
helistama displayInfo()
.
Oluline on märkida, et Java-s pole konstruktoreid päritud. Seega pole Java-s konstruktori ülimuslikkust.
Superklassi konstruktorit võime aga kutsuda selle alaklassidest. Selleks kasutame super()
. Lisateabe saamiseks külastage Java super märksõna.
Juurdepääsu täpsustajad meetodi alistamisel
Samal superklassis ja selle alamklassides deklareeritud meetodil võivad olla erinevad juurdepääsuspetsifikaatorid. Siiski on piirang.
Saame kasutada ainult neid alamklassides olevaid juurdepääsu täpsustajaid, mis pakuvad suuremat juurdepääsu kui superklassi juurdepääsu täpsustaja. Näiteks,
Oletame, et myClass()
deklareeritakse meetod superklassis protected
. Seejärel võib sama meetod myClass()
alamklassis olla kas public
või protected
, kuid mitte private
.
Näide 3: Juurdepääsu täpsustus alistamises
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Väljund :
Olen koer.
Ülaltoodud näites alistab alamklass Koer displayInfo()
superklassist looma meetodi .
Alati, kui helistame displayInfo()
d1 (alamklassi objekt) abil, kutsutakse alamklassisisest meetodit.
Pange tähele, et see displayInfo()
on deklareeritud protected
loomade superklassis. Samal meetodil on public
koera alamklassis juurdepääsuspetsifikaator. See on võimalik, kuna public
pakub suuremat juurdepääsu kui protected
.
Ülekaalukad abstraktsed meetodid
Javas on abstraktsed klassid loodud teiste klasside superklassiks. Ja kui klass sisaldab abstraktset meetodit, on see kohustuslik alistada.
Lisateavet abstraktsete klasside ja abstraktsete meetodite alistamise kohta leiate hilisematest õpetustest.