Lezione di Java 22 – Overloading e overriding

Indice Lezione PrecedenteLezione Successiva


L’overloading dei metodi, in italiano sovraccaricamento, è il meccanismo con cui Java permette la definizione di più metodi con lo stesso nome. Per poter avere l’overloading l’unica regola da rispettare è quella di avere una lista di argomenti differente, è l’unico elemento utilizzato per distinguere i metodi tra di loro. Il tipo di ritorno e la visibilità, possono essere diversi tra loro ma non sono utilizzati per distinguere i due metodi tra di loro.

Facciamo un esempio:

public class Figura {
  public int a;
  public double b;
  
  public void setNumero(int num){
    a=num;
  }

  public void setNumero(double num){ // Ok, lista parametri diversa
    b=num;
  }

  public void setNumero(int Num){ // Errore, lista uguale
    a=num;
  }

  public int setNumero(int num){ // Errore, lista uguale
    a=num;
    return a;
  }

  public float setNumero(){ // Ok, lista differente
    return 3.14;
  }

  public void setNumero(int num, double num2){ // Errore, il tipo
               // di ritorno non é usato per distinguere i metodi
    this(num); // Sfruttiamo il sovraccaricamento
    b=num2; // Non possiamo riusare this(), può essere usato
          // Solo sulla prima riga di ogni metodo
  }
}

L’overriding è il meccanismo che permette la sovrapposizione dei metodi di una superclasse da parte di una sottoclasse. Per poter sovrapporre un metodo proveniente da una superclasse bisogna che il nuovo metodo abbia:

  1. lo stesso nome, lo stesso tipo di ritorno e la stessa lista di parametri;
  2. visibilità non inferiore (abbiamo visto nelle lezioni precedente ad esempio che private è molto più restrittivo rispetto a public);
  3. il metodo sovrapposto non può avere problemi di grandezza più grandi del metodo che viene sovrapposto (vedremo in seguito cosa sono questi “problemi” con le eccezioni).


Vediamo qualche esempio:

public class Persona {
  public int anni=0; // Verrà ereditato da Maschio, è public

  public void setAnni(int anni){
    this.anni=anni;
  }
}

public class Maschio
  extends Persona{

  public void setAnni(int anni){ // Tutto uguale, overriding corretto
    this.anni=anni*2;
  }

  public void setAnni(int Years){ // Tutto uguale, overriding corretto
    this.anni=anni*2;
  }

  public void setAnni(double anni){ // Non c'è overriding (lista parametri diversi), ma c'è overloading
    //...
  }

  public int setAnni(int anni){ // Errore, non c'è overriding e neanche overloading (solo lista parametri differente): sovraccaricamento illegale di metodi
    this.anni=anni*2;
    return this.anni;
  }
}

La massima espressione del polimorfismo si ha con l’overriding. L’invocazione virtuale di metodo si ha quando il comportamento di una variabile è determinato in esecuzione in base al tipo di riferimento della variabile, e non a tempo di compilazione.

Nella prossima lezione tratteremo l’operatore super.

Ti piace l’articolo?
Diventa fan su Facebook
Indice Lezione PrecedenteLezione Successiva
Pubblicato in Guide, Guide, Java, Programmazione Taggato con: , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*