Classi 15/12/2010. Astrazione, astrazione astrazione. Astrazione, astrazione astrazione. Astrazione, astrazione astrazione

Documenti analoghi
Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

Progetto di classi: Metodi Costruttori Documentazione e commenti Variabili di istanza (campi)

Scope e visibilità per classi

Oggetti. Oggetti e classi. Utilizzo di classi. Classe

Scope e visibilità per classi

Capitolo 3. Realizzare classi

Progettare le Classi

Livelli di astrazione

Capitolo 2. Utilizzare oggetti

Progettazione di classi

Tipi Fondamentali. C. Horstmann Fondamenti di programmazione e Java 2 3^ edizione Apogeo

Progettazione di classi

Capitolo 4. Tipi di dati fondamentali. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

I metodi statici non hanno il parametro implicito

Capitolo 4. Tipi di dati fondamentali

I metodi statici -1. Variabili statiche Vogliamo assegnare a ciascuncontoun numeroidentificativo diverso. I metodi statici -2

Esercizio: la classe CashRegister

Realizzare classi. Cosa abbiamo fatto finora. Realizzare classi. Realizzare classi. Realizzare classi. Realizzare classi

Programmazione ad oggetti

Capitolo 4. Tipi di dati fondamentali. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Progettazione di classi

14 - Metodi e Costruttori

Definizione di classi. Walter Didimo

Programmazione ad oggetti

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Capitolo 3. Realizzare classi. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione a oggetti

Concetti base. Java - package 2

Java: Definire Classi e Creare Oggetti

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

Una classe Borsellino. Tipi numerici di base - Costanti. Esempio d uso. Classe Borsellino cont d. Primi passi per l implementazione di Purse

Introduzione agli oggetti

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

Esempio: il conto bancario

Programmazione a Oggetti Lezione 7. Il linguaggio Java: aspetti generali

18 - Classi parzialmente definite: Classi Astratte e Interfacce

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fondamenti di Informatica T-1

Programmazione ad Oggetti. Java Parte II

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Modulo 2: Strutture fondamentali della programmazione Java

La programmazione ad oggetti (OOP)

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

Introduzione alla Programmazione in Java attraverso un esempio commentato

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Questi lucidi provengono dal capitolo 2 di:

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Il Linguaggio Java. Classe. Classi ed oggetti

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Programmazione con Java

Funzioni, Stack e Visibilità delle Variabili in C

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

Programmazione Java Finalization di oggetti, Package, Modificatori di accesso

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Metodi. Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere:

DataSet. ... public BankAccount getmaximum() { return x; }... private BankAccount maximum;... } DataSet

E' un meccanismo per estendere classi esistenti, aggiungendo altri metodi e campi.

Uso di metodi statici. Walter Didimo

sayhello public private protected return public class Greeter { public String sayhello() { String message = Hello, World! ; return message; } }

Ereditarietà (ultima)

Classi ed Oggetti in JAVA

Le basi del linguaggio Java

Lezione 9 programmazione in Java Classi come contenitori

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Esercitazione n 2. Obiettivi

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 07. Oggetti e Java. Marzo Programmazione Java 1

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Il concetto di Package

Laboratorio Progettazione Web Le funzioni in PHP. Angelica Lo Duca IIT-CNR 2012/2013

Introduzione Programmazione Java

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Programmazione Java Variabili membro, Metodi La parola chiave final

Le decisioni. Istruzione if. if (amount <= balance) balance = balance - amount; Sintassi: if (condizione) istruzione

GESTIONE DEGLI ERRORI

Operazioni numeriche - Input

Programmazione orientata agli oggetti Classi, package e file system. Package

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini

public protected private private package

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Definizione di metodi in Java

Progettazione By Contract

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Concetto di Funzione e Procedura METODI in Java

FUNZIONI COME COMPONENTI SW FUNZIONI COME COMPONENTI SW FUNZIONI MODELLO CLIENTE/SERVITORE

Programmazione Orientata agli Oggetti in Linguaggio Java

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Transcript:

