Costruttori

Nella precedente dispensa abbiamo inizializzato le variabili di istanza di un oggetto quadrato utilizzando il metodo setLato. import javax.swing.*; class UsaQuadrato { public static void main(String[] args) { //VARIABILI LOCALI double area; Quadrato unQuadrato; //CREAZIONE OGGETTO QUADRATO unQuadrato= new Quadrato(); //ISTRUZIONI unQuadrato.setLato( Double.parseDouble(JoptionPane.showInputDialog (“Immettere la misura del lato”))); //test del metodo getLato JoptionPane.showMessageDialog(null,”Lato= “+ unQuadrato.getLato()); area= unQuadrato.calcolaArea(); JoptionPane.showMessageDialog(null,”Area= “+area);

} }

In realtà esiste un modo migliore per inizializzare un oggetto: definire un costruttore.

Costruttore di default
Osservando il precedente codice si nota che la classe UsaQuadrato crea l’oggetto unQuadrato, della classe Quadrato, mediante l’istruzione q= new Quadrato(); Quadrato() è un metodo predefinito, associato alla classe Quadrato, detto costruttore di default. Ogni classe ha un costruttore predefinito (di default) con le seguenti caratteristiche:
• • • •

ha lo stesso nome della classe; non restituisce alcun valore (nemmeno void); non deve essere dichiarato esplicitamente; non ha parametri.

Quando si crea un’istanza della classe con new, il costruttore di default costruisce un oggetto che ha la stessa struttura definita dalla classe. Inoltre, esso provvede ad inizializzare ogni variabile d’istanza dell’oggetto con i valori di default previsti dal linguaggio (zero per i numeri, false per i boolean, stringa vuota per le stringhe). Ogni classe ha un proprio costruttore di default.
Autore: Cinzia Bocchi Ultimo aggiornamento: 06/07/11

1

Costruttori non di default
Talvolta può essere utile creare un oggetto assegnando alle variabili d’istanza opportuni valori iniziali, senza ricorrere per questo all’uso di altri metodi. In questi casi si possono definire uno o più costruttori per la stessa classe. I costruttori non di default hanno le seguenti caratteristiche:
• • •

hanno lo stesso nome della classe devono essere dichiarati e definiti esplicitamente; non restituiscono alcun valore (nemmeno void); la sintassi per dichiarare un costruttore diventa pertanto <nome classe> (<lista parametri>)

se hanno dei parametri, questi devono essere diversi in numero e/o tipo dai parametri di ogni altro costruttore della stessa classe.

Osservazione: se nella classe viene definito esplicitamente un costruttore, il costruttore di default (quello senza parametri) non è più disponibile, a meno che non venga definito esplicitamente anch'esso. Esempio Definiamo un costruttore per la classe Quadrato. class Quadrato { //VARIABILI DI ISTANZA private double lato; //COSTRUTTORE public Quadrato(double l) { lato = l; } //METODI public double getLato() { return lato; } public void setLato(double l) { lato = l; } public double calcolaArea() { return Math.pow(lato,2); }

}

Autore: Cinzia Bocchi Ultimo aggiornamento: 06/07/11

2

La classe usaQuadrato si modifica nel modo seguente import javax.swing.*; class UsaQuadrato { public static void main(String[] args) { //VARIABILI LOCALI double area, lato; Quadrato unQuadrato; //ISTRUZIONI lato = Double.parseDouble(JoptionPane.showInputDialog (“Immettere la misura del lato”))); unQuadrato = new Quadrato(lato); area= unQuadrato.calcolaArea(); JoptionPane.showMessageDialog(null,”Area= “+area); } } Osservate che non è più necessario utilizzare il metodo setLato per assegnare un valore iniziale al lato del quadrato ma tale assegnazione viene fatta dal costruttore. Il valore iniziale del lato coinciderà con il valore del parametro passato al costruttore all’atto della sua chiamata.

Overloading di metodi
All’interno di una stessa classe possono esistere più metodi, oltre ai costruttori, definiti con lo stesso nome, ma che si differenziano per il numero e/o il tipo dei parametri. Quando il metodo viene richiamato, la scelta corretta del metodo da eseguire viene fatta contando il numero dei parametri e verificandone il tipo. Questa possibilità dei metodi di utilizzare lo stesso nome, pur avendo implementazioni diverse, viene detta overloading.

Quest'opera è stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Autore: Cinzia Bocchi Ultimo aggiornamento: 06/07/11

3