java override method overriding
W tym samouczku wyjaśniono, jak osiągnąć polimorfizm środowiska uruchomieniowego w Javie za pomocą zastąpienia metody i adnotacji @override z prostymi przykładami:
Omówiliśmy już szczegółowo koncepcję polimorfizmu i polimorfizm w czasie kompilacji. W tym samouczku zajmiemy się polimorfizmem środowiska uruchomieniowego w Javie.
W przeciwieństwie do polimorfizmu w czasie kompilacji, w którym wywołanie metody jest rozwiązywane w czasie kompilacji, w polimorfizmie w czasie wykonywania wywołanie metody jest rozwiązywane w czasie wykonywania.
=> Sprawdź WSZYSTKIE samouczki Java tutaj.
Czego się nauczysz:
- Polimorfizm środowiska uruchomieniowego w Javie
- @override Adnotacja w Javie
- Przeciążanie i zastępowanie w Javie
- Wniosek
Polimorfizm środowiska uruchomieniowego w Javie
Polimorfizm środowiska uruchomieniowego, znany również jako dynamiczny polimorfizm lub Dynamiczna wysyłka metod jest technika, w której przesłonięte wywołanie metody jest rozwiązywane dynamicznie w czasie wykonywania.
Polimorfizm środowiska uruchomieniowego w Javie osiąga się za pomocą „ przesłanianie metody ”. Zastępowanie metod to technika, za pomocą której metoda w klasie nadrzędnej jest przedefiniowywana lub zastępowana w klasie podrzędnej.
Gdy metoda jest zastępowana w klasie, technika dynamicznego wysyłania metody rozwiązuje zastąpione wywołanie metody w czasie wykonywania, a nie w czasie kompilacji.
Osiągnij polimorfizm w czasie wykonywania w Javie - nadpisywanie metody
Nadpisywanie metody to podejście, którego używamy do osiągnięcia polimorfizmu środowiska uruchomieniowego w Javie. Jak już wspomniano, przesłanianie metody jest techniką, w której podklasa dodaje metodę, która jest już obecna w swojej klasie nadrzędnej i dodaje nowe funkcje do tej metody. Następnie mówimy, że metoda klasy bazowej jest nadpisywana.
Nowa metoda, którą zdefiniowaliśmy w podklasie z tym samym prototypem, co metoda klasy nadrzędnej, ale inna implementacja, nazywa się „ metoda nadrzędna ” . Metoda w klasie nadrzędnej jest znana jako „ Zastąpiona metoda ”.
konwersja char na int c ++
Po zastąpieniu metody pozostaje pytanie, w jaki sposób zostanie rozwiązane wywołanie tej zastąpionej metody?
Zwykle wywołujemy zastąpioną metodę za pomocą odwołania do klasy bazowej. Utworzymy odniesienie typu base, a następnie przypiszemy obiekt klasy potomnej za pomocą słowa kluczowego new.
W związku z tym zależy to od zawartości zmiennej referencyjnej lub od tego, do którego obiektu odwołuje się odwołanie do klasy bazowej, które określa, która metoda ma zostać wywołana. Jeśli więc obiekty referencyjne wskazują na obiekt klasy potomnej, wywoływana jest metoda nadpisywania.
W przeciwnym razie, jeśli obiekt referencyjny zawiera obiekt klasy bazowej, wywoływana jest metoda zastąpiona. Jednym z tematów, które musimy wyjaśnić w zakresie polimorfizmu w czasie wykonywania, szczególnie w przypadku dynamicznego wysyłania metod, jest „Nadawanie w górę”, które jest wyjaśnione poniżej.
Upcasting
Kiedy obiekt odniesienia klasy nadrzędnej, o której mówiliśmy powyżej, wskazuje lub odwołuje się do obiektu podklasy, wówczas nazywamy go Upcasting.
Zrozummy upcasting na prostym przykładzie.
Weź pod uwagę, że mamy klasę „BaseClass” i rozszerzamy tę klasę BaseClass, aby utworzyć nową klasę DerivedClass. Ta struktura wygląda, jak pokazano poniżej.
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
Teraz, aby zaimplementować upcasting, zadeklarujemy zmienną referencyjną typu BaseClass. Następnie przypisujemy obiekt DerivedClass do odwołania do klasy BaseClass, jak to zrobiono w poniższej instrukcji kodu.
BaseClass base = new DerivedClass (); //Upcasting
Więc tutaj możemy powiedzieć, że przesłaliśmy obiekt DerivedClass do BaseClass. Jeśli chodzi o polimorfizm w czasie wykonywania, bardzo ważna jest koncepcja upcastingu.
Ogólnie rzecz biorąc, upcasting to proces przypisywania obiektów potomnych lub podklas do odniesienia do klasy nadrzędnej lub nadklasy.
SuperClass reference = new Subclass Object;
Poniższy program w języku Java demonstruje przesłanianie metod, a także pokazuje, jak wykonywane jest upcasting w celu rozwiązania przesłoniętych wywołań metod w czasie wykonywania.
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String[] args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
Wynik:
W powyższym programie mamy dwie klasy, tj. Child1 i child2, które są pochodnymi klasy „Parent”. Klasa nadrzędna ma metodę „Print”, która jest nadpisywana w obu klasach child1 i child2. Następnie w metodzie main tworzymy obiekt referencyjny klasy Parent o nazwie „parent”.
Najpierw przypisujemy mu obiekt klasy Parent, a następnie wywołujemy metodę „Print ()”. Następnie powtarzamy to, przypisując najpierw obiekt child1, a następnie child2 do odniesienia Parent.
różnica między testem dymu a testem poczytalności
Dane wyjściowe pokazują, w zależności od zawartości odwołania nadrzędnego, i wywoływana jest odpowiednia metoda Print.
Zalety polimorfizmu dynamicznego / wykonawczego
- W przypadku polimorfizmu dynamicznego programista może przesłonić metody.
- Pozwala klasom zdefiniować metodę z ogólną implementacją, którą jej pochodne mogą następnie zastąpić i zapewnić określoną implementację.
- W przypadku dynamicznego wysyłania metod wywołanie metody jest rozwiązywane w czasie wykonywania, w przeciwieństwie do przeciążenia, o którym decyduje czas kompilacji. Zapewnia to większą elastyczność programistom.
Ponieważ polimorfizm w czasie wykonywania wiąże odpowiednią metodę z wywołaniem w czasie wykonywania, a my również ją wywołujemy wiązanie dynamiczne lub późne wiązanie . Z drugiej strony obsługuje polimorfizm w czasie kompilacji wiązanie statyczne lub wczesne wiązanie .
Wiązanie statyczne a dynamiczne
Wiązanie statyczne | Dynamiczne wiązanie |
---|---|
Wywołanie metody rozwiązane w czasie kompilacji jest wiązaniem statycznym. | Wywołanie metody rozwiązywane w czasie wykonywania jest dynamicznym wiązaniem. |
Przeciążenie metod jest przykładem powiązania statycznego. | Przesłanianie metod jest przykładem dynamicznego wiązania. |
Typy klas i pól są używane do statycznego wiązania. | Obiekty są używane do dynamicznego wiązania. |
Jednostki prywatne, końcowe i statyczne używają powiązania statycznego. | Metody wirtualne używają dynamicznego wiązania. |
Funkcja / metoda wirtualna w Javie
Funkcja lub metoda wirtualna w Javie to funkcja używana z polimorfizmem środowiska wykonawczego. W przeciwieństwie do C ++, Java nie ma specjalnego „wirtualnego” słowa kluczowego aby zaznaczyć, że metoda jest wirtualna. Metoda zdefiniowana w klasie bazowej i zastąpiona w klasie pochodnej jest wirtualna.
W Javie domyślnie każda metoda niestatyczna z wyjątkiem private i final jest funkcją wirtualną. Zwróć więc uwagę, że metody, które omówiliśmy powyżej, zastępujące implementację polimorfizmu w czasie wykonywania, są również metodami wirtualnymi.
Ponieważ metoda statyczna jest powiązana z Class i nie można jej wywołać przy użyciu obiektu, nie można jej używać z polimorfizmem w czasie wykonywania, a także nie jest funkcją wirtualną.
Interfejsy w Javie są domyślnie wirtualne. Klasy implementujące interfejsy zapewniają implementacje metod interfejsu. Podobnie jak w przypadku polimorfizmu w czasie wykonywania, wywołanie metod interfejsu jest również rozwiązywane w czasie wykonywania.
Pamiętaj, że ponieważ metody w interfejsie są zaprojektowane tak, aby były nadpisywane, wszystkie metody interfejsu są funkcjami wirtualnymi.
Weźmy na przykład pod uwagę następujący kod:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
W powyższym kodzie metoda Accelate () jest funkcją wirtualną, ponieważ jest częścią interfejsu samochodu i została zaprojektowana do nadpisania.
@override Adnotacja w Javie
Adnotacja @override jest domyślną adnotacją w języku Java. Ta adnotacja została wprowadzona w Javie 1.5. Adnotacja @override jest używana, gdy metoda podklasy przesłania swoją metodę nadklasy.
Używając adnotacji Java @override, aby wskazać, że metoda przesłania metodę klasy nadrzędnej, kompilator wyświetla ostrzeżenie, jeśli metoda z adnotacjami nie jest zastępowana. Dlatego obowiązkowe jest przesłonięcie metody, gdy używana jest adnotacja @override.
Po drugie, używając adnotacji @override sprawiamy, że kod jest bardziej czytelny. Możemy od razu zdać sobie sprawę, że deklarowana metoda ma zostać zastąpiona.
Ogólna składnia adnotacji Java @override to
public @interface override
Poniższy program Java pokazuje użycie adnotacji @override.
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args[]) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
Wynik:
W powyższym programie mamy BaseClass, który definiuje metodę wyświetlania. Następnie wyprowadzamy klasę DerivedClass z tej BaseClass i oznaczamy metodę wyświetlania adnotacją @override. Ta metoda jest zastępowana w DerivedClass.
W metodzie głównej tworzymy odwołanie do obiektu BaseClass i kierujemy je do obiektu DerivedClass, co powoduje, że odwołanie wywołuje metodę wyświetlania DerivedClass.
Gdybyśmy nie zaimplementowali metody display () w klasie Derived, kompilator dałby ostrzeżenie kompilatora, ponieważ jest oznaczony adnotacją @override.
Przeciążanie i zastępowanie w Javie
Teraz, gdy omówiliśmy zarówno przeciążanie, jak i zastępowanie w Javie, podsumujmy te dwie koncepcje.
Przeciążanie jest związane z polimorfizmem w czasie kompilacji, tj. Implementujemy polimorfizm w czasie kompilacji za pomocą przeciążania. Przeciążanie odbywa się na dwa sposoby, tj. Przeciążanie metod i przeciążanie operatorów.
Przeciążanie metod to technika, w której mamy więcej niż jedną metodę o tej samej nazwie, ale z różnymi listami parametrów. Lista parametrów jest zróżnicowana na podstawie liczby parametrów, typów parametrów lub sekwencji parametrów.
Przeciążanie operatorów w Javie jest ograniczone i pozwala nam na przeciążenie tylko operatora „+”, który jest używany do dodawania dwóch liczb i łączenia dwóch obiektów typu String.
Przeciążenie jest rozwiązywane w czasie kompilacji i jest statyczne. Nazywa się to również „Wczesne wiązanie” .
Zastąpienie metody to funkcja, za pomocą której implementujemy polimorfizm w czasie wykonywania. W przypadku przesłonięcia metody metoda klasy nadrzędnej jest zastępowana w klasie potomnej. Oznacza to, że prototyp metody w super i podklasie pozostaje taki sam, ale implementacje są inne.
Zastępowanie metod wykorzystuje technikę dynamicznego wysyłania metod, aby rozstrzygnąć wywołanie metody i zdecydować, czy wywołać metodę nadklasy czy podklasy, i jest to wykonywane w czasie wykonywania.
Stąd polimorfizm w czasie wykonywania jest również nazywany polimorfizmem dynamicznym lub późnym wiązaniem.
Następnie przedstawmy tabelarycznie różnice między przeciążaniem i zastępowaniem w Javie.
Przeciążanie i zastępowanie w Javie
Przeciążenie | Nadrzędny |
---|---|
Przeciążanie jest używane w polimorfizmie w czasie kompilacji. | Zastępowanie jest implementowane w polimorfizmie środowiska uruchomieniowego. |
Można to zrobić w tej samej klasie. Może wymagać dziedziczenia lub nie. | Zastępowanie zawsze wymaga dziedziczenia. |
Metody są przeciążane tą samą nazwą metody i inną listą parametrów. | Nadpisane metody mają te same prototypy. |
Zwracany typ nie jest uwzględniany w przeciążaniu metod. | Typ zwracany powinien być taki sam w metodach zastępowanych i zastępujących. |
Poprawia czytelność programu. | Zastępowanie pozwala na posiadanie określonej klasy implementacji. |
Często Zadawane Pytania
P # 1) Czy możemy zastąpić metodę statyczną?
Odpowiedź: Nie. W Javie nie można przesłonić metod statycznych. Dzieje się tak, ponieważ metody statyczne są oparte na klasach i są wywoływane bezpośrednio przez klasę. Nie potrzebują obiektów do wywołania w czasie wykonywania. Dlatego wysyłanie metody statycznej jest określane przez kompilator.
Q # 2) Czy możemy zastąpić konstruktora?
Odpowiedź: Nie, nie możemy przesłonić konstruktora. Konstruktor jest wywoływany podczas tworzenia obiektu. Nie nazywa się tego przedmiotem. Ponadto jednym z wymogów przesłonięcia jest metoda przesłonięta, a metoda przesłaniająca powinna mieć ten sam podpis metody, co nie jest możliwe w przypadku konstruktorów.
P # 3) Dlaczego przesłanianie metody nazywa się dynamicznym polimorfizmem?
Odpowiedź: W przypadku przesłaniania metody wywołanie metody jest rozwiązywane dynamicznie w czasie wykonywania. Dlatego nazywa się to dynamicznym polimorfizmem.
P # 4) Jakie jest zastosowanie polimorfizmu dynamicznego w Javie?
Odpowiedź: Polimorfizm dynamiczny wykorzystuje technikę dynamicznego wysyłania metod, która obsługuje nadpisywanie metody, dzięki czemu podklasa może zapewnić określoną implementację zastępowanej metody. W ten sposób możemy zaimplementować określone funkcje, które pozwalają nam pisać wydajne programy.
Po drugie, nie musimy również martwić się o rozwiązywanie wywołań metod, ponieważ dynamiczne wysyłanie metod decyduje, którą metodę wywołać.
P # 5) Jaka jest różnica między wiązaniem statycznym a dynamicznym?
Odpowiedź: Powiązanie między wywołaniem metody a jej implementacją nazywane jest wiązaniem. Gdy to łączenie zostanie rozwiązane w czasie kompilacji, nazywamy to wiązaniem statycznym. Gdy powiązanie jest wykonywane dynamicznie w czasie wykonywania, nazywamy to wiązaniem dynamicznym.
Powiązanie statyczne używa typu danych klasy i pól do rozpoznawania wywołań metod. Dynamiczne powiązanie używa obiektów do rozpoznawania wywołań metod. Wiązanie statyczne jest również nazywane polimorfizmem w czasie kompilacji, a wiązanie dynamiczne jest również nazywane polimorfizmem w czasie wykonywania.
Wniosek
W tym samouczku szczegółowo omówiliśmy polimorfizm środowiska uruchomieniowego w Javie.
Polimorfizm w czasie wykonywania jest implementowany przy użyciu przesłaniania metody. Nadpisywanie metody jest wykonywane w podklasie, w której metoda zdefiniowana w nadklasie jest ponownie definiowana lub nadpisywana w jej podklasie. Sygnatura metody pozostaje taka sama w super i podklasie.
Korzystając z przesłaniania metody, możemy zapewnić określoną implementację tej samej metody w podklasie. W ten sposób możemy pisać wydajniejsze programy z dziedziczeniem. Java udostępnia adnotację @override wskazującą, że metoda ma zostać zastąpiona.
oprogramowanie do tworzenia aplikacji na Androida dla systemu Windows
Domyślnie wszystkie metody niestatyczne, które nie są ostateczne, są w Javie wirtualne. Wszystkie metody wirtualne można zastąpić.
=> Obejrzyj serię prostych szkoleń dotyczących języka Java.
rekomendowane lektury
- Zastępowanie predefiniowanych metod w Javie
- Metoda Java String length () z przykładami
- Co to jest polimorfizm w Javie - samouczek z przykładami
- Jak korzystać z metody toString w języku Java?
- Metoda Java String indexOf z przykładami kodu
- Java String zawiera () Samouczek dotyczący metody z przykładami
- Metoda Java String Split () - Jak podzielić ciąg w Javie
- Metoda Java String compareTo z przykładami programowania