Java-meetodi ülimuslikkus

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 @Overridemärkuse kasutamist meie näites. Javas on märkused metaandmed, mida kasutasime kompilaatorile teabe edastamiseks. Siin @Overridetä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 finalja static.
  • 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 supermä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 publicvõ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 protectedloomade superklassis. Samal meetodil on publickoera alamklassis juurdepääsuspetsifikaator. See on võimalik, kuna publicpakub 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.

Huvitavad Artiklid...