Polimorfismo dentro Java (Statico e Dinamico)

⚡ Riepilogo intelligente

Polimorfismo dentro Java Consente a un'unica interfaccia di rappresentare molteplici forme, in modo che un singolo nome di metodo si comporti in modo diverso nelle classi correlate. È un pilastro della progettazione orientata agli oggetti che promuove la flessibilità, il riutilizzo del codice e l'estensione pulita dei sistemi legacy bancari, medici e aziendali.

  • 🎭 Molte forme, un solo nome: Polimorfismo dentro Java Consente allo stesso nome di metodo di essere indirizzato a implementazioni diverse in base al tipo di oggetto effettivo al momento dell'esecuzione.
  • 🔀 Due gusti: Il polimorfismo in fase di compilazione utilizza l'overloading dei metodi, mentre il polimorfismo in fase di esecuzione utilizza l'override dei metodi tramite l'ereditarietà e la JVM.
  • Legame statico vs legame dinamico: Le chiamate sovraccaricate vengono risolte in fase di compilazione tramite binding statico, mentre le chiamate sovrascritte vengono risolte in fase di esecuzione tramite binding dinamico.
  • Potere delle parole chiave: La parola chiave `super` consente a una sottoclasse di richiamare l'implementazione della classe padre prima di aggiungere il proprio comportamento specializzato.
  • 🧪 Portata reale: I conti bancari, le gerarchie del personale ospedaliero e i motori di rendering delle forme si basano tutti sul polimorfismo per gestire nuove esigenze senza compromettere il codice testato.

Polimorfismo dentro Java

In cosa consiste il polimorfismo Java?

Polimorfismo dentro Java Si verifica quando una o più classi o oggetti sono correlati tra loro tramite l'ereditarietà. È la capacità di un oggetto di assumere molteplici forme. L'ereditarietà consente agli utenti di ereditare attributi e metodi, e il polimorfismo utilizza questi metodi per svolgere compiti diversi. L'obiettivo è la comunicazione, sebbene l'approccio possa variare.

Ad esempio, uno smartphone viene utilizzato per comunicare. La modalità di comunicazione può essere una chiamata, un messaggio di testo, un messaggio con immagini o un'e-mail. L'obiettivo è comune, ovvero comunicare, ma l'approccio è diverso. Questo comportamento è l'essenza di PolimorfismoOra impareremo il polimorfismo in Java con esempi di codice, diagrammi e spiegazioni dettagliate passo passo.

Clicchi Qui. se il video non è accessibile

Perché utilizzare il polimorfismo in Java?

Polimorfismo dentro Java Questo schema viene utilizzato perché rende il codice flessibile, riutilizzabile e più facile da manutenere. Una singola variabile di riferimento di un tipo padre può puntare a diversi oggetti figli, quindi la stessa chiamata si adatta a qualsiasi sottoclasse venga fornita. Questo schema mantiene il codice testato inalterato mentre vengono aggiunti nuovi comportamenti tramite sottoclassi specializzate, ed è proprio per questo che framework come Spring e Jakarta EE ne fanno uso.

Java Polimorfismo negli OOP con esempio

Consideriamo una classe genitore denominata Account con funzioni per deposito e prelievo. La classe Account ha due classi figlie. L'operazione di deposito e prelievo è la stessa per i conti di risparmio e i conti correnti, quindi i metodi ereditati dalla classe Account funzioneranno.

Eredità unica in Java

Java Esempio di polimorfismo

Modifica dei requisiti software

C'è una modifica nella specifica dei requisiti, cosa comune nel settore del software. La funzionalità per un conto bancario privilegiato con possibilità di scoperto deve essere aggiunta. Lo scoperto è una funzionalità che consente a un cliente di prelevare un importo superiore al saldo disponibile sul conto. Il metodo di prelievo per il conto privilegiato necessita di una nuova implementazione, mentre il codice testato nei conti di risparmio e correnti rimane invariato. Questo isolamento è il vantaggio di OOPS.

Java Polimorfismo

Passo 1) Quando viene richiamato il metodo di prelievo per il conto di risparmio, viene eseguito il metodo definito nella classe padre Account.

Java Polimorfismo

Passo 2) Quando viene chiamato il metodo di prelievo per il conto privilegiato (facilità di scoperto), viene eseguito il metodo di prelievo definito nella classe privilegiata. Questo dispatch è Polimorfismo nella programmazione orientata agli oggetti.

Java Polimorfismo

Metodo Override in Java

L'override dei metodi è il processo di ridefinizione di un metodo della superclasse all'interno di una sottoclasse. La sottoclasse mantiene lo stesso comportamento.tract, ma fornisce una nuova implementazione che viene selezionata all'avvio del programma.

Regole per la sostituzione del metodo

  • La firma del metodo, ovvero il nome del metodo, l'elenco dei parametri e il tipo di ritorno, deve corrispondere esattamente.
  • Il metodo sovrascritto può ampliare l'accessibilità, ma non può restringerla. Se il metodo è privato nella classe base, la classe derivata può renderlo pubblico, ma non viceversa.

Regole per l'override del metodo in Java

Esempio

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
class Run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor();
    // treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient method in class Surgeon will be executed
    surgeonObj.treatPatient();
  }
}

Differenza tra sovraccarico del metodo e override del metodo

L'overloading dei metodi si verifica all'interno della stessa classe con lo stesso nome di metodo ma con firme diverse. L'override dei metodi si verifica tra classi padre e figlio, dove la sottoclasse ridefinisce un metodo dichiarato nella superclasse.

Sovraccarico del metodo
Sostituzione del metodo Method
L'overloading dei metodi si verifica nella stessa classe, dove più di un metodo ha lo stesso nome ma firme diverse. L'override di un metodo si verifica quando uno dei metodi della superclasse viene ridefinito nella sottoclasse. In questo caso, la firma del metodo rimane invariata.
Es:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
Es:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
    //signature is same
 }
}

