logo

Polymorfizmus v Jave

Polymorfizmus v Jave je koncept, pomocou ktorého môžeme vykonávať a jedna akcia rôznymi spôsobmi . Polymorfizmus je odvodený z 2 gréckych slov: poly a morphs. Slovo „poly“ znamená veľa a „morfy“ znamenajú formy. Polymorfizmus teda znamená mnoho foriem.

V Jave existujú dva typy polymorfizmu: polymorfizmus v čase kompilácie a polymorfizmus v čase behu. Polymorfizmus v jave môžeme vykonať preťažením metódy a prepísaním metódy.

Ak preťažíte statickú metódu v Jave, je to príklad polymorfizmu času kompilácie. Tu sa zameriame na runtime polymorfizmus v jave.


Runtime Polymorphism v Jave

Runtime polymorfizmus alebo Dynamická metóda odoslania je proces, v ktorom sa volanie prepísanej metódy rieši skôr za behu ako počas kompilácie.

ako zistiť veľkosť displeja

V tomto procese sa cez referenčnú premennú nadtriedy volá prepísaná metóda. Určenie metódy, ktorá sa má volať, je založené na objekte, na ktorý odkazuje referenčná premenná.

Poďme najprv pochopiť upcasting pred Runtime Polymorphism.

Upcasting

Ak sa referenčná premenná triedy Parent odkazuje na objekt triedy Child, nazýva sa to upcasting. Napríklad:

Upcasting v Jave
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Pre upcasting môžeme použiť referenčnú premennú typu triedy alebo typu rozhrania. Napríklad:

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

Tu by vzťah triedy B bol:

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

Keďže Object je koreňovou triedou všetkých tried v Jave, môžeme písať B IS-A Object.

slučka java do while

Príklad polymorfizmu Java Runtime

V tomto príklade vytvárame dve triedy Bike a Splendor. Trieda Splendor rozširuje triedu Bike a prepisuje jej metódu run(). Voláme metódu run pomocou referenčnej premennej triedy Parent. Keďže odkazuje na objekt podtriedy a metóda podtriedy prepíše metódu triedy Parent, metóda podtriedy sa vyvolá za behu.

Keďže vyvolanie metódy je určené JVM, nie kompilátorom, je známe ako runtime polymorfizmus.

 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(); } } 
Vyskúšajte to

Výkon:

 running safely with 60km. 

Polymorfizmus Java Runtime Príklad: Banka

Zvážte scenár, v ktorom je banka triedou, ktorá poskytuje metódu na získanie úrokovej sadzby. Úroková sadzba sa však môže v jednotlivých bankách líšiť. Napríklad banky SBI, ICICI a AXIS poskytujú úrokovú sadzbu 8,4 %, 7,3 % a 9,7 %.

Príklad bankového polymorfizmu Java Runtime Polymorphism

Poznámka: Tento príklad je uvedený aj pri prepisovaní metódy, ale nedochádzalo k žiadnemu prenosu.

 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()); } } 
Vyskúšajte to

Výkon:

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

Príklad polymorfizmu Java Runtime: Shape

 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(); } } 
Vyskúšajte to

Výkon:

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

Polymorfizmus Java Runtime Príklad: Zviera

 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(); }} 
Vyskúšajte to

Výkon:

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

Polymorfizmus Java Runtime s dátovým členom

Prepíše sa metóda, nie dátové členy, takže dátovými členmi nemožno dosiahnuť polymorfizmus za behu.

V príklade uvedenom nižšie majú obe triedy rýchlostný limit dátového člena. K dátovému členu pristupujeme pomocou referenčnej premennej triedy Parent, ktorá odkazuje na objekt podtriedy. Keďže pristupujeme k dátovému členu, ktorý nie je prepísaný, bude teda vždy pristupovať k dátovému členu triedy Parent.

Pravidlo: Dátovými členmi nemožno dosiahnuť polymorfizmus za behu.

 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 } } 
Vyskúšajte to

Výkon:

 90 

Polymorfizmus Java Runtime s viacúrovňovou dedičnosťou

Pozrime sa na jednoduchý príklad Runtime Polymorphism s viacúrovňovou dedičnosťou.

unsigned int c programovanie
 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(); } } 
Vyskúšajte to

Výkon:

 eating eating fruits drinking Milk 

Skúste pre výstup

 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(); }} 
Vyskúšajte to

Výkon:

 Dog is eating 

Keďže BabyDog nenahrádza metódu eat(), vyvolá sa metóda eat() triedy Dog.