logo

Polymorfisme op Java

Polymorfisme op Java is een concept waarmee we a kunnen uitvoeren enkele actie op verschillende manieren . Polymorfisme is afgeleid van 2 Griekse woorden: poly en morphs. Het woord 'poly' betekent veel en 'morphs' betekent vormen. Polymorfisme betekent dus vele vormen.

Er zijn twee soorten polymorfisme in Java: polymorfisme tijdens het compileren en runtime-polymorfisme. We kunnen polymorfisme in Java uitvoeren door methode-overbelasting en methode-overschrijving.

Als u een statische methode in Java overbelast, is dit het voorbeeld van polymorfisme tijdens het compileren. Hier zullen we ons concentreren op runtime-polymorfisme in Java.


Runtime-polymorfisme in Java

Runtime-polymorfisme of Dynamische methodeverzending is een proces waarbij een aanroep naar een overschreven methode tijdens runtime wordt opgelost in plaats van tijdens het compileren.

onderstrepen in afwaardering

In dit proces wordt een overschreven methode aangeroepen via de referentievariabele van een superklasse. De bepaling van de aan te roepen methode is gebaseerd op het object waarnaar de referentievariabele verwijst.

Laten we eerst de upcasting vóór Runtime Polymorphism begrijpen.

Upcasten

Als de referentievariabele van de klasse Parent verwijst naar het object van de klasse Child, wordt dit upcasting genoemd. Bijvoorbeeld:

Upcasten op Java
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Voor upcasting kunnen we de referentievariabele van het klassetype of een interfacetype gebruiken. Bijvoorbeeld:

 interface I{} class A{} class B extends A implements I{} 

Hier zou de relatie van klasse B zijn:

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

Omdat Object de hoofdklasse is van alle klassen in Java, kunnen we B IS-A Object schrijven.


Voorbeeld van Java Runtime-polymorfisme

In dit voorbeeld maken we twee klassen Bike en Splendor. De Splendor-klasse breidt de Bike-klasse uit en overschrijft de run()-methode. We roepen de run-methode aan met de referentievariabele van de Parent-klasse. Omdat het verwijst naar het subklasseobject en de subklassemethode de bovenliggende klassemethode overschrijft, wordt de subklassemethode tijdens runtime aangeroepen.

Omdat de aanroep van de methode wordt bepaald door de JVM en niet door de compiler, staat dit bekend als 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 het nu

Uitgang:

 running safely with 60km. 

Java Runtime Polymorfisme Voorbeeld: Bank

Beschouw een scenario waarin Bank een klasse is die een methode biedt om de rentevoet te verkrijgen. Het rentepercentage kan echter per bank verschillen. De SBI-, ICICI- en AXIS-banken bieden bijvoorbeeld rentetarieven van 8,4%, 7,3% en 9,7%.

Java Runtime Polymorfisme voorbeeld van bank

Opmerking: dit voorbeeld wordt ook gegeven bij het overschrijven van methoden, maar er was geen 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 het nu

Uitgang:

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

Java Runtime Polymorfisme Voorbeeld: Vorm

 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 het nu

Uitgang:

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

Java Runtime Polymorfisme Voorbeeld: Dier

 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 het nu

Uitgang:

 eating bread... eating rat... eating meat... 

Java Runtime Polymorfisme met gegevenslid

Een methode wordt overschreven, niet de gegevensleden, dus runtime-polymorfisme kan niet worden bereikt door gegevensleden.

In het onderstaande voorbeeld hebben beide klassen een snelheidslimiet voor dataleden. We hebben toegang tot het gegevenslid via de referentievariabele van de Parent-klasse die verwijst naar het subklasse-object. Omdat we toegang hebben tot het gegevenslid dat niet wordt overschreven, heeft het altijd toegang tot het gegevenslid van de Parent-klasse.

Regel: Runtime-polymorfisme kan niet worden bereikt door gegevensleden.

 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 het nu

Uitgang:

 90 

Java Runtime-polymorfisme met overerving op meerdere niveaus

Laten we eens kijken naar het eenvoudige voorbeeld van Runtime-polymorfisme met overerving op meerdere niveaus.

 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 het nu

Uitgang:

 eating eating fruits drinking Milk 

Probeer voor uitvoer

 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 het nu

Uitgang:

 Dog is eating 

Omdat BabyDog de methode eat() niet overschrijft, wordt de methode eat() van de klasse Dog aangeroepen.