logo

Polimorfismo in Java

Polimorfismo in Java è un concetto mediante il quale possiamo eseguire a singola azione in modi diversi . Il polimorfismo deriva da 2 parole greche: poly e morphs. La parola 'poli' significa molti e 'morfosi' significa forme. Quindi polimorfismo significa molte forme.

Esistono due tipi di polimorfismo in Java: polimorfismo in fase di compilazione e polimorfismo in fase di esecuzione. Possiamo eseguire il polimorfismo in Java mediante sovraccarico del metodo e override del metodo.

ottieni la lunghezza dell'array in c

Se sovraccarichi un metodo statico in Java, è l'esempio del polimorfismo in fase di compilazione. Qui ci concentreremo sul polimorfismo di runtime in Java.


Polimorfismo runtime in Java

Polimorfismo di runtime O Invio del metodo dinamico è un processo in cui una chiamata a un metodo sottoposto a override viene risolta in fase di esecuzione anziché in fase di compilazione.

In questo processo, un metodo sottoposto a override viene chiamato tramite la variabile di riferimento di una superclasse. La determinazione del metodo da chiamare si basa sull'oggetto a cui fa riferimento la variabile di riferimento.

Comprendiamo prima l'upcasting prima del polimorfismo di runtime.

Upcasting

Se la variabile di riferimento della classe Parent si riferisce all'oggetto della classe Child, è noto come upcasting. Per esempio:

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

Per l'upcasting, possiamo utilizzare la variabile di riferimento del tipo di classe o del tipo di interfaccia. Per esempio:

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

Qui, la relazione della classe B sarebbe:

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

Poiché Object è la classe radice di tutte le classi in Java, possiamo scrivere B IS-A Object.

coppia C++

Esempio di polimorfismo Java Runtime

In questo esempio, stiamo creando due classi Bike e Splendor. La classe Splendor estende la classe Bike e sovrascrive il suo metodo run(). Stiamo chiamando il metodo run tramite la variabile di riferimento della classe Parent. Poiché si riferisce all'oggetto della sottoclasse e il metodo della sottoclasse sovrascrive il metodo della classe Parent, il metodo della sottoclasse viene richiamato in fase di esecuzione.

Poiché l'invocazione del metodo è determinata dalla JVM e non dal compilatore, è nota come polimorfismo di runtime.

 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(); } } 
Provalo adesso

Produzione:

percorso impostato in Java
 running safely with 60km. 

Esempio di polimorfismo Java Runtime: Bank

Consideriamo uno scenario in cui Bank è una classe che fornisce un metodo per ottenere il tasso di interesse. Tuttavia, il tasso di interesse può variare a seconda delle banche. Ad esempio, le banche SBI, ICICI e AXIS offrono tassi di interesse dell'8,4%, 7,3% e 9,7%.

Esempio di polimorfismo Java Runtime di bank

Nota: questo esempio viene fornito anche nell'override del metodo ma non è stato effettuato l'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()); } } 
Provalo adesso

Produzione:

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

Esempio di polimorfismo Java Runtime: forma

 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(); } } 
Provalo adesso

Produzione:

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

Esempio di polimorfismo runtime Java: animale

 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(); }} 
Provalo adesso

Produzione:

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

Polimorfismo Java Runtime con membro dati

Viene eseguito l'override di un metodo, non dei membri dati, quindi il polimorfismo di runtime non può essere ottenuto dai membri dati.

Nell'esempio riportato di seguito, entrambe le classi hanno uno speedlimit del membro dati. Stiamo accedendo al membro dati tramite la variabile di riferimento della classe Parent che si riferisce all'oggetto sottoclasse. Poiché stiamo accedendo al membro dati che non è sovrascritto, quindi accederà sempre al membro dati della classe Parent.

Regola: il polimorfismo di runtime non può essere ottenuto dai membri dati.

 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 } } 
Provalo adesso

Produzione:

 90 

Polimorfismo Java Runtime con ereditarietà multilivello

Vediamo il semplice esempio di Runtime Polymorphism con ereditarietà multilivello.

dimensioni del testo in lattice
 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(); } } 
Provalo adesso

Produzione:

 eating eating fruits drinking Milk 

Prova per l'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(); }} 
Provalo adesso

Produzione:

 Dog is eating 

Poiché BabyDog non sovrascrive il metodo eat(), viene richiamato il metodo eat() della classe Dog.