Java/Metodi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 115:
Per i dettagli riguardo l'overriding, si veda [[Java/Ereditarietà#Overloading e overriding: due concetti da non confondere|la pagina riguardo l'ereditarietà]].
 
Ogni metodo di un determinato tipo ha un nome associato. In realtà, il nome da solo non è sufficiente ad identificare il metodo. Gli elementi che identificano il metodo sono collettivamente chiamati ''signature'' e sono determinati da
*nome del metodo
*numero e dal tipo degli argomenti
Il nome degli argomenti '''non''' conta.
 
Metodi con lo stesso nome, ma diverse liste di argomenti, sono a tutti gli effetti diversi agli occhi del compilatore e del programma Java. Il motivo principale è che ciò permette di raggruppare insieme dei metodi concettualmente simili o che compiono le stesse operazioni:
L''''overloading''' è la possibilità di creare più metodi con lo stesso nome e nella stessa classe con argomenti diversi per numero o tipo, mentre l''''overriding''' è la possibilità di richiamare un certo metodo anche senza ricorrere a un'istanza della classe.
<source lang="Java">
class DataPersona {
public void guida(Bicicletta b) { ... }
public void guida(Automobile a) { ... }
public void Dataguida(Aeroplano a) { ... }
}
}
</source>
 
Se un client invoca
Vediamo un esempio con una classe che gestisce delle date:
<source lang=java"Java">
Persona p = ...;
class Data{
p.guida(mezzo);
int giorno;
int mese;
int anno;
public void Data(){
this.giorno=1;
this.mese=1;
this.anno=2000;
}
public void Data(int giorno, int mese, int anno){
this.giorno=giorno;
this.mese=mese;
this.anno=anno;
}
}
</source>
 
il compilatore sceglie la versione del metodo <code>guida</code> più adatta a seconda del tipo della variabile <code>mezzo</code>.<br/>
In Java l'ambiguità data dalla presenza dei due costruttori è risolta dal numero e dal tipo di argomenti richiesti dai metodi, quindi richiamando un metodo verrà di volta in volta scelto tra gli ononimi quello che richiede il numero e il tipo di argomenti richiesti.
'''Attenzione''': la scelta viene determinata solo sulla base del tipo ''a tempo di compilazione''. Quindi, se <code>Bicicletta</code>, <code>Automobile</code> e <code>Aeroplano</code> sono sottotipi di un tipo comune <code>MezzoDiTrasporto</code>, e <code>mezzo</code> è una variabile di tipo <code>MezzoDiTrasporto</code>, allora il compilatore protesta richiedendo che venga specificata quale delle tre versioni va invocata.
Dunque scrivendo
 
Data compleanno=new Data();
L'overloading è supportato anche per i costruttori. Questo permette di dare al client la possibilità di costruire un oggetto in modi diverse a seconda della specifica lista di parametri utilizzata.
si creerà un oggetto Data inizializzato al capodanno 2000, poiché non si è fornito alcun valore al costruttore, mentre usando
Data compleanno=new Data(3,11,2005);
la JVM utilizzerà il secondo costruttore e inizializzerà l'oggetto al 3 novembre 2005.
 
== Overriding ==
L''''overriding''', invece,(in inglese ''sovrascrittura'') corrisponde a un'operazione completamente diversa: consente di ridefinire un metodo in una sottoclasse:, in modo che il metodo originale e quello che lo ridefinisce hanno necessariamente la stessa firma, e solo a tempo di esecuzione si determina quale dei due deve essere eseguito. Ad esempio:
<source lang=java>
public class ClassePadre {