Polymorfism i Java är ett koncept som vi kan utföra en enstaka åtgärder på olika sätt . Polymorfism kommer från 2 grekiska ord: poly och morphs. Ordet 'poly' betyder många och 'morphs' betyder former. Så polymorfism betyder många former.
Det finns två typer av polymorfism i Java: kompileringspolymorfism och runtime polymorfism. Vi kan utföra polymorfism i java genom metodöverbelastning och metodöverstyrning.
Om du överbelasta en statisk metod i Java är det exemplet på kompileringstidspolymorfism. Här kommer vi att fokusera på runtime polymorfism i java.
Runtime Polymorphism i Java
Runtime polymorfism eller Dynamisk metodsändning är en process där ett anrop till en åsidosatt metod löses vid körning snarare än vid kompilering.
I denna process anropas en åsidosatt metod genom referensvariabeln för en superklass. Bestämningen av metoden som ska anropas baseras på att objektet refereras till av referensvariabeln.
Låt oss först förstå uppsändningen före Runtime Polymorphism.
Uppsändning
Om referensvariabeln för klassen Parent refererar till objektet i klassen Child kallas det för upcasting. Till exempel:
class A{} class B extends A{}
A a=new B();//upcasting
För uppsändning kan vi använda referensvariabeln av klasstyp eller en gränssnittstyp. Till exempel:
interface I{} class A{} class B extends A implements I{}
Här skulle förhållandet mellan B-klass vara:
B IS-A A B IS-A I B IS-A Object
Eftersom Object är rotklassen för alla klasser i Java, så kan vi skriva B IS-A Object.
Exempel på Java Runtime Polymorphism
I det här exemplet skapar vi två klasser Bike och Splendor. Splendor-klassen utökar Bike-klassen och åsidosätter dess run()-metod. Vi anropar körmetoden av referensvariabeln för Parent-klassen. Eftersom det hänvisar till underklassobjektet och underklassmetoden åsidosätter den överordnade klassmetoden, anropas underklassmetoden vid körning.
Eftersom metodanrop bestäms av JVM inte kompilatorn, är det känt 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(); } }Testa det nu
Produktion:
running safely with 60km.
Java Runtime Polymorphism Exempel: Bank
Tänk på ett scenario där Bank är en klass som tillhandahåller en metod för att få räntan. Räntesatsen kan dock variera beroende på bank. Till exempel ger bankerna SBI, ICICI och AXIS 8,4 %, 7,3 % och 9,7 % ränta.
Obs: Det här exemplet ges också i metodöverstyrning, men det fanns ingen uppsändning.
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()); } }Testa det nu
Produktion:
SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7
Java Runtime Polymorphism Exempel: 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(); } }Testa det nu
Produktion:
drawing rectangle... drawing circle... drawing triangle...
Java Runtime Polymorphism Exempel: Djur
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(); }}Testa det nu
Produktion:
eating bread... eating rat... eating meat...
Java Runtime Polymorphism med Data Member
En metod åsidosätts, inte datamedlemmarna, så körtidspolymorfism kan inte uppnås av datamedlemmar.
I exemplet nedan har båda klasserna en hastighetsgräns för datamedlemmar. Vi kommer åt datamedlemmen genom referensvariabeln för Parent class som refererar till subklassobjektet. Eftersom vi har åtkomst till datamedlemmen som inte åsidosätts, kommer den därför alltid åtkomst till datamedlemmen i Parent-klassen.
Regel: Körtidspolymorfism kan inte uppnås av datamedlemmar.
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 } }Testa det nu
Produktion:
90
Java Runtime Polymorphism med Multilevel Arv
Låt oss se det enkla exemplet på Runtime Polymorphism med multilevel arv.
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(); } }Testa det nu
Produktion:
eating eating fruits drinking Milk
Försök med 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(); }}Testa det nu
Produktion:
Dog is eating
Eftersom BabyDog inte åsidosätter eat()-metoden, så eat()-metoden i klassen Dog anropas.
arrayer java