Polimorfizm w Java (Statyczne i dynamiczne)
⚡ Inteligentne podsumowanie
Polimorfizm w Java Pozwala jednemu interfejsowi reprezentować wiele formularzy, dzięki czemu pojedyncza nazwa metody zachowuje się inaczej w różnych klasach. Jest to filar projektowania obiektowego, który promuje elastyczność, ponowne wykorzystanie kodu i łatwą rozbudowę starszych systemów bankowych, medycznych i korporacyjnych.

Na czym polega polimorfizm Java?
Polimorfizm w Java Występuje, gdy jedna lub więcej klas lub obiektów jest 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ń. Celem jest komunikacja, choć podejście może być różne.
Na przykład smartfon służy do komunikacji. Tryb komunikacji może obejmować połączenie telefoniczne, SMS-a, wiadomość obrazkową lub e-mail. Cel jest wspólny, czyli komunikacja, ale podejście jest inne. To zachowanie stanowi istotę WielopostaciowośćTeraz nauczymy się polimorfizmu w Java z przykładowym kodem, diagramami i wyjaśnieniami krok po kroku.
Kliknij w tym miejscu jeśli film nie jest dostępny
Dlaczego warto stosować polimorfizm w Java?
Polimorfizm w Java jest używany, ponieważ zapewnia elastyczność kodu, możliwość ponownego użycia i jest łatwiejszy w utrzymaniu. Pojedyncza zmienna referencyjna typu nadrzędnego może wskazywać na kilka obiektów podrzędnych, więc to samo wywołanie dostosowuje się do dowolnej podanej podklasy. Ten wzorzec pozwala zachować przetestowany kod w stanie nienaruszonym, podczas gdy nowe zachowanie jest dodawane za pośrednictwem wyspecjalizowanych podklas, co jest właśnie powodem, dla którego frameworki takie jak Spring i Jakarta EE są od niego zależne.
Java Polimorfizm w OOP z przykładem
Rozważ jedną klasę nadrzędną o nazwie Konto Z funkcjami wpłaty i wypłaty. Klasa Account ma dwie klasy podrzędne. Operacje wpłaty i wypłaty są takie same dla kont oszczędnościowych i rozliczeniowych, więc metody odziedziczone z klasy Account będą działać.
Java Przykład polimorfizmu
Zmiana wymagań dotyczących oprogramowania
Wprowadzono zmianę w specyfikacji wymagań, co jest powszechne w branży oprogramowania. Należy dodać funkcjonalność dla uprzywilejowanego rachunku bankowego z funkcją debetu. Debet to funkcja, dzięki której klient może wypłacić kwotę wyższą niż dostępne saldo na rachunku. Metoda wypłaty dla rachunku uprzywilejowanego wymaga nowej implementacji, podczas gdy przetestowany kod w rachunkach oszczędnościowych i rozliczeniowych pozostaje nienaruszony. Ta izolacja jest zaletą. OOPS.
Krok 1) Gdy wywołana zostanie metoda wycofania dla konta oszczędnościowego, wykonywana jest metoda zdefiniowana w nadrzędnej klasie Konto.
Krok 2) Po wywołaniu metody „wycofaj” dla konta uprzywilejowanego (debetu) wykonywana jest metoda „wycofaj” zdefiniowana w klasie uprzywilejowanej. To polecenie jest Polimorfizm w programach obiektowych.
Metoda Zastępowanie w Java
Nadpisywanie metod to proces redefiniowania metody superklasy w podklasie. Podklasa zachowuje te same zasady.tract, ale dostarcza nową implementację, która jest wybierana podczas uruchamiania programu.
Zasady zastępowania metod
- Sygnatura metody, czyli nazwa metody, lista parametrów i typ zwracany, muszą być dokładnie takie same.
- Nadpisana metoda może poszerzyć dostępność, ale nie może jej zawęzić. Jeśli metoda jest prywatna w klasie bazowej, 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 metod a nadpisywaniem metod
Przeciążanie metod ma miejsce w tej samej klasie o tej samej nazwie metody, ale różnych sygnaturach. Nadpisywanie metod ma miejsce w ramach relacji klasy nadrzędnej i podrzędnej, gdzie podklasa redefiniuje metodę zadeklarowaną w superklasie.
| Przeciążanie metod ma miejsce w tej samej klasie, gdzie więcej niż jedna metoda ma tę samą nazwę, ale różne sygnatury. | Nadpisywanie metod ma miejsce, gdy jedna z metod w superklasie zostaje zdefiniowana ponownie w podklasie. W takim 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 programowaniu obiektowym (OOP) to mechanizm, dzięki któremu wiele metod może być zdefiniowanych z tą samą nazwą i sygnaturą w superklasie i podklasie. Wywołanie nadpisanej metody jest rozwiązywane w czasie wykonywania poprzez dynamiczne wiązanie wewnątrz maszyny wirtualnej Java (JVM).
Przykład dynamicznego polimorfizmu
Zmienna referencyjna superklasy może odwoływać się do obiektu podklasy:
Doctor obj = new Surgeon();
Rozważmy stwierdzenie:
obj.treatPatient();
Tutaj zmienna odniesienia Obj należy do klasy nadrzędnej, ale obiekt, na który wskazuje, należy do klasy podrzędnej, jak pokazano na diagramie polimorfizmu.
Telefon obj.treatPatient() wykona metodę treatPatient() podklasy Surgeon. Gdy odwołanie do klasy bazowej jest używane do wywołania metody, wywoływana metoda jest ustalana przez maszynę wirtualną Java (JVM) na podstawie obiektu, na który wskazuje odwołanie. Mimo że Obj Odwołuje się do Doktora, wywołuje metodę Chirurga, ponieważ wskazuje na obiekt Chirurga. Decyzja jest podejmowana w czasie wykonywania, dlatego nazywa się ją Dynamiczny polimorfizm lub polimorfizmu w czasie wykonywania.
Różnica między polimorfizmem statycznym i dynamicznym
Statyczny polimorfizm w Java jest typem polimorfizmu, który zbiera informacje na potrzeby wywołania metody w czasie kompilacji, podczas gdy dynamiczny polimorfizm jest typem polimorfizmu, który zbiera informacje na potrzeby wywołania metody w czasie wykonywania.
| Dotyczy przeciążania metod. | Dotyczy nadpisywania metod. |
| Ewentualne błędy są rozwiązywane w trakcie kompilacji. Ponieważ kod nie jest wykonywany podczas kompilacji, nazwa jest statyczna.
ex: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
Gdy zmienna referencyjna wywołuje nadpisaną metodę, metoda, która ma zostać wywołana, jest określana na podstawie obiektu, na który wskazuje zmienna referencyjna. Można to ustalić tylko w czasie wykonywania kodu, dlatego nazwa jest dynamiczna.
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 się stanie, jeśli metoda treatPatient w klasie Surgeon będzie chciała wykonać funkcjonalność zdefiniowaną w klasie Doctor, a następnie wykonać własne, specyficzne zachowanie? W takim 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łowo kluczowe „super” umożliwia dostęp do dowolnego elementu danych lub metody nadklasy w podklasie. Następnie poznamy słowo kluczowe „super”. Dziedzictwoi polimorfizm w Java z przykładowymi programami.
Przykład: Aby nauczyć się dziedziczenia, polimorfizmu i słowa kluczowego super
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(){ // overridden 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 od 6 do 9. Zapisz, skompiluj i uruchom kod. Obserwuj wynik.
Krok 4) Usuń komentarz z wiersza 10. Zapisz i skompiluj kod.
Krok 5) Błąd = ? Dzieje się tak, ponieważ podklasa nie może uzyskać dostępu do prywatnych członków superklasy.