Classi Introduzione al progetto di classi Metodi Costruttori Variabili di istanza (campi) Documentazione e commenti Astrazione, astrazione astrazione Astrazione, astrazione astrazione Anni 60/70: programmi e linguaggi manipolano valori primitivi numeri, caratteri, indirizzi dati di basso livello, inadeguati per lo sviluppo di applicazioni complesse Soluzione: astrazioni funzionali Astraggono computazioni di basso livello in primitive di linguaggio (black boxes funzionali) Linguaggi moderni: astrazioni di tipo black boxes utilizzate per realizzare nuovi classi di valori collezioni, componenti grafiche, streams di input/output, strutture di comunicazione (socket), Programmazione ad oggetti tipi = classi valori = oggetti Astrazione, astrazione astrazione Astrazione, astrazione astrazione Encapsulation: Il cliente di un oggetto conosce il suo comportamento esterno (interfaccia) non la struttura interna Interazione tra oggetti ben definita, perché si fonda solo sulle interfacce Maggiore efficienza, scalabilità, facilità di riuso e manutenzione... Nella programmazione si definiscono astrazioni buone e cattive con la stessa facilità Capire quello che caratterizza una buona scelta di progetto (una buona astrazione) è fondamentale nella formazione di un buon progettista software Regole di progetto OO Prima definisci l interfaccia delle classi Poi passa alla implementazione 1

Progetto di una classe Un conto bancario (BankAccount) Individuiamo il comportamento del conto Che interfaccia? Deposita un importo Preleva un importo Richiedi il saldo Interfaccia: metodi Metodi della classe BankAccount: deposit // deposito withdraw // prelievo getbalance // saldo Vogliamo fornire supporto per chiamate di metodo quali: harryschecking.deposit(2000); harryschecking.withdraw(500); System.out.println(harrysChecking.getBalance()); Interfaccia: metodi Specifica: livello di accesso (public) tipo del risultato (String,, void) nome del metodo (deposit) lista di parametri per ciascun metodo (double amount) semantica Sintassi: definizione di metodi accessspecifier returntype methodname(partype parname,...) corpo del metodo Esempio: public void deposit(double amount) Interfaccia: metodi Interfaccia: costruttore public void deposit(double amount) public void withdraw(double amount) public double getbalance() Un costruttore inizializza lo stato interno dell oggetto Nome del costruttore = nome della classe public BankAccount() // corpo 2

Interfaccia: costruttore Sintassi: definizione del costruttore Il corpo del costruttore eseguito quando l oggetto viene creato con new definisce la struttura dell oggetto creato Una classe può avere più costruttori, tutti con lo stesso nome (il nome della classe) purché tutte abbiano parametri diversi Il compilatore distingue le diverse definizioni basandosi sul tipo degli argomenti accessspecifier ClassName(parameterType parametername, ) corpo del costruttore Esempio: public BankAccount(double initialbalance) BankAccount: Interfaccia pubblica BankAccount: Interfaccia pubblica I costruttori ed i metodi public di una classe formano l interfaccia pubblica della classe class BankAccount // Costruttori public BankAccount() // corpo da definire public BankAccount(double initialbalance) // corpo da definire // Metodi public void deposit(double amount) // corpo da definire public void withdraw(double amount) // corpo da definire public double getbalance() // body--filled in later // campi privati / rappresentazione da definire Sintassi: definizione di classe accessspecifier class ClassName costruttori metodi variabili di istanza (rappresentazione) Esempio: public class BankAccount public BankAccount(double initialbalance) public void deposit(double amount) Domande 1. Come possiamo utilizzare il metodi dell intefaccia pubblica per azzerare il saldo del conto harryschecking? 2. Supponiamo di estendere la classe permettendo di associare a ciascun conto un numero oltre al saldo. Come modifichereste l interfaccia pubblica della classe? A volte introdurremo le variabili di istanza come prima cosa 3

