logo

Polymorfi i Java

Polymorfi i Java er et koncept, som vi kan udføre en enkelt handling på forskellige måder . Polymorfi er afledt af 2 græske ord: poly og morfer. Ordet 'poly' betyder mange og 'morfer' betyder former. Så polymorfi betyder mange former.

Der er to typer polymorfi i Java: kompileringstidspolymorfi og runtime polymorfi. Vi kan udføre polymorfi i java ved metodeoverbelastning og metodeoverstyring.

Hvis du overbelaster en statisk metode i Java, er det eksemplet på kompileringstidspolymorfi. Her vil vi fokusere på runtime polymorfi i java.


Runtime Polymorphism i Java

Runtime polymorfi eller Dynamisk metodeafsendelse er en proces, hvor et kald til en tilsidesat metode løses ved kørsel i stedet for kompileringstid.

I denne proces kaldes en tilsidesat metode gennem referencevariablen for en superklasse. Bestemmelsen af ​​den metode, der skal kaldes, er baseret på, at objektet henvises til af referencevariablen.

Lad os først forstå upcastingen før Runtime Polymorphism.

smtp internet protokol

Upcasting

Hvis referencevariablen i Parent-klassen refererer til objektet i Child-klassen, er det kendt som upcasting. For eksempel:

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

Til upcasting kan vi bruge referencevariablen af ​​klassetype eller en grænsefladetype. For eksempel:

download youtube videoer vlc
 interface I{} class A{} class B extends A implements I{} 

Her ville forholdet mellem B-klasse være:

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

Da Object er rodklassen af ​​alle klasser i Java, så kan vi skrive B IS-A Object.


Eksempel på Java Runtime Polymorphism

I dette eksempel opretter vi to klasser Bike og Splendor. Splendor-klassen udvider Bike-klassen og tilsidesætter dens run()-metode. Vi kalder kørselsmetoden ved referencevariablen i forældreklassen. Da det refererer til underklasseobjektet, og underklassemetoden tilsidesætter Parent-klassemetoden, påkaldes underklassemetoden ved kørsel.

Da metodeankaldelse bestemmes af JVM ikke compileren, er det kendt som runtime polymorphism.

 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 nu

Produktion:

 running safely with 60km. 

Java Runtime Polymorphism Eksempel: Bank

Overvej et scenario, hvor Bank er en klasse, der giver en metode til at få rentesatsen. Rentesatsen kan dog variere afhængigt af bankerne. For eksempel giver SBI-, ICICI- og AXIS-bankerne 8,4 %, 7,3 % og 9,7 % rente.

Java Runtime Polymorphism eksempel på bank

Bemærk: Dette eksempel er også givet i metodetilsidesættelse, men der var ingen upcasting.

 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 nu

Produktion:

 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 nu

Produktion:

 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 nu

Produktion:

polymorfi java
 eating bread... eating rat... eating meat... 

Java Runtime Polymorphism med Data Member

En metode tilsidesættes, ikke datamedlemmerne, så runtime polymorfi kan ikke opnås af datamedlemmer.

I eksemplet nedenfor har begge klasser en datamedlemshastighedsgrænse. Vi får adgang til datamedlemmet ved hjælp af referencevariablen fra Parent-klassen, som refererer til underklasseobjektet. Da vi tilgår datamedlemmet, som ikke er tilsidesat, vil det derfor altid få adgang til datamedlemmet i forældreklassen.

Regel: Runtime polymorfi kan ikke opnås af 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 nu

Produktion:

 90 

Java Runtime Polymorphism med Multilevel Inheritance

Lad os se det enkle eksempel på Runtime Polymorphism med multilevel arv.

edith mack hirsch
 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 nu

Produktion:

 eating eating fruits drinking Milk 

Prøv for output

 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 nu

Produktion:

 Dog is eating 

Da BabyDog ikke tilsidesætter eat()-metoden, så eat()-metoden i Dog-klassen påkaldes.