logo

Polimorfizmus Java nyelven

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:

Upcasting Java nyelven
 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.

Java Runtime Polymorphism példa bankra

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.