Risposte 1. harryschecking.withdraw(harryschecking.getbalance()) 2. Aggiungiamo un nuovo costruttore con un parametro accountnumber, ed un nuovo metodo getaccountnumber per avere accesso al nuovo dato. Ok, ma come ci assicuriamo che tutti i conti abbiano numeri diversi? Vedremo più avanti Documentazione /** Un conto bancario ha un saldo che può essere modificato mediante depositi e prelievi. */ class BankAccount Fornire documentazione per Tutte le classi Tutti i metodi Tutti i parametri Tutti i valori restituiti Documentazione dell interfaccia Javadoc /** Preleva dal conto. @param: amount - l importo da prelevare */ public void withdraw(double amount) // definizione in seguito /** Restituisce il saldo corrente del conto. @return il saldo */ public double getbalance() // definizione in seguito Javadoc Variabili di istanza Gli oggetti memorizzano il proprio stato ed i propri dati nelle variabili di istanza (campi) Istanza di una classe: un oggetto della classe La definizione di classe introduce le variabili di istanza, dichiarandole class BankAccount private double balance; 4

Variabili di istanza (campi) Variabili di Istanza La dichiarazione di una variabile di istanza include: Specifica dei diritti di accesso (private) Tipo della variabile (double) Nome della variabile (balance) Ciascun oggetto di una classe ha una copia distinta dei propri campi Sintassi: dichiarazione di campi class ClassName accessspecifier fieldtype fieldname; Esempio: class BankAccount private double balance; Accesso ai campi I campi non sono parte dell interfaccia, quindi dovrebbero sempre essere private e quindi non visibili dall esterno I metodi della classe, all inverso, hanno accesso ai campi (ovviamente!) Il metodo deposit() di BankAccount può accedere alla variabile balance: public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; Accesso ai campi Metodi di altre classi, all inverso, non possono class Ladro public static void main(string[] args) BankAccount momssavings = new BankAccount(1000); momssavings.balance = -1000; // COMPILER ERROR! Accesso ai campi Encapsulation raggruppare i dati e le operazioni in classi non è sufficiente a garantire l effetto black box per le istanze Necessaria l assistenza del compilatore Garantisce hiding di dati Per ogni classe esporta l interfaccia pubblica (il contratto tra la classe e i clienti) e maschera l implementazione privata che manipola lo stato dell oggetto In questo modo i i clienti dipendono solo dal contratto, e possiamo re-implementare i metodi senza dover modificare i clienti (codice mantenibile) 5

Implementazione di costruttori I costruttori definiscono codice per inizializzare le variabili di istanza public BankAccount() balance = 0; public BankAccount(double initialbalance) balance = initialbalance; Chiamata di un costruttore BankAccount harryschecking = new BankAccount(1000); Crea un nuovo oggetto di tipo BankAccount Chiama il secondo costruttore (visto che la chiamata fornisce un parametro) Inizializza la variabile di istanza balance dell oggetto appena creato al valore 1000 Restituisce un riferimento all oggetto appena creato come risultato della valutazione dell espressione new Memorizza il riferimento nella variabile harryschecking Implementazione di metodi Un metodo che non restituisce valori public void withdraw(double amount) double newbalance = balance - amount; balance = newbalance; Un metodo che restituisce un valore public double getbalance() return balance; Nulla di strano File BankAccount.java 01: /** 02: Un conto bancario ha un saldo che può essere 03: modificato mediante depositi e prelievi. 04: */ 05: public class BankAccount 06: 07: /** 08: Costruisce un conto bancario con saldo zero 09: */ 10: public BankAccount() 11: 12: balance = 0; 13: 14: 15: /** 16: Costruisce un conto con un dato saldo iniziale. 17: @param initialbalance il saldo iniziale 18: */ File BankAccount.java 19: public BankAccount(double initialbalance) 20: 21: balance = initialbalance; 22: 23: 24: /** 25: Deposita un importo sul conto. 26: @param amount l importo da depositare 27: */ 28: public void deposit(double amount) 29: 30: double newbalance = balance + amount; 31: balance = newbalance; 32: 33: 34: /** 35: Preleva un importo dal conto. 36: @param amount l importo da prelevare File BankAccount.java 37: */ 38: public void withdraw(double amount) 39: 40: double newbalance = balance - amount; 41: balance = newbalance; 42: 43: 44: /** 45: Restituisce il saldo corrente. 46: @return saldo corrente 47: */ 48: public double getbalance() 49: 50: return balance; 51: 52: // rappresentazione 53: private double balance; 54: 6

