I costruttori in Java
Un costruttore inizializza un nuovo oggetto istanza della classe. Per invocare il costruttore si usa l'operatore new.
Tipo nomeOggetto = new Classe (parametri)
L'operatore new invoca il costruttore della classe per istanziare un oggetto.
Il costruttore si trova dentro la classe.
class NomeClasse {
...
public NomeClasse() {
[corpo del costruttore]
}
...
}
Il costruttore deve avere lo stesso nome della classe che lo contiene e può ricevere zero o più parametri.
Nota. Quando invoco un costruttore devo rispettare i parametri indicati. Ad esempio, se esplicito un costruttore con due parametri, devo invocarlo passandogli due parametri dello stesso tipo. Se lo invoco con zero, uno o tre parametri, il compilatore va in errore.
Quanti costruttori ha una classe?
Ogni classe ha almeno un costruttore che viene eseguito quando si crea un oggetto istanza.
Una classe può comunque avere più costruttori, distinti tra loro da una diversa combinazione di argomenti. Il nome è invece sempre lo stesso.
Nota. Se non si dichiara almeno un costruttore, il compilatore Java crea automaticamente un costruttore senza parametri di default (costruttore no-args) perché è implicito che si crea una classe per istanziare degli oggetti. E' una peculiarità del linguaggio Java. In altri linguaggi di programmazione a oggetti non è così.
Qual è la differenza tra new e costruttore?
L'operatore new crea l'area di memoria dove sarà collocato lo stato dell'oggetto mentre il costruttore inizializza lo stato iniziale dell'oggetto.
Nota. I metodi degli oggetti di una classe sono collocati in un'area di memoria comune perché sono condivisi da tutti gli oggetti della classe. Gli attributi, invece, variano da oggetto a oggetto.
Un esempio pratico
Ecco un esempio pratico di costruttore
- class Persone {
- private String nome;
- private String cognome;
- public Persone(String nome, String cognome) {
- this.nome=nome;
- this.cognome=cognome;
- }
- }
Nelle righe 4-7 definisco il costruttore della classe Persone.
Il costruttore si chiama Persone() come la classe e riceve due parametri stringa (nome e cognome).
Per creare un nuovo oggetto invoco il costruttore
Persone andrea = new Persone("Andrea", "Minini");
Il costruttore riceve i due parametri e crea un oggetto istanza “andrea” con le variabili di istanza andrea.nome=”Andrea” e andrea.cognome=”Minini”.
Nota. Se invoco il costruttore senza passargli dei parametri, il compilatore va in errore.
Esempio 2
In questo esempio scrivo due costruttori
Ecco un esempio pratico di costruttore
- class Persone {
- private String nome;
- private String cognome;
- public Persone(String nome, String cognome) {
- this.nome=nome;
- this.cognome=cognome;
- }
- public Persone() {
- this.nome=null;
- this.cognome=null;
- }
- }
Nelle righe 4-7 definisco un costruttore della classe Persone con due parametri.
Nelle righe 8-11 esplicito un costruttore con lo stesso nome ma senza parametri.
In questo modo, posso invocare il costruttore anche senza passargli nessun argomento
Persone andrea = new Persone();
Il compilatore esegue il secondo costruttore (righe 8-11) creando un oggetto andrea con valori null.
Se invece invoco il costruttore passandogli due parametri, il compilatore esegue il primo costruttore (righe 4-7).
Persone andrea = new Persone("Andrea", "Minini");
A seconda degli argomenti il compilatore esegue un costruttore oppure l'altro.
Nota. Se invoco il costruttore con una diversa combinazione di parametri o tipi di parametri, il compilatore va in errore.
La differenza tra costruttore e metodi
Il concetto di costruttore non è un metodo da cui si distingue in diversi aspetti.
- Il costruttore deve avere lo stesso nome della classe. Non può averne un altro. I metodi possono avere qualsiasi nome.
- Nel costruttore non si deve specificare il tipo del valore di ritorno e non è possibile nemmeno usare void. Nei metodi è invece necessario indicare tipo, void o valore di ritorno.
- Il costruttore crea una nuova istanza (oggetto) della classe. I metodi non creano oggetti.
- Il costruttore inizializza lo stato dell'oggetto appena creato. I metodi lo interrogano o lo modificano.
- Un costruttore può essere invocato una sola volta per uno stesso oggetto mentre i metodi sono invocabili più volte per uno stesso oggetto.
Nota. Spesso si confonde il concetto di costruttore con quello di metodo perché entrambi ricevono una lista di parametri. In realtà sono concetti diversi.
E così via.