Cos'è il polimorfismo dinamico?

Il polimorfismo dinamico nella programmazione orientata agli oggetti (OOP) è il meccanismo che permette di definire più metodi con lo stesso nome e la stessa firma sia nella superclasse che nella sottoclasse. La chiamata a un metodo sovrascritto viene risolta in fase di esecuzione tramite binding dinamico all'interno della JVM.

Esempio di polimorfismo dinamico

Una variabile di riferimento della superclasse può fare riferimento a un oggetto della sottoclasse:

 Doctor obj = new Surgeon();

Considera la seguente affermazione:

obj.treatPatient();

Qui la variabile di riferimento obj appartiene alla classe padre, ma l'oggetto a cui punta appartiene alla classe figlia, come mostrato nel diagramma del polimorfismo.

La chiamata obj.treatPatient() eseguirà il metodo treatPatient() della sottoclasse Surgeon. Quando si utilizza un riferimento a una classe base per chiamare un metodo, il metodo invocato viene deciso dalla JVM in base all'oggetto effettivo a cui punta il riferimento. Anche se obj è un riferimento a Doctor, chiama il metodo di Surgeon, perché punta a un oggetto Surgeon. La decisione viene presa durante l'esecuzione, motivo per cui viene definita Polimorfismo dinamico o polimorfismo a tempo di esecuzione.

Differenza tra polimorfismo statico e dinamico

Polimorfismo statico in Java Il polimorfismo dinamico è un tipo di polimorfismo che raccoglie le informazioni per la chiamata di un metodo in fase di compilazione, mentre il polimorfismo dinamico è un tipo di polimorfismo che raccoglie le informazioni per la chiamata di un metodo in fase di esecuzione.

Polimorfismo statico
Polimorfismo dinamico
Si riferisce al sovraccarico dei metodi. Si riferisce alla sovrascrittura dei metodi.
Gli errori, se presenti, vengono risolti in fase di compilazione. Poiché il codice non viene eseguito durante la compilazione, il nome è statico.

Es:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
Quando una variabile di riferimento chiama un metodo sovrascritto, il metodo da invocare è determinato dall'oggetto a cui punta la variabile di riferimento. Questo può essere determinato solo in fase di esecuzione, quando il codice è in esecuzione, ed è per questo che il nome è dinamico.

Es:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Super parola chiave in Java

Cosa succede se il metodo treatPatient nella classe Surgeon vuole eseguire la funzionalità definita nella classe Doctor e poi eseguire il proprio comportamento specifico? In questo caso la parola chiave super può essere utilizzato per accedere ai metodi della classe padre dalla classe figlia. Il metodo treatPatient nella classe Surgeon potrebbe essere scritto come:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

La parola chiave super può essere utilizzata per accedere a qualsiasi membro dati o metodo della superclasse all'interno della sottoclasse. Successivamente, impareremo a conoscere la parola chiave super, Ereditàe polimorfismo in Java con programmi di esempio.

Esempio: per imparare l'ereditarietà, il polimorfismo e la parola chiave super

Passo 1) Copiare il codice seguente in un editor.

public class Test{
     public static void main(String args[]){
        X x= new X();
        Y y = new Y();
        y.m2();
        //x.m1();
        //y.m1();
        //x = y;// parent pointing to object of child
        //x.m1() ;
        //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overridden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

Passo 2) Salva, compila ed esegui il codice. Osserva l'output.

Passo 3) Rimuovi il commento dalle righe da 6 a 9. Salva, compila ed esegui il codice. Osserva l'output.

Passo 4) Rimuovi il commento dalla riga 10. Salva e compila il codice.

Passo 5) Errore = ? Questo accade perché la sottoclasse non può accedere ai membri privati ​​della superclasse.

DOMANDE FREQUENTI

Polimorfismo dentro Java La proprietà di un oggetto risiede nella sua capacità di assumere molteplici forme. Lo stesso nome di metodo può eseguire codice diverso a seconda dell'oggetto della sottoclasse a cui si fa riferimento in fase di esecuzione, e questo è il comportamento fondamentale della programmazione orientata agli oggetti (OOP).

Java Supporta il polimorfismo in fase di compilazione tramite l'overloading dei metodi e il polimorfismo in fase di esecuzione tramite l'overriding dei metodi. L'overloading si risolve in fase di compilazione tramite binding statico, mentre l'overriding si risolve in fase di esecuzione tramite binding dinamico gestito dalla JVM.

Il binding statico collega una chiamata di metodo alla sua definizione in fase di compilazione e viene utilizzato per l'overloading dei metodi. Il binding dinamico collega la chiamata in fase di esecuzione in base al tipo di oggetto effettivo e alimenta l'override dei metodi in Java.

La parola chiave `super` consente a una sottoclasse di chiamare il metodo sovrascritto o di accedere a un membro dati della classe padre. Ciò permette alla classe figlia di riutilizzare la logica della classe padre e di sovrapporre ad essa comportamenti specifici.

I tutor IA come ChatGPT e GitHub Copilot Chat possono spiegare il polimorfismo in Java Con analogie personalizzate, genera esercizi pratici, analizza gli alberi di ereditarietà e sottoponi gli studenti a quiz sul binding statico e dinamico per un apprendimento più rapido.

Sì. Gli assistenti di refactoring basati sull'intelligenza artificiale come Cursor, Sourcegraph Cody e IntelliJ AI Assistant possono individuare condizioni duplicate, proporre gerarchie di classi e riscrivere il codice legacy. Java codice in modo che l'override del metodo sostituisca le catene ripetute di if-else.

Riassumi questo post con: