Overloading dei Costruttori in Java

Concetti Chiave
  • 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.