back to top

Polimorfismo Java: overload e override dei metodi

Il polimorfismo รจ un concetto fondamentale della programmazione orientata agli oggetti, spesso ritenuto uno dei piรน complessi da comprendere appieno. Derivando dal greco, il termine significa โ€œavere forme diverseโ€. Per illustrare il concetto in modo pratico, consideriamo un esempio della vita quotidiana: quando parliamo di un computer, utilizziamo lo stesso termine per indicare un computer desktop, un portatile o un netbook. Sebbene questi dispositivi siano diversi nella loro forma e funzione, la generalizzazione del termine โ€œcomputerโ€ indica che svolgono operazioni simili. Questo รจ il polimorfismo.

Una volta chiarito il concetto di base, possiamo approfondire il polimorfismo dei metodi, che puรฒ essere implementato attraverso due tecniche principali: overloading e overriding.

Pubblicitร 

Polimorfismo dei Metodi

Dal punto di vista pratico, il polimorfismo si realizza mediante lโ€™overloading e lโ€™overriding dei metodi. Ogni metodo in Java viene identificato non solo dal suo nome, ma anche dalla lista dei suoi parametri. Questo consente di avere piรน metodi con lo stesso nome allโ€™interno di una classe, purchรฉ questi abbiano parametri con tipi e numeri diversi. Lโ€™overloading permette di definire piรน metodi con lo stesso nome, ma con parametri differenti. Ad esempio, consideriamo la classe OperazioniSuNumeri che implementa metodi di somma per numeri interi e numeri di tipo float:

public class OperazioniSuNumeri {
  public int somma(int x, int y) {
    return x + y;
  }

  public float somma(float x, float y) {
    return x + y; // Corretto l'errore qui in precedenza, che era un errore di sottrazione.
  }
}

In questo contesto, non dobbiamo preoccuparci di controllare i tipi dei numeri in ingresso, perchรฉ il linguaggio Java chiamerร  automaticamente il metodo appropriato in base al tipo dei parametri forniti. Ecco un esempio di implementazione della classe:

public class Implementazione {

  public static void main(String[] args) {
    OperazioniSuNumeri numeri = new OperazioniSuNumeri();
    int sommaInteri = numeri.somma(3, 4);
    System.out.println("La somma tra interi รจ: " + sommaInteri);

    float sommaFloat = numeri.somma(2.1f, 8.3f);
    System.out.println("La somma tra float รจ: " + sommaFloat);
  }
}

Il codice sopra funzionerร  perfettamente, poichรฉ ogni volta che chiamiamo il metodo somma, il linguaggio verifica il tipo dei parametri passati e richiama automaticamente il metodo corretto.

Inoltre, abbiamo giร  utilizzato il polimorfismo quando abbiamo chiamato il metodo System.out.println(). Infatti, abbiamo passato tipologie di argomenti diversi (una stringa e un numero intero) senza incorrere in errori, confermando che Java offre piรน implementazioni per il metodo System.out.println(), rendendolo un metodo polimorfo.

Il termine override, invece, si riferisce alla riscrittura di un metodo di una classe che รจ stata ereditata. Pertanto, lโ€™override implica sempre lโ€™ereditarietร . Per chiarire ulteriormente, consideriamo un esempio con una classe nota, Dipendente: la classe รจ strutturata come segue (sono stati omessi i metodi set e get per gli attributi โ€œnomeโ€ e โ€œcognomeโ€):

public class Dipendente {

  private String nome;
  private String cognome;
  private int oreLavorativeMensili;
  private int retribuzioneOraria;

  public int getOreLavorativeMensili() {
    return oreLavorativeMensili;
  }

  public int getRetribuzioneOraria() {
    return retribuzioneOraria; // Corretto l'errore di scrittura nel nome.
  }

  public int stipendio() {
    return oreLavorativeMensili * retribuzioneOraria;
  }
}

Ora, creiamo una nuova classe ResponsabileDiProgetto che estende Dipendente e che include un attributo bonus, il quale contribuisce alla retribuzione totale. Implementeremo il metodo stipendio in modo da includere sia lo stipendio base che il bonus. Il codice sarร  il seguente:

public class ResponsabileDiProgetto extends Dipendente {

  private int bonus;

  public int stipendio() {
    int stipendioBase = (getOreLavorativeMensili() * getRetribuzioneOraria());
    return stipendioBase + bonus;
  }
}

Grazie allโ€™override, possiamo ridefinire un metodo di una classe generale adattandolo a una classe piรน specifica, mantenendo perรฒ la stessa coerenza semantica, poichรฉ il metodo conserva lo stesso nome ma si comporta in modo differente a seconda della classe che lo utilizza.

Pubblicitร