Domanda 3. Come modifichereste la definizione della classe BankAccount.java per associare a ciascun conto un numero? Risposte 3. Aggiungendo un nuovo campo private int accountnumber; e definendo come segue l implementazione del costruttore e del metodo di accesso public BankAccount(double initbalance, int number) balance = initbalance; accountnumber = number; public int getaccountnumber() return accountnumber; ; Esercizio Vogliamo estendere la classe BankAccount fornendo ai conti bancari le seguenti caratteristiche: per eseguire le operazioni di prelievo, deposito e richiesta saldo su un conto e necessario prima autenticarsi Una volta che ci siamo autenticati, inizia una sessione durante la quale possiamo eseguire le operazioni; Al termine delle operazioni possiamo chiudere la sessione. Classi Test / Applicazione Ricordiamo Classe applicazione: una classe con un metodo main che contiene codice lanciare la computazione utilizzando le classi che compongono il programma La struttura tipica di una classe test: 1. Costruisci uno o più oggetti 2. Invoca i metodi sulle diverse istanze 3. Stampa i risultati Classi Test / Applicazione Le prassi per costruire applicazioni che consistono di più classi variano a seconda del sistema ospite. Tipicamente i passi sono: 1. Crea una nuova directory / folder 2. Costruisci un file per classe e includi nella directory 3. Compila tutti I file della directory 4. Lancia la classe test File BankAccountApp.java 01: /** 02: Una classe applicazione per la classe BankAccount. 03: */ 04: public class BankAccountApp 05: 06: /** 07: Testa 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: 7

Domanda 7. Quando lanciamo la classe BankAccountApp, quante istanze della classe BankAccount vengono costruite? Quanti oggetti di tipo BankAccountApp? Risposta 7. Un oggetto di tipo BankAccount, nessun oggetto di tipo BankAccountTester. Lo scopo della classe applicazione è solo quello di definire il metodo main. Categorie di Variabili Categorie di variabili di istanza (balance in BankAccount) locali (newbalance nel metodo deposit()) parametri (amount per il metodo deposit()) variabili di istanza / campi appartengono ad uno (ed un solo oggetto) Lifetime = lifetime degli oggetti a cui appartengono variabili locali ed i parametri appartengono ai metodi in cui sono dichiarati Lifetime = esecuzione dei metodi che le dichiarano Categorie di Variabili Il garbage collector libera periodicamente la memoria dagli oggetti non più utilizzati (garbage) Le variabili di istanza sono inizializzate con valori default; le variabili locali devono essere inizializzate esplicitamente. Lifetime delle variabili Lifetime delle variabili Consideriamo l invocazione harryschecking.deposit(500); ricordando public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; 8

Lifetime delle variabili Lifetime delle variabili public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; Lifetime delle variabili Domanda 8. Cosa hanno in comune le variabili locali e i parametri? In cosa differiscono in modo fondamentale? public void deposit(double amount) double newbalance = balance + amount; balance = newbalance; Risposta Domanda 8. In comune: Scope: il corpo del metodo Lifetime: tempo di chiamata. 9. Quali sono le variabili di istanza e le variabili locali create durante l esecuzione della applicazione BankAccountTester? Differiscono per l inizializzazione: i parametri sono inizializzati ai valori degli argomenti, le locali devono essere inizializzate esplicitamente. 01: /** 02: Una classe test per la classe BankAccount. 03: */ 04: public class BankAccountTester 05: 06: /** 07: Testa 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: 9

Risposta 9. Tre variabili locali harryschecking newbalance nel metodo deposit newbalance nel metodo withdraw Una variabile di istanza, balance all interno di harryschecking Parametri impliciti ed espliciti Ricordiamo: ogni metodo ha un parametro implicito, che rappresenta l oggetto su cui il metodo viene invocato Il nome dei campi nel corpo di un metodo sono riferiti a questo oggetto Parametri impliciti ed espliciti public void withdraw(double amount) double newbalance = balance - amount; balance = newbalance; balance è il campo dell oggetto su cui il metodo viene invocato, quindi this Il parametro implicito è denotato da this public void withdraw(double amount) double newbalance = this.balance - amount; this.balance = newbalance; momssavings.withdraw(500); significa double newbalance = momssavings.balance - amount; momssavings.balance = newbalance; this this Quando invochiamo un metodo su un oggetto, questo viene automaticamente legato a this. momssavings.deposit(500); 10

Domande 10. Quale è il tipo del parametro implicito nel metodo withdraw() della classe BankAccount? 11. Nel metodo withdraw(), avrebbe senso utilizzare this.amount al posto di amount? 12. Quali sono i parametri impliciti ed espliciti del il metodo main() della classe BankAccountApp? Risposte 10. BankAccount. 11. Non è legale. this ha tipo BankAccount e BankAccount non ha un campo amount. 12. Nessun parametro implicito in quanto il metodo è statico. Un parametro esplicito: args. Domanda 13.I metodi si possono considerare essenzialmente simili alle funzioni? Quali sono gli aspetti comuni e quali le differenze? Risposta 13. I metodi e le funzioni si basano sugli stessi meccanismi di chiamata/ritorno e di passaggio di parametri Differiscono in modo essenziale per il fatto che: un metodo è sempre associato ad un oggetto invocato con un messaggio a quell oggetto una funzione è definita in modo indipendente da un oggetto invocata passando un valore come argomento Passaggio di parametri Call by value: Copia il valore di ciascun argomento nel corrispondente parametro formale. Non permette di modificare gli argomenti Call by reference: Associa il riferimento di ciascun argomento al corrispondente parametro formale Permette di modificare gli argomenti In Java: call by value Ma passando riferimenti by value otteniamo l effetto desiderato Call by value Modifiche dirette dei parametri non hanno effetti sugli argomenti public class BankAccount public void transfer(double amount, BankAccount otheraccount) balance = balance - amount; double newbalance = otheraccount.balance + amount; otheraccount = new BankAccount(newBalance); // ATTENZIONE 11

Esempio harryschecking.transfer(500, savingsaccount); Call by value Un metodo può comunque modificare lo stato degli argomenti di tipo riferimento (anche se non può modificare direttamente gli argomenti) Domanda 14.Come modifichereste il codice del metodo transfer per ottenere l effetto desiderato? Risposta 14. Due possibili soluzioni public void transfer(double amount, BankAccount other) balance = balance - amount; other.balance = other.balance + amount; o meglio ancora public void transfer(double amount, BankAccount other) widthdraw(amount); other.deposit(amount); Scope delle variabili SCOPE DI UNA VARIABILE: la regione che va dalla sua dichiarazione alla fine del blocco in cui la dichiarazione è inclusa Al solito, ma esistono diversi tipi di variabili e diversi tipi di blocchi: Variabili locali: blocco = metodo Campi: blocco dipende dai diritti di accesso definiti nella dichiarazione Scope delle variabili locali Variabili con scope diverso sono diverse indipendentemente dal nome: public class RectangleTester public static double area(rectangle rect) double r = rect.getwidth() * rect.getheight(); return r; public static void main(string[] args) Rectangle r = new Rectangle(5, 10, 20, 30); double a = area(r); System.out.println(r); 12

Scope delle variabili locali ATTENZIONE: lo scope di una locale non può contenere la dichiarazione di una variabile con lo stesso nome strano ma vero! Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) double r = Math.sqrt(x); // ERRORE Scope e diritti di accesso Lo scope delle variabili di istanza dipende dalla loro dichiarazione di accesso. regole valgono uniformemente tutti gli elementi (members) della classe (variabili, costanti metodi, classi interne ) Members private: accessibili da qualunque punto della classe (in particolare in tutti i metodi della classe) Members public: accessibili da tutti i metodi della classe e da metodi di altre classi mediante accessi qualificati rect.getwidth();// getwidth() public in Rectangle Math.sqrt( ); // public static in Math Scope e diritti di accesso Scope e diritti di accesso public class A private int privata; public int pubblica; private int privm () return privata; public int pubm () return privata + pubblica; public int binm (A other) return privata + other.privata; // OK public class TestAccessi public void accessi() A a1 = new A(); a1.privata = 3; // KO a1.pubblica = 6;// OK a1.privm(); // KO a1.pubm (); // OK A a2 = new A(); a2.binm(a1); // OK All interno di un metodo non è necessario qualificare i campi o metodi dell oggetto corrente Membri non qualificati sono riferiti a this public class BankAccount public void transfer(double amount, BankAccount other) withdraw(amount); // this.withdraw(amount); other.deposit(amount);... Scope sovrapposti Una variabile locale, o un parametro, possono mascherare un campo con lo stesso nome public class Coin public double getexchangevalue(double exchangerate) double value; // Variabile locale return value; private String name; private double value; // Campo con lo stesso nome Scope sovrapposti I campi mascherati da locali sono ancora accessibili mediante accessi qualificati da this value = this.value * exchangerate; 13

Costruttori regole sintattiche: il nome del costruttore deve essere quello della classe non ha un tipo di ritorno puo essere dotato di qualsiasi modificatore di accesso ogni classe ha almeno il default constructor senza parametri. Costruttori annidati Quando si hanno piu costruttori, questi possono anche chiamarsi in modo "annidato", usando this(...) public class BankAccount private int accountnumber; private double balance; private static int nextaccountnumber = 1000; public BankAccount(double balance) this.balance = balance; accountnumber = nextaccoutnumber++; Il default constructor ha lo stesso livello di accessibilita della classe per cui e definito public BankAccount() this(0); deve necessariamente essere il primo statement del costrutture Costruttori e Inizializzazioni Per garantire l inizializzazione dei campi di un oggetto possiamo usare anche inizializzazioni esplicite: Assegnando dei valori ai campi dati direttamente al momento della loro dichiarazione Scrivendo dei blocchi di inizializzazione: blocchi di codice definiti dentro la classe ma fuori da metodi e costruttori I blocchi di inizializzazione sono utili per definire una parte di codice comune a tutti i costruttori Costruttori e Inizializzazioni public class Init // inizializzazioni esplicite: 1 private int id; private int x = 65; private String name; private Rectangle d = new Rectangle(); private static int nextid = 1; // blocco di inizializzazione: 2 id = nextid; nextid = nextid +1; // costruttori: 3 Init(String n) name=n; Init(String n, Rectangle d) name=n;this.d=d; Metodi static I metodi static sono definiti all interno di classe, ma non sono associati ad oggetti non sono invocati su oggetti Quando definire un metodo static? quando il metodo opera solamente sui propri parametri (quindi, di fatto, è una funzione) Un caso tipico: metodi che operano su interi/floats. interi non sono oggetti e quindi non possiamo associargli dei metodi. Metodi static Esempio public class Financial public static double percentof(double p, double a) return (p / 100) * a; // 14

Metodi statici Metodi static Altri esempi ben noti main() i metodi della classe Math Math.sqrt(x) Math.pow(x, y) Math.exp(x) Math.log(x) Math.sin(x), Math.cos(x), Math.tan(x) Math.round(x) Math.min(x,y), Math.max(x,y) Radice quadrata Potenza x y Esponenziate e x Logaritmo naturale Funzioni trigonometriche (x in radianti) Attotondamento Minimo, massimo Poichè appartengono alla classe e non sono riferibili ad alcuna istanza, all interno di questi metodi il parametro implicito this è indefinito Quindi all interno di questi metodi non si può far riferimento ad alcun campo dell oggetto corrente Metodi static Attenzione agli accessi Metodi static Correggiamo così public class BankAccount public static boolean samebalance(bankaccount other) return other.balance == balance; // ERRORE! public class BankAccount public static boolean samebalance(bankaccount other) return other.balance == balance; // OK Metodi static Correggiamo così Metodi static Oppure così public class BankAccount public static boolean samebalance(bankaccount b1, BankAccount b2) return b1.balance == b2.balance; // OK public class BankAccount public static boolean samebalance(bankaccount b1, BankAccount b2) return b1.balance == b2.balance; // OK 15

Chiamata di metodi statici All interno della classe in cui sono definiti Stessa sintassi utilizzata per i metodi non-static All esterno della classe di definizione Utilizziamo il nome della classe invece del riferimento ad un oggetto: Domande È corretto invocare x.pow(y) per calcolare x y? Quale delle due istruzioni è più efficiente tra x*x e Math.pow(x,2) double tax = Financial.percentOf(taxRate, total); Risposte No: x è un numero, non un oggetto, e non è possibili invocare un metodo su un numero x*x la seconda espressione coinvoge una chiamata di metodo, passaggio di parametri etc, tutte operazioni costose Domanda Come utilizzereste la classe MyMath qui di seguito per calcolare la radice quadrata di 5? public class MyMath public double sqrt(double x) return Math.sqrt(x); Risposta (new MyMath()).sqrt(5); Campi static (class variables) Un campo static appartiene alla classe, non ad alcuna delle istanze della classe public class BankAccount private double balance; private int accountnumber; private static int lastassignednumber = 1000; Una sola copia di lastassignednumber, accessibile solo all interno della classe 16

Campi static Campi e campi static La nuova definizione del costruttore /** Genera il prossimo numero di conto da assegnare */ public BankAccount() lastassignednumber++; accountnumber = lastassignednumber; Questo è un uso tipico dei campi static Altro caso di utilizzo: definizione di costanti (campi static e final) Campi static Tre modalità di inizializzazione: 1. Automatica: inizializzati ai valori di default. 0 (per numeri), false (per booleani), null (per oggetti) 2. Mediante un inizializzatore esplicito public class BankAccount private static int lastassignednumber = 1000; // Eseguito una volta sola, // quando la classe viene caricata Campi static Allocazione/Deallocazione: vengono creati quando viene caricata la classe, continuano ad esistere finchè esiste la classe, quindi durante tutta l'esecuzione. 3. Mediante un blocco di inizializzazione static Campi static Come tutti i campi, preferibilmente dichiarati private Eccezioni: costanti public class BankAccount public static final double OVERDRAFT_FEE = 5; // riferita mediante il nome qualificato // BankAccount.OVERDRAFT_FEE Accesso ai campi static All interno della classe in cui sono definiti Stessa sintassi utilizzata per i campi non-static Da una classe diversa da quella di definizione Utilizziamo il nome della classe invece del riferimento ad un oggetto: double fee = BankAccount.OVERDRAFT_FEE; 17

