Polimorfizm w Java (Statyczne i dynamiczne)
Na czym polega polimorfizm Java?
Wielopostaciowość in Java występuje, gdy istnieje jedna lub więcej klas lub obiektów powiązanych ze sobą poprzez dziedziczenie. Jest to zdolność obiektu do przybierania wielu form. Dziedziczenie pozwala użytkownikom dziedziczyć atrybuty i metody, a polimorfizm wykorzystuje te metody do wykonywania różnych zadań. Zatem celem jest komunikacja, ale podejście jest inne.
Na przykład masz smartfon do komunikacji. Tryb komunikacji, który wybierzesz, może być dowolny. Może to być połączenie, wiadomość tekstowa, wiadomość obrazkowa, poczta itp. Tak więc cel jest wspólny, czyli komunikacja, ale ich podejście jest inne. To się nazywa Wielopostaciowość. Teraz nauczymy się polimorfizmu w Java z przykładem.
Kliknij w tym miejscu jeśli film nie jest dostępny
Java Polimorfizm w OOP z przykładem
Mamy jedną klasę nadrzędną, 'Account' z funkcją wpłaty i wypłaty. Account ma 2 klasy podrzędne. Operacja wpłaty i wypłaty jest taka sama dla kont oszczędnościowych i rozliczeniowych. Więc odziedziczone metody z klasy Account będą działać.
Zmiana wymagań dotyczących oprogramowania
Istnieje zmiana w specyfikacji wymagań, co jest tak powszechne w branży oprogramowania. Powinieneś dodać funkcjonalność uprzywilejowanego konta bankowego z możliwością debetu. Dla tła, debet to możliwość, dzięki której możesz wypłacić kwotę większą niż dostępne saldo na Twoim koncie. Tak więc metoda wypłaty dla uprzywilejowanego konta musi zostać wdrożona na nowo. Ale nie zmieniasz testowanego fragmentu kodu w koncie oszczędnościowym i rozliczeniowym. To jest zaleta OOPS
Krok 1) Tak, że w przypadku wywołania metody „wycofanej” konta oszczędnościowego wykonywana jest metoda z nadrzędnej klasy konta
Krok 2) Natomiast w przypadku wywołania metody „Wypłata” dla konta uprzywilejowanego (kredytu w rachunku bieżącym) wykonywana jest metoda wypłaty zdefiniowana w klasie uprzywilejowanej. To jest Polimorfizm w OOP.
Metoda Zastępowanie w Java
Przesłonięcie metody to przedefiniowanie metody superklasy w podklasie.
Zasady zastępowania metod
- Sygnatura metody, tj. nazwa metody, lista parametrów i typ zwracany, muszą być dokładnie zgodne.
- Przeciążona metoda może poszerzać dostępność, ale nie ją zawężać, tzn. jeśli w klasie bazowej jest prywatna, to klasa potomna może ją upublicznić, ale nie odwrotnie.
Przykład
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } Class run{ public static void main (String args[]){ Doctor doctorObj = new Doctor() // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
Różnica między przeciążaniem a zastępowaniem
Przeciążanie metod znajduje się w tej samej klasie, gdzie więcej niż jedna metoda ma tę samą nazwę, ale różne podpisy. | Nadpisywanie metod ma miejsce wtedy, gdy jedna z metod w nadklasie jest redefiniowana w podklasie. W tym przypadku sygnatura metody pozostaje taka sama. |
ex:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
ex:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
Co to jest polimorfizm dynamiczny?
Dynamiczny polimorfizm w obiektach OOP to mechanizm, dzięki któremu można zdefiniować wiele metod o tej samej nazwie i podpisie w nadklasie i podklasie. Wywołanie przesłoniętej metody jest rozpoznawane w czasie wykonywania.
Przykład dynamicznego polimorfizmu:
Zmienna referencyjna superklasy może odnosić się do obiektu podklasy
Doctor obj = new Surgeon();
Rozważ stwierdzenie
obj.treatPatient();
Tutaj zmienna referencyjna „obj” należy do klasy nadrzędnej, ale obiekt, na który wskazuje, należy do klasy potomnej (jak pokazano na poniższym schemacie przykładu polimorfizmu).
obj.treatPatient() wykona metodę leczeniaPatient() podklasy – Surgeon
Jeśli do wywołania metody używane jest odwołanie do klasy bazowej, o metodzie, która ma zostać wywołana, decyduje maszyna JVM, w zależności od obiektu, na który wskazuje odwołanie
Na przykład, mimo że obj jest odniesieniem do Doktora, wywołuje metodę Surgeon, ponieważ wskazuje na obiekt Surgeon
Jest to ustalane w czasie wykonywania i dlatego jest nazywane dynamiczny or polimorfizm w czasie wykonywania
Różnica między polimorfizmem statycznym i dynamicznym
Statyczny polimorfizm w Java to rodzaj polimorfizmu, który zbiera informacje dotyczące wywołania metody w czasie kompilacji, podczas gdy dynamiczny polimorfizm to rodzaj polimorfizmu, który zbiera informacje dotyczące wywołania metody w czasie wykonywania.
Wiąże się to z przeciążaniem metod. | Dotyczy przesłaniania metod. |
Błędy, jeśli występują, są rozwiązywane w czasie kompilacji. Ponieważ kod nie jest wykonywany podczas kompilacji, stąd nazwa static.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
W przypadku, gdy zmienna referencyjna wywołuje przesłoniętą metodę, metoda, która ma zostać wywołana, jest określana przez obiekt, na który wskazuje zmienna referencyjna. Można to określić tylko w czasie wykonywania, gdy kod jest w trakcie wykonywania, stąd nazwa dynamic.
ex: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
Super słowo kluczowe w Java
Co jeśli metoda treatPatient w klasie Surgeon chce wykonać funkcjonalność zdefiniowaną w klasie Doctor, a następnie wykonać swoją własną, określoną funkcjonalność? W tym przypadku słowo kluczowe super
można użyć do dostępu do metod klasy nadrzędnej z klasy podrzędnej. Metodę treatPatient w klasie Surgeon można zapisać jako:
treatPatient(){ super.treatPatient(); //add code specific to Surgeon }
Słowa kluczowego super można użyć, aby uzyskać dostęp do dowolnego elementu danych lub metod nadklasy w podklasie.
Następnie dowiemy się o słowie kluczowym Super, Dziedzictwo i polimorfizm w Java z przykładowymi programami.
Przykład: - Aby nauczyć się dziedziczenia, polimorfizmu i super słowa kluczowego
Krok 1) Skopiuj poniższy kod do edytora
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overriden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
Krok 2) Zapisz, skompiluj i uruchom kod. Obserwuj wynik.
Krok 3) Odkomentuj wiersze nr 6–9. Zapisz, skompiluj i uruchom kod. Obserwuj wynik.
Krok 4) Odkomentuj linię nr 10. Zapisz i skompiluj kod.
Krok 5) Błąd =? Dzieje się tak dlatego, że podklasa nie ma dostępu do prywatnych członków superklasy.
Podsumowanie
- Polimorfizm w programowaniu obiektowym występuje, gdy istnieje jedna lub więcej klas lub obiektów powiązanych ze sobą poprzez dziedziczenie. Jest to zdolność obiektu do przybierania wielu form.
- Przesłonięcie metody to przedefiniowanie metody superklasy w podklasie.
- Polimorfizm dynamiczny w Java to mechanizm, dzięki któremu można zdefiniować wiele metod o tej samej nazwie i podpisie w nadklasie i podklasie.
- Statyczny polimorfizm w Java to rodzaj polimorfizmu, który zbiera informacje dotyczące wywołania metody w czasie kompilacji, podczas gdy dynamiczny polimorfizm to rodzaj polimorfizmu, który zbiera informacje dotyczące wywołania metody w czasie wykonywania.
- Słowa kluczowego super można użyć w celu uzyskania dostępu do metod klasy nadrzędnej z poziomu klasy podrzędnej.