Přepsání metody Java

V tomto výukovém programu se na příkladech seznámíme s přepsáním metod v Javě.

V posledním kurzu jsme se dozvěděli o dědičnosti. Dědičnost je vlastnost OOP, která nám umožňuje odvodit novou třídu (podtřídu) z existující třídy (nadtřída). Podtřída dědí atributy a metody nadtřídy.

Nyní, pokud je stejná metoda definována v nadtřídě i podtřídě, pak metoda třídy podtřídy přepíše metodu nadtřídy. Toto se nazývá přepsání metody.

Příklad 1: Přepsání metody

 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ýstup :

 Jsem pes. 

Ve výše uvedeném programu je displayInfo()metoda přítomna jak v podtřídě Animal, tak v podtřídě Dog.

Když voláme displayInfo()pomocí objektu d1 (objekt podtřídy), volá se metoda uvnitř podtřídy Dog. displayInfo()Způsob podtřídy přepíše stejnou metodu rodičovské třídy.

Všimněte si použití @Overrideanotace v našem příkladu. V Javě jsou anotace metadata, která jsme použili k poskytnutí informací kompilátoru. Zde @Overrideanotace určuje kompilátor, že metoda po této anotaci přepíše metodu nadtřídy.

Používání není povinné @Override. Když to však použijeme, měla by metoda dodržovat všechna pravidla přepsání. Jinak kompilátor vygeneruje chybu.

Pravidla Java

  • Nadtřída i podtřída musí mít stejný název metody, stejný návratový typ a stejný seznam parametrů.
  • Metodu deklarovanou jako finala nemůžeme přepsat static.
  • Vždy bychom měli přepsat abstraktní metody nadtřídy (o nichž pojednáme v dalších cvičeních).

super klíčové slovo v Java Overriding

Běžnou otázkou, která vyvstává při provádění přepsání v Javě, je:

Můžeme po přepsání získat přístup k metodě nadtřídy?

Odpověď je ano . Pro přístup k metodě nadtřídy z podtřídy používáme superklíčové slovo.

Příklad 2: Použití super klíčového slova

 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ýstup :

Jsem zvíře. Jsem pes.

Ve výše uvedeném příkladu podtřída Dog přepíše metodu displayInfo()nadtřídy Animal.

Když metodu voláme displayInfo()pomocí objektu d1 podtřídy Dog, volá se metoda uvnitř podtřídy Dog; metoda uvnitř nadtřídy není volána.

Uvnitř displayInfo()podtřídy Dog jsme zvykli super.displayInfo()volat displayInfo()nadtřídu.

Je důležité si uvědomit, že konstruktéři v Javě nejsou zděděni. Proto v Javě neexistuje nic jako přepis konstruktoru.

Konstruktor nadtřídy však můžeme zavolat z jeho podtříd. K tomu používáme super(). Chcete-li se dozvědět více, navštivte super klíčové slovo Java.

Specifikátory přístupu v přepsání metody

Stejná metoda deklarovaná v nadtřídě a jejích podtřídách může mít různé specifikátory přístupu. Existuje však omezení.

Můžeme použít pouze ty specifikátory přístupu v podtřídách, které poskytují větší přístup než specifikátor přístupu nadtřídy. Například,

Předpokládejme, myClass()že je deklarována metoda v nadtřídě protected. Stejná metoda myClass()v podtřídě pak může být buď, publicnebo protectedne private.

Příklad 3: Specifikátor přístupu v přepsání

 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ýstup :

 Jsem pes. 

Ve výše uvedeném příkladu podtřída Dog přepíše metodu displayInfo()nadtřídy Animal.

Kdykoli voláme displayInfo()pomocí d1 (objekt podtřídy), volá se metoda uvnitř podtřídy.

Všimněte si, že displayInfo()je deklarováno protectedve zvířecí nadtřídě. Stejná metoda má publicspecifikátor přístupu v podtřídě Dog. To je možné, protože publicposkytuje větší přístup než protected.

Převažující abstraktní metody

V Javě jsou abstraktní třídy vytvářeny jako nadtřída jiných tříd. A pokud třída obsahuje abstraktní metodu, je nutné ji přepsat.

Více o abstraktních třídách a přepsání abstraktních metod se dozvíme v dalších cvičeních.

Zajímavé články...