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:
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.
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.