logo

Polimorfizm w Javie

Polimorfizm w Javie to koncepcja, dzięki której możemy wykonać a pojedyncze działanie na różne sposoby . Polimorfizm pochodzi od dwóch greckich słów: poli i morphs. Słowo „poly” oznacza wiele, a „morfy” oznaczają formy. Zatem polimorfizm oznacza wiele form.

W Javie istnieją dwa typy polimorfizmu: polimorfizm w czasie kompilacji i polimorfizm w czasie wykonywania. Możemy wykonać polimorfizm w Javie poprzez przeciążanie metod i nadpisywanie metod.

Jeśli przeciążysz metodę statyczną w Javie, jest to przykład polimorfizmu czasu kompilacji. Tutaj skupimy się na polimorfizmie środowiska wykonawczego w Javie.


Polimorfizm środowiska wykonawczego w Javie

Polimorfizm środowiska wykonawczego Lub Wysyłka metody dynamicznej to proces, w którym wywołanie przesłoniętej metody jest rozwiązywane w czasie wykonywania, a nie w czasie kompilacji.

rotacja drzewa avl

W tym procesie przesłonięta metoda wywoływana jest poprzez zmienną referencyjną nadklasy. Określenie metody, która ma zostać wywołana, opiera się na obiekcie, do którego odnosi się zmienna referencyjna.

Najpierw zrozummy upcasting przed polimorfizmem środowiska wykonawczego.

Podnoszące na duchu

Jeśli zmienna referencyjna klasy Parent odnosi się do obiektu klasy Child, nazywa się to rzutowaniem w górę. Na przykład:

Upcastowanie w Javie
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Do upcastingu możemy użyć zmiennej referencyjnej typu klasy lub typu interfejsu. Na przykład:

 interface I{} class A{} class B extends A implements I{} 

Tutaj relacja klasy B wyglądałaby następująco:

 B IS-A A B IS-A I B IS-A Object 

Ponieważ Obiekt jest klasą główną wszystkich klas w Javie, możemy napisać obiekt B IS-A.

odlany w sql

Przykład polimorfizmu środowiska wykonawczego Java

W tym przykładzie tworzymy dwie klasy Bike i Splendor. Klasa Splendor rozszerza klasę Bike i zastępuje jej metodę run(). Metodę run wywołujemy poprzez zmienną referencyjną klasy Parent. Ponieważ odnosi się do obiektu podklasy, a metoda podklasy zastępuje metodę klasy nadrzędnej, metoda podklasy jest wywoływana w czasie wykonywania.

Ponieważ wywołanie metody jest określane przez maszynę JVM, a nie kompilator, jest to znane jako polimorfizm środowiska wykonawczego.

 class Bike{ void run(){System.out.println('running');} } class Splendor extends Bike{ void run(){System.out.println('running safely with 60km');} public static void main(String args[]){ Bike b = new Splendor();//upcasting b.run(); } } 
Przetestuj teraz

Wyjście:

 running safely with 60km. 

Przykład polimorfizmu środowiska wykonawczego Java: Bank

Rozważmy scenariusz, w którym Bank jest klasą zapewniającą metodę uzyskania stopy procentowej. Jednak stopa procentowa może się różnić w zależności od banku. Na przykład banki SBI, ICICI i AXIS zapewniają stopę procentową na poziomie 8,4%, 7,3% i 9,7%.

Przykład polimorfizmu środowiska Java Runtime banku

Uwaga: ten przykład jest również podany w przypadku przesłaniania metody, ale nie było rzutowania w górę.

 class Bank{ float getRateOfInterest(){return 0;} } class SBI extends Bank{ float getRateOfInterest(){return 8.4f;} } class ICICI extends Bank{ float getRateOfInterest(){return 7.3f;} } class AXIS extends Bank{ float getRateOfInterest(){return 9.7f;} } class TestPolymorphism{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println('SBI Rate of Interest: '+b.getRateOfInterest()); b=new ICICI(); System.out.println('ICICI Rate of Interest: '+b.getRateOfInterest()); b=new AXIS(); System.out.println('AXIS Rate of Interest: '+b.getRateOfInterest()); } } 
Przetestuj teraz

Wyjście:

 SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7 

Przykład polimorfizmu środowiska wykonawczego Java: Kształt

 class Shape{ void draw(){System.out.println('drawing...');} } class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle...');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle...');} } class Triangle extends Shape{ void draw(){System.out.println('drawing triangle...');} } class TestPolymorphism2{ public static void main(String args[]){ Shape s; s=new Rectangle(); s.draw(); s=new Circle(); s.draw(); s=new Triangle(); s.draw(); } } 
Przetestuj teraz

Wyjście:

 drawing rectangle... drawing circle... drawing triangle... 

Przykład polimorfizmu środowiska wykonawczego Java: Animal

 class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void eat(){System.out.println('eating bread...');} } class Cat extends Animal{ void eat(){System.out.println('eating rat...');} } class Lion extends Animal{ void eat(){System.out.println('eating meat...');} } class TestPolymorphism3{ public static void main(String[] args){ Animal a; a=new Dog(); a.eat(); a=new Cat(); a.eat(); a=new Lion(); a.eat(); }} 
Przetestuj teraz

Wyjście:

 eating bread... eating rat... eating meat... 

Polimorfizm środowiska wykonawczego Java z elementem danych

Zastępowana jest metoda, a nie elementy danych, więc elementy członkowskie danych nie mogą osiągnąć polimorfizmu w czasie wykonywania.

W przykładzie podanym poniżej obie klasy mają ograniczenie prędkości elementu danych. Dostęp do elementu danych uzyskujemy poprzez zmienną referencyjną klasy Parent, która odnosi się do obiektu podklasy. Ponieważ uzyskujemy dostęp do elementu danych, który nie jest zastąpiony, dlatego zawsze będzie on miał dostęp do elementu danych klasy Parent.

Reguła: Polimorfizm środowiska wykonawczego nie może zostać osiągnięty przez elementy członkowskie danych.

 class Bike{ int speedlimit=90; } class Honda3 extends Bike{ int speedlimit=150; public static void main(String args[]){ Bike obj=new Honda3(); System.out.println(obj.speedlimit);//90 } } 
Przetestuj teraz

Wyjście:

 90 

Polimorfizm środowiska wykonawczego Java z dziedziczeniem wielopoziomowym

Zobaczmy prosty przykład polimorfizmu środowiska wykonawczego z dziedziczeniem wielopoziomowym.

oś serwera sql
 class Animal{ void eat(){System.out.println('eating');} } class Dog extends Animal{ void eat(){System.out.println('eating fruits');} } class BabyDog extends Dog{ void eat(){System.out.println('drinking milk');} public static void main(String args[]){ Animal a1,a2,a3; a1=new Animal(); a2=new Dog(); a3=new BabyDog(); a1.eat(); a2.eat(); a3.eat(); } } 
Przetestuj teraz

Wyjście:

 eating eating fruits drinking Milk 

Spróbuj dla danych wyjściowych

 class Animal{ void eat(){System.out.println('animal is eating...');} } class Dog extends Animal{ void eat(){System.out.println('dog is eating...');} } class BabyDog1 extends Dog{ public static void main(String args[]){ Animal a=new BabyDog1(); a.eat(); }} 
Przetestuj teraz

Wyjście:

 Dog is eating 

Ponieważ BabyDog nie przesłania metody eat(), dlatego wywoływana jest metoda eat() klasy Dog.