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