Zastępowanie metody Java

W tym samouczku, na przykładach, nauczymy się nadpisywania metod w Javie.

W ostatnim samouczku dowiedzieliśmy się o dziedziczeniu. Dziedziczenie to właściwość OOP, która pozwala nam wyprowadzić nową klasę (podklasę) z istniejącej klasy (nadklasy). Podklasa dziedziczy atrybuty i metody nadklasy.

Teraz, jeśli ta sama metoda jest zdefiniowana zarówno w nadklasie, jak i w podklasie, wówczas metoda klasy podklasy przesłania metodę z nadklasy. Jest to znane jako przesłanianie metody.

Przykład 1: przesłanianie 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(); ) ) 

Wyjście :

 Jestem psem. 

W powyższym programie displayInfo()metoda jest obecna zarówno w nadklasie zwierząt, jak i podklasie Pies.

Kiedy wywołujemy displayInfo()przy użyciu obiektu d1 (obiekt podklasy), wywoływana jest metoda wewnątrz podklasy Dog. displayInfo()Sposób podklasy zastępuje w ten sam sposób z nadrzędnej.

Zwróć uwagę na użycie @Overrideadnotacji w naszym przykładzie. W Javie adnotacje to metadane, których użyliśmy do dostarczenia informacji kompilatorowi. W tym miejscu @Overrideadnotacja określa kompilator, że metoda po tej adnotacji przesłania metodę nadklasy.

Nie jest to obowiązkowe @Override. Jednak kiedy tego używamy, metoda powinna przestrzegać wszystkich zasad nadpisywania. W przeciwnym razie kompilator wygeneruje błąd.

Reguły nadpisywania Java

  • Zarówno nadklasa, jak i podklasa muszą mieć tę samą nazwę metody, ten sam typ zwracanych wartości i tę samą listę parametrów.
  • Nie możemy zastąpić metody zadeklarowanej jako finali static.
  • Powinniśmy zawsze nadpisywać abstrakcyjne metody klasy nadrzędnej (zostaną omówione w późniejszych tutorialach).

super słowo kluczowe w nadpisywaniu Java

Typowe pytanie, które pojawia się podczas wykonywania nadpisywania w Javie, to:

Czy możemy uzyskać dostęp do metody nadklasy po zastąpieniu?

Cóż, odpowiedź brzmi: tak . Aby uzyskać dostęp do metody nadklasy z podklasy, używamy supersłowa kluczowego.

Przykład 2: użycie super słowa kluczowego

 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(); ) ) 

Wyjście :

Jestem zwierzęciem. Jestem psem.

W powyższym przykładzie podklasa Pies zastępuje metodę displayInfo()nadklasy Animal.

Kiedy wywołujemy metodę displayInfo()przy użyciu obiektu d1 podklasy Dog, wywoływana jest metoda wewnątrz podklasy Dog; metoda wewnątrz nadklasy nie jest wywoływana.

Wewnątrz displayInfo()podklasy Dog super.displayInfo()nazywaliśmy displayInfo()superklasę.

Należy zauważyć, że konstruktory w Javie nie są dziedziczone. Dlatego w Javie nie ma czegoś takiego jak nadpisywanie konstruktora.

Możemy jednak wywołać konstruktora nadklasy z jej podklas. W tym celu używamy super(). Aby dowiedzieć się więcej, odwiedź stronę słowa kluczowego super Java.

Dostęp do specyfikatorów w zastępowaniu metod

Ta sama metoda zadeklarowana w nadklasie i jej podklasach może mieć różne specyfikatory dostępu. Istnieje jednak ograniczenie.

Możemy używać tych specyfikatorów dostępu tylko w podklasach, które zapewniają większy dostęp niż specyfikator dostępu nadklasy. Na przykład,

Załóżmy, że myClass()zadeklarowano metodę w nadklasie protected. Wtedy ta sama metoda myClass()w podklasie może być albo publicalbo protected, ale nie private.

Przykład 3: Specyfikator dostępu podczas zastępowania

 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(); ) ) 

Wyjście :

 Jestem psem. 

W powyższym przykładzie podklasa Pies zastępuje metodę displayInfo()nadklasy Animal.

Za każdym razem, gdy wywołujemy displayInfo()przy użyciu d1 (obiekt podklasy), wywoływana jest metoda wewnątrz podklasy.

Zwróć uwagę, że displayInfo()jest zadeklarowana protectedw nadklasie Animal. Ta sama metoda ma specyfikator publicdostępu w podklasie Dog. Jest to możliwe, ponieważ publiczapewnia większy dostęp niż protected.

Zastępowanie metod abstrakcyjnych

W Javie klasy abstrakcyjne są tworzone jako nadklasy innych klas. A jeśli klasa zawiera metodę abstrakcyjną, przesłonięcie jej jest obowiązkowe.

Dowiemy się więcej o klasach abstrakcyjnych i zastępowaniu metod abstrakcyjnych w późniejszych samouczkach.

Interesujące artykuły...