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:
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 %.
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.