Polimorfizmus Java nyelven olyan fogalom, amellyel elvégezhetjük a egyetlen művelet különböző módokon . A polimorfizmus 2 görög szóból származik: poly és morphs. A „poly” szó jelentése sok, a „morfok” pedig formákat jelent. Tehát a polimorfizmus sokféle formát jelent.
A Java-ban kétféle polimorfizmus létezik: fordítási idejű polimorfizmus és futásidejű polimorfizmus. Javaban polimorfizmust hajthatunk végre metódus túlterheléssel és módszer felülbírálással.
Ha túlterhel egy statikus metódust Java-ban, akkor ez a fordítási idő polimorfizmusának példája. Itt a java futásidejű polimorfizmusára fogunk összpontosítani.
Futásidejű polimorfizmus Java nyelven
Futásidejű polimorfizmus vagy Dinamikus módszer-küldés egy olyan folyamat, amelyben egy felülírt metódus hívása futási időben, nem pedig fordítási időben oldódik meg.
Ebben a folyamatban egy felülírt metódus hívódik meg egy szuperosztály referenciaváltozóján keresztül. A meghívandó metódus meghatározása a referenciaváltozó által hivatkozott objektumon alapul.
Először értsük meg a futásidejű polimorfizmus előtti feltöltést.
Upcasting
Ha a Parent osztály referenciaváltozója a Child osztály objektumára hivatkozik, azt upcastingnak nevezzük. Például:
class A{} class B extends A{}
A a=new B();//upcasting
Az upcastinghoz használhatjuk az osztály típusú referenciaváltozót vagy egy interfész típust. Például:
interface I{} class A{} class B extends A implements I{}
Itt a B osztály kapcsolata a következő lenne:
B IS-A A B IS-A I B IS-A Object
Mivel az Object a Java összes osztályának gyökérosztálya, így B IS-A Object-et írhatunk.
Példa a Java futásidejű polimorfizmusra
Ebben a példában két osztályt hozunk létre: Bike és Splendor. A Splendor osztály kiterjeszti a Bike osztályt, és felülírja a run() metódust. A futtatási metódust a Parent osztály referenciaváltozójával hívjuk meg. Mivel az alosztály objektumra hivatkozik, és az alosztály metódus felülírja a szülő osztály metódust, az alosztály metódus futás közben kerül meghívásra.
Mivel a metódushívást a JVM, nem pedig a fordító határozza meg, futásidejű polimorfizmusnak nevezik.
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(); } }Tesztelje most
Kimenet:
running safely with 60km.
Java futásidejű polimorfizmus példa: Bank
Vegyünk egy olyan forgatókönyvet, ahol a Bank egy olyan osztály, amely módszert biztosít a kamatláb meghatározására. A kamat mértéke azonban bankonként eltérő lehet. Például az SBI, ICICI és AXIS bankok 8,4%, 7,3% és 9,7% kamatlábat biztosítanak.
Megjegyzés: Ez a példa a metódus felülírásánál is szerepel, de nem volt feltöltés.
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()); } }Tesztelje most
Kimenet:
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
Java futásidejű polimorfizmus Példa: Alakzat
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(); } }Tesztelje most
Kimenet:
drawing rectangle... drawing circle... drawing triangle...
Java futásidejű polimorfizmus példa: Állat
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(); }}Tesztelje most
Kimenet:
eating bread... eating rat... eating meat...
Java futásidejű polimorfizmus adattaggal
Egy metódus van felülírva, nem az adattagok, így a futásidejű polimorfizmust az adattagok nem tudják elérni.
Az alábbi példában mindkét osztály rendelkezik adattag sebességkorláttal. Az adattagot a Parent osztály referenciaváltozójával érjük el, amely az alosztály objektumra hivatkozik. Mivel az adattaghoz férünk hozzá, amely nincs felülírva, ezért mindig a Szülő osztály adattagjához fog hozzáférni.
Szabály: A futásidejű polimorfizmust az adattagok nem tudják elérni.
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 } }Tesztelje most
Kimenet:
90
Java futásidejű polimorfizmus többszintű öröklődéssel
Lássuk a futásidejű polimorfizmus egyszerű példáját többszintű öröklődéssel.
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(); } }Tesztelje most
Kimenet:
eating eating fruits drinking Milk
Próbáld ki a kimenetet
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(); }}Tesztelje most
Kimenet:
Dog is eating
Mivel a BabyDog nem írja felül az eat() metódust, ezért a Dog osztály eat() metódusa meghívásra kerül.