Laboratorio di programmazione
Java
Laboratorio di programmazione
Java
Un costruttore
è una funzione che:
Æ ha il nome della classe e non
ha tipo di ritorno (neanche void)
Costruttori
Æ gestisce la nascita di un oggetto
inizializzandone i campi dati
Æ viene invocata esclusivamente
con new
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
Università di Roma “La Sapienza”
Java
Esempio:
Invocazione del costruttore
public class Persona {
...
public Persona(String n, String r) {
nome = n;
residenza = r;
}
...
}
Æ Un costruttore può essere
invocato esclusivamente
dall’operatore new …
Æ … cioè all’atto della creazione
dell’oggetto
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
Università di Roma “La Sapienza”
Java
Esempio di uso:
Persona p;
p = new Persona(“Luigi Bianchi”,
“Milano”);
System.out.println(p.getNome());
System.out.println(p.getResidenza());
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Analizziamo
la creazione
di un oggetto …
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
1
Laboratorio di programmazione
Laboratorio di programmazione
Java
Java
Viene allocata la variabile p
Viene allocato il nuovo oggetto
p = new Persona(“Luigi Bianchi”,“Milano”);
p = new Persona(“Luigi Bianchi”,“Milano”);
Persona
nome
residenza
heap
heap
stack
stack
p ???
null
null
p ???
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Università di Roma “La Sapienza”
Java
Java
Viene eseguito il costruttore
Viene eseguito il costruttore
p = new Persona(“Luigi Bianchi”,“Milano”);
p = new Persona(“Luigi Bianchi”,“Milano”);
Persona
nome
residenza
Persona
null
null
heap
heap
stack
stack
p ???
nome
“Luigi Bianchi”
residenza
“Milano”
p ???
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
Università di Roma “La Sapienza”
Java
Viene assegnato l’indirizzo a p
p = new Persona(“Luigi Bianchi”,“Milano”);
Persona
heap
nome
“Luigi Bianchi”
residenza
“Milano”
Inizializzazioni
implicite dei campi dati
di una classe
stack
p
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
2
Laboratorio di programmazione
Laboratorio di programmazione
Java
Java
Overloading di costruttori
Un campo di tipo: Viene inizializzato
implicitamente a:
int
Æ L’overloading è ammesso anche
per i costruttori
0
float, double
0.0
char
‘\0’
boolean
false
class C
null
Æ Ad esempio possiamo aggiungere
a Persona:
public Persona(String n) {
nome = n;
residenza = null;
}
Queste inizializzazioni non sono effettuate
per le variabili locali delle funzioni
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
Università di Roma “La Sapienza”
Java
Persona p1 =
new Persona(“Luigi Bianchi”);
//invocato costruttore nome
Persona p2 =
new Persona(“Giovanni Verdi”,“Roma”);
//invocato costruttore nome-residenza
Esempio di utilizzo …
System.out.println(p1.getNome());
//stampa “Luigi Bianchi”
System.out.println(p2.getNome());
//stampa “Giovanni Verdi”
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
Università di Roma “La Sapienza”
Java
Æ Java fornisce automaticamente
Costruttore Standard
un costruttore standard a tutte
le classi che non hanno costruttori
definiti
Æ ll costruttore standard è senza
parametri …
Æ … e lascia i campi dati al loro valore
di default (praticamente non fa nulla)
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
3
Laboratorio di programmazione
Java
Laboratorio di programmazione
Java
L’istruzione:
Persona p = new Persona();
Æ … qualora sia definito un qualsiasi
costruttore (con un qualsiasi
numero/tipo di parametri),
la generazione automatica del
costruttore standard viene inibita …
Æ … in un cliente della classe
Persona presentata all’inizio
della lezione coinvolge
una invocazione al costruttore
standard.
Æ … quindi se si necessita di
un costruttore senza parametri,
questo va esplicitamente definito.
Prof. Giuseppe De Giacomo
Prof. Giuseppe De Giacomo
Laboratorio di programmazione
Laboratorio di programmazione
Università di Roma “La Sapienza”
Java
L’istruzione:
Persona p = new Persona();
Æ … in un cliente della classe Persona
equipaggiata con i costruttori
su visti invece produce un errore …
Æ Possimo però equipaggiare
la classe con un ulteriore
costruttore senza parametri …
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
Università di Roma “La Sapienza”
Java
Costruttore senza parametri
per Persona
public Persona() {
nome = “Mario Rossi”;
residenza = null;
}
Non ha sempre senso equipaggiare
una classe con un costruttore senza
parametri
Prof. Giuseppe De Giacomo
Università di Roma “La Sapienza”
4