Domanda 14. Nominate due campi static della classe System. Risposta 14. System.in e System.out Domanda 15. L istruzione System.out.println(4) denota una chiamata di metodo static? Risposta No: il metodo println() è invocato qui sull oggetto System.out Costanti: final Una variabile final è una costante Una volta inizializzata, non è possibile modifcarne il valore Convenzione: i nomi delle variabili usano solo caratteri MAIUSCOLI final double QUARTER = 0.25; final double DIME = 0.1; final double NICKEL = 0.05; final double PENNY = 0.01; Constanti: static final Costanti utilizzate da più di un metodo possono essere dichiarate come campi, e qualificate come static e final Le costanti static final possono inoltre essere dichiarate public per renderle disponibili ad altre classi public class Math public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; double circonferenza = Math.PI * diametro; 18

Sintassi: definizione di costante File CashRegister.java In un metodo final typename variablename = expression ; In una classe: accessspecifier static final typename variablename = expression; Esempio final double NICKEL_VALUE = 0.05; public static final double LITERS_PER_GALLON = 3.785; 01: /** 02: Un Registratore di cassa che calcola il costo degli acquisti e determina il resto. 03: */ 04: public class CashRegister 05: 06: /** 07: Costruisce un registratore di cassa vuoto. 08: */ 09: public CashRegister() 10: 11: purchase = 0; 12: payment = 0; 13: 14: File CashRegister.java 15: /** 16: Aggiunge un importo al conto corrente. 17: @param amount l importo da aggiungere al conto 18: */ 19: public void addpurchase(double amount) 20: 21: purchase = purchase + amount; 22: File CashRegister.java 23: 24: /** 25: Registra il pagamento ricevuto dal cliente. 26: @param dollars il numero di dollari del pagamento 27: @param quarters il numero di quarters del pagamento 28: @param dimes il numero di dimes del pagamento 29: @param nickels il numero di nickels del pagamento 30: @param pennies il numero di pennies del pagamento 31: */ 32: public void enterpayment(int dollars, int quarters, 33: int dimes, int nickels, int pennies) 34: 35: payment = dollars + quarters * QUARTER_VALUE + dimes * DIME_VALUE 36: + nickels * NICKEL_VALUE + pennies * PENNY_VALUE; 37: Continued File CashRegister.java File CashRegister.java 38: 39: /** 40: Calcola il resto e resetta il registratore per cliente successivo 41: @return il resto dovuto al cliente 42: */ 43: public double givechange() 44: 45: double change = payment - purchase; 46: purchase = 0; 47: payment = 0; 48: return change; 49: 50: 51: public static final double QUARTER_VALUE = 0.25; 52: public static final double DIME_VALUE = 0.1; 53: public static final double NICKEL_VALUE = 0.05; 54: public static final double PENNY_VALUE = 0.01; 55: 56: private double purchase; 57: private double payment; 58: 19

