Overloading dei Costruttori in Java
- L'overloading dei costruttori in Java consente di definire più costruttori all'interno della stessa classe con parametri diversi.
- I costruttori sovraccaricati devono differire nel tipo e/o nel numero dei loro parametri.
- Il tipo di ritorno non è sufficiente per distinguere due versioni di un costruttore sovraccaricato.
- Java utilizza il tipo e/o il numero di argomenti per determinare quale versione del costruttore sovraccaricato chiamare.
- L'overloading dei costruttori supporta il polimorfismo, consentendo di utilizzare lo stesso nome per operazioni simili su tipi di dati diversi.
Overloading dei Costruttori
Oltre all'Overloading dei metodi normali, è anche possibile effettuare l'Overloading dei costruttori.
Infatti, per la maggior parte delle classi del mondo reale che vengono create, i costruttori Sovraccaricati rappresentano la norma, non l'eccezione.
Per comprendere il motivo, si consideri la classe Scatola
sviluppata nelle lezioni precedenti. Di seguito è riportata la versione aggiornata di Scatola
:
class Scatola {
double larghezza;
double altezza;
double profondita;
// Questo è il costruttore per Scatola.
Scatola(double l, double a, double p) {
larghezza = l;
altezza = a;
profondita = p;
}
// calcola e restituisce il volume
double volume() {
return larghezza * altezza * profondita;
}
}
Come si può vedere, il costruttore Scatola()
richiede tre parametri.
Ciò significa che tutte le dichiarazioni degli oggetti Scatola
devono passare tre argomenti al costruttore Scatola()
.
Ad esempio, la seguente istruzione è attualmente non valida:
Scatola ob = new Scatola();
Poiché il costruttore Scatola()
richiede tre argomenti, è un errore chiamarlo senza di essi.
Questo solleva alcune domande importanti:
- E se si volesse semplicemente una scatola e non importasse (o non si sapesse) quali fossero le sue dimensioni iniziali?
- Oppure, e se si volesse inizializzare un cubo specificando solo un valore che sarebbe usato per tutte e tre le dimensioni?
Così come la classe Scatola
è scritta attualmente, queste altre opzioni non sono disponibili.
Fortunatamente, la soluzione a questi problemi è piuttosto semplice: basta effettuare l'Overloading del costruttore Scatola
in modo che gestisca le situazioni appena descritte.
Ecco un programma che contiene una versione migliorata di Scatola
che fa proprio questo:
/* Qui, Scatola definisce tre costruttori per inizializzare
le dimensioni di una scatola in vari modi.
*/
class Scatola {
double larghezza;
double altezza;
double profondita;
// costruttore usato quando tutte le dimensioni sono specificate
Scatola(double l, double a, double p) {
larghezza = l;
altezza = a;
profondita = p;
}
// costruttore usato quando nessuna dimensione è specificata
Scatola() {
larghezza = -1; // usa -1 per indicare
altezza = -1; // un valore non inizializzato
profondita = -1;
}
// costruttore usato quando viene creato un cubo
Scatola(double lato) {
larghezza = altezza = profondita = lato;
}
// calcola e restituisce il volume
double volume() {
return larghezza * altezza * profondita;
}
}
class OverloadCons {
public static void main(String[] argomenti) {
// crea scatole usando i vari costruttori
Scatola miaScatola1 = new Scatola(10, 20, 15);
Scatola miaScatola2 = new Scatola();
Scatola mioCubo = new Scatola(7);
double vol;
// ottieni il volume della prima scatola
vol = miaScatola1.volume();
System.out.println("Il volume di miaScatola1 è " + vol);
// ottieni il volume della seconda scatola
vol = miaScatola2.volume();
System.out.println("Il volume di miaScatola2 è " + vol);
// ottieni il volume del cubo
vol = mioCubo.volume();
System.out.println("Il volume di mioCubo è " + vol);
}
}
L'output prodotto da questo programma è mostrato di seguito:
Il volume di miaScatola1 è 3000.0
Il volume di miaScatola2 è -1.0
Il volume di mioCubo è 343.0
Come si può vedere, il costruttore Overloading corretto viene chiamato in base agli argomenti specificati quando viene eseguito new
.