logo

Polimorfizem v Javi

Polimorfizem v Javi je koncept, s katerim lahko izvedemo a eno dejanje na različne načine . Polimorfizem izhaja iz dveh grških besed: poly in morphs. Beseda 'poli' pomeni veliko in 'morfi' pomeni oblike. Polimorfizem torej pomeni veliko oblik.

V Javi obstajata dve vrsti polimorfizma: polimorfizem med prevajanjem in polimorfizem med izvajanjem. Polimorfizem v Javi lahko izvedemo s preobremenitvijo metode in preglasitvijo metode.

Če preobremenite statično metodo v Javi, je to primer polimorfizma časa prevajanja. Tu se bomo osredotočili na polimorfizem izvajalnega časa v Javi.


Polimorfizem izvajalnega okolja v Javi

Polimorfizem izvajalnega časa oz Pošiljanje dinamične metode je proces, v katerem je klic preglasene metode razrešen med izvajanjem in ne med prevajanjem.

V tem procesu se prek referenčne spremenljivke nadrazreda kliče preglasena metoda. Določitev metode, ki jo je treba poklicati, temelji na predmetu, na katerega se sklicuje referenčna spremenljivka.

Najprej razumemo pretvorbo navzgor pred polimorfizmom izvajalnega okolja.

Prevajanje navzgor

Če se referenčna spremenljivka razreda Parent nanaša na objekt razreda Child, je to znano kot upcasting. Na primer:

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

Za pretvorbo navzgor lahko uporabimo referenčno spremenljivko tipa razreda ali tipa vmesnika. Na primer:

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

Tukaj bi bilo razmerje razreda B:

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

Ker je Object korenski razred vseh razredov v Javi, lahko zapišemo B JE-A Object.


Primer polimorfizma izvajalnega okolja Java

V tem primeru ustvarjamo dva razreda Bike in Splendor. Razred Splendor razširi razred Bike in preglasi njegovo metodo run(). Metodo run kličemo z referenčno spremenljivko razreda Parent. Ker se nanaša na predmet podrazreda in metoda podrazreda preglasi metodo nadrejenega razreda, se metoda podrazreda prikliče med izvajanjem.

Ker priklic metode določa JVM in ne prevajalnik, je znan kot polimorfizem izvajalnega okolja.

 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(); } } 
Preizkusite zdaj

Izhod:

 running safely with 60km. 

Primer polimorfizma izvajalnega okolja Java: banka

Razmislite o scenariju, kjer je banka razred, ki zagotavlja metodo za pridobitev obrestne mere. Vendar se obrestna mera lahko razlikuje glede na banko. Na primer, banke SBI, ICICI in AXIS zagotavljajo 8,4 %, 7,3 % in 9,7 % obrestno mero.

Primer banke izvajalnega polimorfizma Java

Opomba: Ta primer je podan tudi pri preglasitvi metode, vendar ni bilo pretvorbe navzgor.

 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()); } } 
Preizkusite zdaj

Izhod:

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

Primer polimorfizma izvajalnega okolja Java: oblika

 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(); } } 
Preizkusite zdaj

Izhod:

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

Primer polimorfizma izvajalnega okolja Java: žival

 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(); }} 
Preizkusite zdaj

Izhod:

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

Polimorfizem izvajalnega okolja Java s podatkovnim članom

Preglasi se metoda, ne podatkovni člani, zato podatkovni člani ne morejo doseči polimorfizma izvajalnega časa.

V spodnjem primeru imata oba razreda omejitev hitrosti podatkovnega člana. Do podatkovnega člana dostopamo z referenčno spremenljivko Nadrejenega razreda, ki se nanaša na objekt podrazreda. Ker dostopamo do podatkovnega člana, ki ni preglasen, bo zato vedno dostopal do podatkovnega člana razreda Parent.

Pravilo: podatkovni člani ne morejo doseči polimorfizma izvajalnega okolja.

 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 } } 
Preizkusite zdaj

Izhod:

 90 

Polimorfizem izvajalnega okolja Java z večnivojskim dedovanjem

Oglejmo si preprost primer izvajalnega polimorfizma z večnivojskim dedovanjem.

 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(); } } 
Preizkusite zdaj

Izhod:

niz bajtov v niz
 eating eating fruits drinking Milk 

Poskusi za izhod

 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(); }} 
Preizkusite zdaj

Izhod:

 Dog is eating 

Ker BabyDog ne preglasi metode eat(), zato se prikliče metoda eat() razreda Dog.