File CashRegisterTester.java File CashRegisterTester.java 01: /** 02: Tester per la classe CashRegister. 03: */ 04: public class CashRegisterTester 05: 06: public static void main(string[] args) 07: 08: CashRegister register = new CashRegister(); 09: 10: register.addpurchase(0.75); 11: register.addpurchase(1.50); 12: register.enterpayment(2, 0, 5, 0, 0); 13: System.out.print("Change="); 14: System.out.println(register.giveChange()); 15: 16: register.addpurchase(2.25); 17: register.addpurchase(19.25); 18: register.enterpayment(23, 2, 0, 0, 0); 19: System.out.print("Change="); 20: System.out.println(register.giveChange()); 21: 22: Output Change=0.25 Change=2.0 Domanda Quale è la differenza tra i due comandi seguenti? Risposta La prima definizione è all interno di un metodo, la seconda in una classe final double CM2INCH = 2.54; e public static final double C2INCH = 2.54; Packages Package: insieme di classi e interfacce in relazione Per formare un package basta inserire la direttiva package packagename; come prima istruzione nel file sorgente Una sola direttiva per file Classi contenute in file che non dichiarano packages vengono incluse in un package anonimo package anonimo OK solo per micro applicazioni, o in fase di sviluppo Packages Package Finalità Classe Tipica java.lang Supporto al linguaggio Math, String java.util Utilities Random java.io Input e Output PrintStream Java.awt Abstract Window Toolkit Color Java.applet Applets Applet Java.net Networking Socket Java.sql Accesso a database ResultSet Java.swing Ingerfaccia utente Swing JButton 20

