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