Capitolo 3 Realizzare classi
Obbiettivi del capitolo Acquisire familiarità con il procedimento di realizzazione di classi Essere in grado di realizzare semplici metodi Capire a cosa servono e come si usano i costruttori Capire come si accede a variabili di esemplare e variabili locali Apprezzare l importanza dei commenti per la documentazione
Scatole Nere Una scatola nera fa la sua cosa magicamente Nasconde il suo lavoro interno Incapsulamento: l'occultamento di dettagli senza importanza Quale è il concetto corretto per ogni particolare scatola nera? Continua
Scatole Nere I Concetti sono scoperti tramite l astrazione Astrazione: eliminare caratteristiche non essenziali, fino a che solamente l'essenza del concetto rimane In programmazione a oggetti le scatole nere per mezzo delle quali è implementato un programma sono chiamate oggetti
Livelli di Astrazione: Esempi di vita reale Scatole nere in una automobile: trasmissione, modulo di controllo elettronico, etc. Figure 1: Disegno dei Livelli di Astrazione in una Automobile
Livelli di Astrazione: Esempi di vita reale Gli Automobilisti non hanno bisogno di capire come lavorano le scatole nere I Conducenti interagiscono con la macchina usando pedali, bottoni, etc. Il Meccanico può esaminare se la centralina spedisca in modo corretto il segnale di accensione alle candele La centralina, i transistor e i condensatori sono scatole nere prodotte magicamente da un fabbricante di componenti elettronici Continua
Livelli di Astrazione : Esempi di vita reale L'Incapsulamento conduce all' efficienza: Il Meccanico interagisce solamente con i componenti della macchina (es. Centralina), non con i sensori e transistor Il Conducente si preoccupa solamente dell'interazione con la macchina (es. mettendo benzina nel serbatoio), non del motore o della centralina
Livelli di Astrazione : Creazione Software Figura 2: Disegno dei livelli di astrazione nella creazione di un software
Livelli di Astrazione : Creazione Software Vecchi tempi:i programmi del computer manipolavano solo tipi primitivi come numeri e caratteri Manipolare molte di queste quantità primitive era difficile per i programmatori e conduceva ad errori Soluzione: Incapsulare i calcoli di routine in scatole nere Continua
Livelli di Astrazione : Creazione Software L'Astrazione inventa tipi di dati di alto livello In programmazione orientata ad oggetti,gli oggetti sono scatole nere Incapsulamento: Il Programmatore che usa un oggetto conosce il suo comportamento, ma non sa nulla sulla sua struttura interna Continua
Livelli di Astrazione : Creazione Software In Programmazione,si possono progettare buone e cattive estrazioni con uguale facilità; capire quello che fa un buon software è un'importante parte dell'istruzione di un ingegnere esperto di programmaione Prima definisci il comportamento di una classe poi lo perfezioni
Auto-Valutazione 1. Nei Capitoli 1 e 2 avete usato System.out come scatola nera per fare in modo che dati venissero visualizzati sullo schermo del computer.chi ha progettato e realizzato System.out? 2. Supponete di lavorare in una ditta che produce software per elaborazioni finanziarie personali e che vi venga chiesto di progettare e realizzare una classe che rappresenti conti bancari.quali saranno gli utenti della vostra classe?
Risposte 1. I programmatori che hanno realizzato e implementato le librerie di java 2. Gli altri programmatori che lavorano nelle elaborazioni finanziarie personali
Creazione dell interfaccia Pubblica di una Classe Comportamento di un conto in banca (Astrazione): Deposito di soldi Prelievo di soldi Saldo attuale
Creazione dell interfaccia Pubblica di una Classe : I Metodi Metodi della classe BankAccount: deposit withdraw getbalance Noi vogliamo poter eseguire chiamate di metodi come nell esempio seguente: harryschecking.deposit(2000); harryschecking.withdraw(500); System.out.println(harrysChecking.getBalance());
Creazione dell interfaccia Pubblica di una Classe : la definizione dei metodi Specificatori di accesso (ad esempio public) Tipi di ritorno (ad esempio String o void) Nomi dei metodi (ad esempio deposit) Lista di parametri (double amount per deposit) Corpo dei metodi all interno { } Continua
Creazione dell interfaccia Pubblica di una Classe : la definizione dei metodi Esempio public void deposit(double amount) {... } public void withdraw(double amount) {... } public double getbalance() {... }
Sintassi 3.1: Definizione di metodo Specificatore di acesso tiporestituito nomemetodo(tipoparametro nomeparametro,...) { corpo del metodo } Esempio: public void deposit(double amount) {... } Obiettivo: Definire il comportamento di un metodo
Creazione dell interfaccia Pubblica di una Classe : Definizione del Costruttore Un costruttore inizializza le variabili di istanza Nome del Costruttore = Nome della classe public BankAccount() { // corpo che verra riempito più avanti } Continua
Creazione dell interfaccia Pubblica di una Classe : Definizione del Costruttore Il Corpo del costruttore viene eseguito quando un nuovo oggetto è creato Le istruzioni nel un corpo del un costruttore inizializzano i dati interni (stato) dell'oggetto che si sta costruendo Tutti i costruttori di una classe hanno lo stesso nome della classe Il Compilatore può utilizzare selettivamente uno dei costruttori a seconda dei parametriche ricevono
Sintassi 3.2: Definizione dei costruttori SpecificatoreDiAccesso nomeclasse(tipoparametro nomeparametro,..) { corpo del costruttore } Esempio: public BankAccount(double initialbalance) {... } Obiettivo: Definire il comportamento di un costruttore
Interfaccia Pubblica di BankAccount Il costruttore e i metodi pubblici di una classe formano la public interface di una classe. public class BankAccount { // Costruttore public BankAccount() { // corpo riempito in seguito } public BankAccount(double initialbalance) { // corpo riempito in seguito } // Metodi public void deposit(double amount) Continua
Interfaccia Pubblica di BankAccount // Metodi public void deposit(double amount) } { } // corpo riempito in seguito public void withdraw(double amount) { // corpo riempito in seguito } public double getbalance() { // corpo riempito in seguito } // parte privata riempita in seguito
Syntassi 3.3: Definizione di classe specificatorediaccesso class NomeClasse { costruttori metodi campi (variabili di istanza) } Esempio: public class BankAccount { public BankAccount(double initialbalance) {... } public void deposit(double amount) {... }... } Obiettivo: Definire una classe, la sua interfaccia pubblica e I suoi dettagli realizzativi
Auto-valutazione 3. Come è possibile svuotare il conto bancario harryschecking usando I metodi dell interfaccia pubblica della classe? 4. Supponete di voler realizzare una più potente astrazione di conto bancario che tenga traccia di un numero di conto oltre al sando.come modifichereste l interfaccia pubblica per gestire questo miglioramento?
Risposte 3. harryschecking.withdraw(harryschecking.getbalance()) 4. Aggiungendo un parametro accountnumber nel costruttore, e aggiungendo un metodo getaccountnumber. Non abbiamo bisono di un metodo setaccountnumber il numero dell account non cambia mai dopo averlo creato.
Commenti nell Interfaccia Pubblica /** preleva denaro dal conto bancario. @param amount l importo da prelevare */ public void withdraw(double amount) { // realizzazione(completata in seguito) } /** Ispeziona il saldo attuale del conto corrente. @return il saldo attuale */ public double getbalance() { // realizzazione(completata in seguito) }
I commenti nelle Classi /** Un conto bancario ha un saldo che può essere modificato da depositi e prelievi. */ public class BankAccount {... } Fornire commenti di documentazione per Ogni classe Ogni metodo Ogni parametro Ogni valore di ritorno.
Sommario Metodi Javadoc Figure 3: Un riassunto dei metodi generato da javadoc
Sommario Metodi Javadoc Figure 4: Dettaglio di metodi generato da javadoc
Auto-valutazione 5. Supponete di aver migliorato la classe in modo che a ciascun conto sia associato un numero di conto univoco. Scrivete un commento per la documentazione del seguente costruttore: Public BankAccount(int accountnumber, double initialbalance) Continua
Auto-valutazione 6. Perchè il seguente commento per la documentazione non è adeguato? /** Ogni conto ha un numero di conto. @return il numero di conto di questo conto bancario. */ int getaccountnumber()
Risposte 5. /** Costruiamo un nuovo bankaccount con un bilancio iniziale. @param accountnumber il numero di conto di questo account @param initialbalance il bilancio iniziale di questo account */ 6. La prima frase della descrizione del metodo dovrebbe descrivere il metodo stesso
Campi di Istanza (o esemplare) Un oggetto memorizza I propri dati all interno di variabili (campi) Campo:un termine tecnico per identificare la posizione di un blocco di memoria Isanza di una classe: uno specifico oggetto di una classe La dichiarazione di classe specifica i campi di esemplare: public class BankAccount {... private double balance; }
Campi di Istanza La dichiarazione di un campo di istanza consiste nelle parti seguenti: Specificatori di acesso (come private) Tipo di variabile (come double) Nome di variabile (come balance) Ogni oggetto di una classe ha il proprio set di campi di istanza Bisognerebbe dichiarare tutti i campi di istanza come privati
Campi di Istanza Figure 5: CampidiIstanza
Sintassi 3.4:Dichiarazione dei Campi di Istanza specificatorediacesso class NomeClasse {... specificatorediaccesso tipovariabile NomeVariabile;... } Esempio: public class BankAccount {... private double balance;... } Obbiettivo: Definire un campo che sia presente in ciascun oggetto di una classe.
Accessi ai Campi di Istanza Il metodo deposit della classe BankAccount può accedere al campo di istanza private: public void deposit(double amount) { double newbalance = balance + amount; balance = newbalance; } Continua
Accessi ai Campi di Istanza Gli altri metodi non possono: public class BankRobber { public static void main(string[] args) { BankAccount momssavings = new BankAccount(1000);... momssavings.balance = -1000; // ERRORE } } Incapsulamento = Nascondere i Dati ed offrire l accesso solo attraverso i metodi pubblici
Auto-Valutazione 7. Supponete di modificare la classe BankAccount in modo che ogni conto bancario abbia un numero di conto. Come si modificano I campi di esemplare? 8. Quali sono I campi di esemplare della classe Rectangle?
Risposte 7. Un campo di istanza private int accountnumber; deve essere aggiunto alla classe 8. private int x; private int y; private int width; private int height;
Implementazione dei Costruttori I costruttori contengono istruzioni per inizializzare i campi di istanza di un oggetto public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }
Esempio di chiamata del Costruttore BankAccount harryschecking = new BankAccount(1000); Crea un nuovo oggetto di type BankAccount Invoca il secondo costruttore (perchè è stato fornito un parametro di costruzione) Assegna il valore 1000 al parametro initialbalance Assegna al campo balance dell oggetto appena creatro il valore initialbalance Restituisce, come valore dell espressione new, un riferimento a un oggetto,che è la posizione in memoria dell oggetto appena creato Memorizza il riferimento all oggetto nella variabile harryschecking
Implementazione dei Metodi Alcuni metodi non hanno valore di ritorno public void withdraw(double amount) { double newbalance = balance - amount; balance = newbalance; } Alcuni metodi restituiscono un valore public double getbalance() { return balance; }
Esempio di chiamata dei Metodi harryschecking.deposit(500); Assegna il valore 500 al parametro amount Legge il valore del campo dell oggetto balance che è riferito da harryschecking Aggiunge il valore di amount a balance e immagazzina il risultato nella variabile NewBalance Immagazina il valore newbalance nel campo di istanza balance, sovrascrivendo il valore vecchio
Syntassi 3.5: L enunciato return return espressione; o return; Esempio: return balance; obbiettivo: Specificare il valore restituito da un metodo e terminare l esecuzione del metodo immediatamente. Il valore restituito diventa il valore dell espressione di invocazione del metodo
Il File BankAccount.java 01: /** 02: Un conto bancario ha un saldo che può essere modificato 03: da depositi e prelievi. 04: */ 05: public class BankAccount 06: { 07: /** 08: Costruisce un Bankaccount con saldo uguale a 0. 09: */ 10: public BankAccount() 11: { 12: balance = 0; 13: } 14: 15: /** 16: Costruisce un conto bancario con un saldo assegnato. 17: @param initialbalance il saldo iniziale 18: */ Continua
File BankAccount.java 19: public BankAccount(double initialbalance) 20: { 21: balance = initialbalance; 22: } 23: 24: /** 25: Versa denaro nel conto bancario. 26: @param amount l importo da prelevare 27: */ 28: public void deposit(double amount) 29: { 30: double newbalance = balance + amount; 31: balance = newbalance; 32: } 33: 34: /** 35: preleva denaro dal conto bancario. 36: @param amount l importo da prelevare Continua
File BankAccount.java 37: */ 38: public void withdraw(double amount) 39: { 40: double newbalance = balance - amount; 41: balance = newbalance; 42: } 43: 44: /** 45: Ispeziona il valore del saldo attuale. 46: @return il saldo attuale 47: */ 48: public double getbalance() 49: { 50: return balance; 51: } 52: 53: private double balance; 54: }
Auto-valutazione 9. Come è stato realizzato il metodo getwidth della classe Rectangle? 10. Come è stato realizzato il metodo translate della classe Rectangle?
Risposte 9. public int getwidth() { return width; } 10. C è più di una risposta corretta. Una possibile implementazione è la seguente: public void translate(int dx, int dy) { int newx = x + dx; x = newx; int newy = y + dy; y = newy; }
Collaudare una Classe Collaudare una classe: serve una classe col metodo main che contiene istruzioni per testare altre classi. Tipicamente si eseguono i passaggi seguenti: 1. Costruzione di uno o più oggetti della classe che si sta collaudando. 2. Invocazione di uno o più metodi 3. Visualizzazione di uno o più risultati Continua
Collaudare una Classe I dettagli per costruire i programmi variano. Nella maggior parte dei casi, bisogna eseguire questi passi: 1. Creare una nuova cartella per il vostro programma 2. Creare due file, uno per ciascuna classe. 3. Compilare entrambi I file 4. Eseguire il programma di collaudo.
File BankAccountTester.java 01: /** 02: Classe di collaudo per la classe BankAccount. 03: */ 04: public class BankAccountTeste 05: { 06: /** 07: Collauda I metodi della classe BankAccount. 08: @param args non utilizzato 09: */ 10: public static void main(string[] args) 11: { 12: BankAccount harryschecking = new BankAccount(); 13: harryschecking.deposit(2000); 14: harryschecking.withdraw(500); 15: System.out.println(harrysChecking.getBalance()); 16: } 17: }
Auto-Valutazione 11. Quando eseguite il programma BankAccountTester quanti oggetti di tipo BankAccount vengono costruiti? E quanti oggetti di tipo BankAccountTester?
Risposte 11. Un oggetto BankAccount, nessun oggetto BankAccountTester. L obbiettovo dela classe BankAccountTester è contenere solo il metodo main.
Categorie di Variabili Categorie di variabili Campi di Esemplare (balance in BankAccount) Variabili locali (newbalance nel metodo deposit) Variabili parametro (amount nel metodo deposit) Un campo di istanza appartiene ad un oggetto Il campo rimane attivo (accessibile) fino a quando nessun metodo viene piu usato (quando l oggetto non e piu referenziato)
Categorie di Variabili In Java, il garbage collector raccoglie oggetti quando essi non sono più usati Le variabili locali e parametro appartengono a un metodo I campi di istanza sono inizializzati a un valore di default, ma le variabili locali dei metodi vanno inizializzate
Tempo di vita delle Variabili harryschecking.deposit(500); double newbalance = balance + amount; balance = newbalance; Continua
Tempo di vita delle Variabili Figure 7: Tempo di vita delle Variabili Continua
Tempo di vita delle Variabili Figure 7: Tempo di vita delle Variabili
Auto-Valutazione 13. Cosa hanno in comune le variabili locali e le variabili parametro? 14. Durante l esecuzione del programma BankAccountTester del paragrafo precedente,quanti campi di esemplare,quante variabili locali e quante variabili parametro vengono create, e quali sono i loro nomi?
Risposte 13. Le variabili di entrambe le categorie appartengono a un metodo loro diventano vive quando il metodo viene chiamato, e muoiono quando il metodo termina. Differiscono nella loro inizializzazione. Le variabili parametro sono inizializzate con i valori passati alla chiamata; le variabili locali devono essere inizializzate esplicitamente. Continua
Risposte 14. Un campo di istanza,chiamato balance. Tre variabili locali, una chiamata harryschecking, la seconda chiamata newbalance (con i metodi deposit e withdraw); due variabili parametro, entrambe chiamate amount (nei due metodi deposit e withdraw).
Parametri impliciti ed espliciti nei metodi Il parametro impliciti di un metodo e l'oggetto tramite il quale è invocato il metodo La parola this denota il parametro implicito
Parametri impliciti ed espliciti nei metodi L'Uso di un nome di campo di istanza in un metodo denota il campo di istanza del parametro implicito (dell oggetto stesso, cioe ) public void withdraw(double amount) { double newbalance = balance - amount; balance = newbalance; }
Parametri impliciti ed espliciti nei metodi balance è il saldo (balance)dell'oggetto alla sinistra del punto: momssavings.withdraw(500) vuol dire double newbalance = momssavings.balance - amount; momssavings.balance = newbalance;
Parametri impliciti e this Ogni metodo ha un parametro implicito Il parametro implicito è sempre chiamato this Eccezione: Metodi Statici non hanno nessun parametro implicito double newbalance = balance + amount; // vuol dire davvero double newbalance = this.balance + amount;
Parametri impliciti e this Quando ci si riferisce ad un campo di istanza in un metodo, il compilatore lo applica automaticamente al parametro this momssavings.deposit(500);
Parametri impliciti e this Figure 8: I parametri impliciti di una chiamata a un metodo
Auto-Valutazione 15. Quanti parametri impliciti ed espliciti ci sono nel metodo withdraw della classe BankAccount,e quali sono I loro nomi e tipi? 16. Qualèilsignificatodithis.amount nel metodo deposit? Oppure, se l espressione è priva di significato,per quale motivo lo è?
Auto-Valutazione 17. Quanti parametri impliciti ed espliciti ci sono nel metodo main della classe BankAccountTester, e quali sono I loro nomi?
Risposte 15. Un parametro implicito, chiamato this, del tipo BankAccount, e un parametro esplicito, chiamato amount, del tipo double. 16. Non ci sono espressioni legali. Questa è del tipo BankAccount e la classe BankAccount non ha campi denominati amount. 17. Nessun parametro implicito il metodo è statico e un parametro esplicito, chiamato args.