Accesso agli elementi di un package Per accedere ai tipi di un package utilizziamo il nome qualificato java.util.scanner in = new java.util.scanner(system.in); Uso dei nomi qualificati verboso import permette sintesi import java.util.scanner; Scanner in = new Scanner(System.in) Import di una classe import java.util.scanner; Scanner in = new Scanner(System.in) di tutte le classi di un package import java.util.*; Import Packages non formano gerarchie // import dei tipi di java.awt.color import java.awt.color.*; // import dei tipi di java.awt (non del package color!) import java.awt.*;// import dei tipi di java.awt. Static import delle costanti e metodi statici dei tipi di un package import static java.lang.math.pi import static java.lang.math.*;. Nomi di package Packages utili anche come namespaces per evitare conflitti di nomi (per classi/interfacce) Esempio, Java ha due classi Timer java.util.timer vs. javax.swing.timer Nomi di package devono essere univoci Convenzione: utilizziamo come prefissi domini internet, oppure indirizzi e-mail (in ordine inverso) it.unive.dsi it.unive.dsi.mp Localizzazione di package Nomi di package devono essere consistenti con i path della directory che li contengono it.unive.dsi.mp.banking Deve essere contenuto in un folder/directory localizzato nel path corrispondente UNIX: <base directory>/it/unive/dsi/mp/banking WINDOWS: <base directory>\it\unive\dsi\mp\banking Localizzazione di package CLASSPATH: definisce le directory base dove localizzare i packages Spesso utili due directory base per file sorgenti (.java) per file compilati (.class) UNIX: export CLASSPATH=/home/mp/java/src:/home/mp/java/classes:. WINDOWS: set CLASSPATH=c:\home\mp\java\src;\home\mp\java\classes;. 21