logo

Polymorfisme i Java

Polymorfisme i Java er et konsept som vi kan utføre en enkelt handling på forskjellige måter . Polymorfisme er avledet fra 2 greske ord: poly og morphs. Ordet 'poly' betyr mange og 'morfer' betyr former. Så polymorfisme betyr mange former.

Det er to typer polymorfisme i Java: kompileringstidspolymorfisme og kjøretidspolymorfisme. Vi kan utføre polymorfi i java ved metodeoverbelastning og metodeoverstyring.

Hvis du overbelaster en statisk metode i Java, er det eksempelet på kompileringstidspolymorfisme. Her vil vi fokusere på runtime polymorfisme i java.


Runtime Polymorphism i Java

Runtime polymorfisme eller Dynamisk metodeutsendelse er en prosess der et kall til en overstyrt metode løses under kjøring i stedet for kompileringstid.

I denne prosessen kalles en overstyrt metode gjennom referansevariabelen til en superklasse. Bestemmelsen av metoden som skal kalles er basert på at objektet refereres til av referansevariabelen.

La oss først forstå upcastingen før Runtime Polymorphism.

smtp Internett-protokoll

Upcasting

Hvis referansevariabelen til Parent-klassen refererer til objektet til Child-klassen, er den kjent som upcasting. For eksempel:

Oppsending i Java
 class A{} class B extends A{} 
 A a=new B();//upcasting 

For upcasting kan vi bruke referansevariabelen for klassetype eller en grensesnitttype. For eksempel:

sletting fra et binært søketre
 interface I{} class A{} class B extends A implements I{} 

Her vil forholdet til B-klasse være:

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

Siden Object er rotklassen til alle klasser i Java, så kan vi skrive B IS-A Object.


Eksempel på Java Runtime Polymorphism

I dette eksemplet lager vi to klasser Bike og Splendor. Splendor-klassen utvider Bike-klassen og overstyrer dens run()-metode. Vi kaller kjøremetoden ved referansevariabelen til Parent-klassen. Siden det refererer til underklasseobjektet og underklassemetoden overstyrer Parent-klassemetoden, påkalles underklassemetoden ved kjøring.

Siden metodeanrop bestemmes av JVM ikke kompilatoren, er det kjent som runtime polymorfisme.

 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(); } } 
Test det nå

Produksjon:

 running safely with 60km. 

Java Runtime Polymorphism Eksempel: Bank

Tenk på et scenario der Bank er en klasse som gir en metode for å få rentesatsen. Imidlertid kan rentesatsen variere fra bank til bank. For eksempel gir SBI-, ICICI- og AXIS-banker 8,4 %, 7,3 % og 9,7 % rente.

Java Runtime Polymorphism eksempel på bank

Merk: Dette eksemplet er også gitt i metodeoverstyring, men det var ingen oppkasting.

 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()); } } 
Test det nå

Produksjon:

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

Java Runtime Polymorphism Eksempel: 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(); } } 
Test det nå

Produksjon:

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

Java Runtime Polymorphism Eksempel: Dyr

 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(); }} 
Test det nå

Produksjon:

rund matematikk java
 eating bread... eating rat... eating meat... 

Java Runtime Polymorphism med Data Member

En metode overstyres, ikke datamedlemmene, så kjøretidspolymorfisme kan ikke oppnås av datamedlemmer.

I eksemplet nedenfor har begge klassene en hastighetsgrense for datamedlemmer. Vi får tilgang til datamedlemmet med referansevariabelen til Parent-klassen som refererer til subklasseobjektet. Siden vi får tilgang til datamedlemmet som ikke er overstyrt, vil det derfor alltid få tilgang til datamedlemmet i foreldreklassen.

Regel: Kjøretidspolymorfisme kan ikke oppnås av datamedlemmer.

 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 } } 
Test det nå

Produksjon:

 90 

Java Runtime Polymorphism med Multilevel Inheritance

La oss se det enkle eksemplet på Runtime Polymorphism med flernivåarv.

matematikk.tilfeldig java
 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(); } } 
Test det nå

Produksjon:

 eating eating fruits drinking Milk 

Prøv for utgang

 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(); }} 
Test det nå

Produksjon:

 Dog is eating 

Siden BabyDog ikke overstyrer eat()-metoden, så blir eat()-metoden i Dog-klassen påkalt.