logo

Polimorfizam u Javi

Polimorfizam u Javi je koncept pomoću kojeg možemo izvesti a pojedinačno djelovanje na različite načine . Polimorfizam je izveden iz 2 grčke riječi: poly i morphs. Riječ 'poli' znači mnogo, a 'morfi' znači oblici. Dakle, polimorfizam znači mnogo oblika.

Postoje dvije vrste polimorfizma u Javi: polimorfizam u vrijeme kompajliranja i polimorfizam u vremenu izvođenja. Možemo izvesti polimorfizam u Javi preopterećenjem metode i nadjačavanjem metode.

Ako preopteretite statičku metodu u Javi, to je primjer polimorfizma vremena kompajliranja. Ovdje ćemo se usredotočiti na polimorfizam vremena izvođenja u Javi.


Polimorfizam vremena izvođenja u Javi

Polimorfizam vremena izvođenja ili Dinamička metoda otpremanja je proces u kojem se poziv nadjačane metode rješava tijekom izvođenja, a ne tijekom kompilacije.

U ovom procesu, nadjačana metoda se poziva preko referentne varijable superklase. Određivanje metode koja će se pozvati temelji se na objektu na koji upućuje referentna varijabla.

Prvo shvatimo prevođenje prije polimorfizma vremena izvođenja.

Upcasting

Ako se referentna varijabla klase Parent odnosi na objekt klase Child, to je poznato kao upcasting. Na primjer:

java znak u niz
Upcasting u Javi
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Za upcasting možemo koristiti referentnu varijablu tipa klase ili tipa sučelja. Na primjer:

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

Ovdje bi odnos B klase bio:

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

Budući da je Object korijenska klasa svih klasa u Javi, možemo napisati B JE-A Object.


Primjer Java Runtime polimorfizma

U ovom primjeru stvaramo dvije klase Bike i Splendor. Klasa Splendor proširuje klasu Bike i nadjačava njenu metodu run(). Metodu pokretanja pozivamo referentnom varijablom roditeljske klase. Budući da se odnosi na objekt podklase i metoda podklase nadjačava metodu roditeljske klase, metoda podklase se poziva tijekom izvođenja.

Budući da pozivanje metode određuje JVM, a ne kompajler, poznato je kao polimorfizam vremena izvođenja.

 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(); } } 
Testirajte sada

Izlaz:

 running safely with 60km. 

Primjer polimorfizma Java Runtime: Banka

Razmotrite scenarij u kojem je banka klasa koja pruža metodu za dobivanje kamatne stope. Međutim, kamatna stopa može se razlikovati ovisno o banci. Na primjer, SBI, ICICI i AXIS banke daju kamatu od 8,4%, 7,3% i 9,7%.

Primjer banke za polimorfizam Java Runtimea

Napomena: Ovaj primjer također je dan u nadjačavanju metode, ali nije bilo upcastiranja.

 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()); } } 
Testirajte sada

Izlaz:

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

Primjer polimorfizma Java Runtime: Oblik

 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(); } } 
Testirajte sada

Izlaz:

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

Primjer polimorfizma Java Runtime: Životinja

 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(); }} 
Testirajte sada

Izlaz:

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

Java Runtime polimorfizam s članom podataka

Metoda je nadjačana, a ne podatkovni članovi, tako da podatkovni članovi ne mogu postići polimorfizam vremena izvođenja.

U donjem primjeru obje klase imaju ograničenje brzine podatkovnog člana. Članu podataka pristupamo referentnom varijablom roditeljske klase koja se odnosi na objekt podklase. Budući da pristupamo podatkovnom članu koji nije nadjačan, stoga će uvijek pristupati podatkovnom članu roditeljske klase.

Pravilo: Polimorfizam vremena izvođenja ne mogu postići članovi podataka.

 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 } } 
Testirajte sada

Izlaz:

 90 

Java Runtime polimorfizam s višerazinskim nasljeđivanjem

Pogledajmo jednostavan primjer polimorfizma vremena izvođenja s nasljeđivanjem na više razina.

c niz nizova
 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(); } } 
Testirajte sada

Izlaz:

 eating eating fruits drinking Milk 

Pokušajte za izlaz

 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(); }} 
Testirajte sada

Izlaz:

 Dog is eating 

Budući da BabyDog ne nadjačava metodu eat(), stoga se poziva metoda eat() klase Dog.