Programmazione ad oggetti in Java Programmazione ad oggetti in Java Daniela Micucci Outline La programmazione ad oggetti Classi e istanze Associazioni fra classi Incapsulamento Costruttori 2 Programmazione ad oggetti in Java 1 Programmazione ad oggetti in Java OOP Java è un linguaggio di programmazione ad oggetti Cos’è l’Object Oriented Programming (OOP)? Cosa sono gli oggetti? Oggetti il mondo che ci circonda è costituito da oggetti ognuno di questi oggetti ha la capacità di eseguire certe azioni e ognuna di queste azioni ha effetti su qualche altro oggetto nel mondo le persone, le auto, i palazzi, etc. OOP È una metodologia programmativa che vede il programma come costituito da oggetti che interagiscono fra loro per mezzo di azioni ciò è facile da capire se gli oggetti sono la rappresentazione di quelli reali 3 Programmazione ad oggetti in Java Un po’ di storia In principio era sistema di processi (“Algoritmi + strutture dati = programmi” Wirth) Algoritmi focus sul sistema come “calcolatore” sviluppo dei linguaggi di programmazione (procedurali, funzionali, etc.) Dati 4 focus sul sistema come “banca dati” sviluppo dei DBMS Programmazione ad oggetti in Java 2 Programmazione ad oggetti in Java I problemi di un tale approccio Chi manipola cosa? ovvero quale algoritmo manipola quali dati? La definizione di componente risulta difficile se non impossibile Scelte progettuali legate all’implementazione Difficoltà nel testing e nella manutenzione Difficile riuso … 5 Programmazione ad oggetti in Java La soluzione L’incapsulamento realizzare componenti software come “black box” definire in maniera precisa le interfacce delle componenti realizzare una completa indipendenza interfacciaimplementazione ... che porta alla: 6 componibilità riusabilità manutenibilità Programmazione ad oggetti in Java 3 Programmazione ad oggetti in Java L’approccio object-oriented Un oggetto è una black box che incapsula dati e algoritmi oggetto = Dati+Algoritmi dati: determinano lo stato dell’oggetto insieme dei valori di attributi (variabili) metodi: realizzano gli algoritmi e manipolano lo stato comandi per la manipolazione dello stato Il sistema è visto, quindi, come una collezione di oggetti che interagiscono fra loro tramite lo scambio di messaggi (invocazione di metodi) 7 Programmazione ad oggetti in Java Incapsulamento Definizione: “un oggetto è frutto della incapsulazione in un’unica struttura software di dati e funzioni e consiste di una porzione pubblica (interfaccia) e di una privata (implementazione)” interfaccia visibile: implementazione invisibile: 8 comandi invocabili dall’esterno (cioè da altri oggetti) variabili locali (attributi di istanza) metodi (procedure) che eseguono comandi Programmazione ad oggetti in Java 4 Programmazione ad oggetti in Java Cos’è un oggetto? Un oggetto è la rappresentazione di un’entità reale o concettuale per esempio: il mio gatto, il tuo telefono, la tua applicazione, l’evento di un click del mouse, etc. frutto di un processo di astrazione che porta a estrarre solo le caratteristiche salienti per una data applicazione non si considerano tutte le peculiarità, ma solo alcune 9 Programmazione ad oggetti in Java Astrazione Oggetti Rappresentazione Mondo reale 10 Programmazione ad oggetti in Java 5 Programmazione ad oggetti in Java Le caratteristiche di un oggetto Un oggetto ha tre caratteristiche: stato, comportamento e identità stato: è una delle possibili condizioni in cui può trovarsi comportamento: determina come un oggetto risponde alle richieste di altri oggetti è dato dal valore dei suoi attributi è definito dalle sue operazioni identità: due oggetti anche se si trovano nello stesso stato, sono comunque due entità ben distinte 11 Programmazione ad oggetti in Java Lo stato È determinato dalle variabili definite Le variabili sono chiamate attributi o variabili d’istanza Gli attributi di un oggetto possono essere tipi semplici o a loro volta oggetti 12 Es. Una linea telefonica possiede uno stato che è determinato dal suo numero, dal fatto che sia in uso o meno e da un’altra linea telefonica su cui effettuare il dirottamento delle chiamate Programmazione ad oggetti in Java 6 Programmazione ad oggetti in Java Comportamento È la modalità con cui un oggetto risponde alle richieste da parte di altri oggetti Gli oggetti comunicano tra loro scambiandosi messaggi (chiamati anche comandi) attraverso le rispettive interfacce I messaggi attivano i metodi che determinano il comportamento degli oggetti i metodi sono l’implementazione di una procedura che esegue un comando 13 Programmazione ad oggetti in Java Identità Due oggetti sono due entità diverse anche se possiedono lo stesso stato Ogni oggetto ha un proprio OID (Object IDentifier) che è Es. due biciclette di marca, modello e colore uguali sono comunque due entità a se stanti univoco nel sistema invariante nel tempo Un oggetto esiste indipendentemente dal valore dei suoi attributi (le proprietà che ne identificano lo stato) 14 Programmazione ad oggetti in Java 7 Programmazione ad oggetti in Java Come creo gli oggetti? Per poter creare oggetti serve un modello che incorpora le caratteristiche di stato e di comportamento di un oggetto da cui partire È una sorta di modulo che definisce oggetti omogenei una volta per tutte Una volta definito è possibile creare gli oggetti Tale modello si chiama classe 15 Programmazione ad oggetti in Java Astrazione Classi Classificazione Istanziazione Oggetti Rappresentazione Mondo reale 16 Programmazione ad oggetti in Java 8 Programmazione ad oggetti in Java Cos’è una classe? Tutti gli oggetti che condividono le stesse proprietà (gli attributi) e comportamenti (metodi) possono essere classificati insieme Una classe rappresenta una e una sola astrazione a partire dalla quale è possibile creare oggetti Es. Una Bicicletta è una classe che definisce certe caratteristiche comuni a tutte le biciclette intese come oggetti. Una particolare bicicletta si dice istanza della classe Bicicletta La classe è quella “struttura” che definisce le caratteristiche delle sue istanze L’istanza o oggetto è un esemplare creato a partire dalla sua classe 17 Programmazione ad oggetti in Java Come si definisce una classe La classe: specifica l’interfaccia che ogni suo oggetto offre verso gli altri con cui interagisce definizione (signature) dei comandi (o messaggi) definizione degli attributi “visibili” implementa 18 nome, tipo ritornato parametri formali attributi interni metodi interni operazioni dei metodi Programmazione ad oggetti in Java 9 Programmazione ad oggetti in Java Incapsulamento Un principio ferreo: una classe non deve mai rendere visibili all’esterno i suoi attributi ogni manipolazione dello stato delle sue istanze deve avvenire solo ed esclusivamente mediante operazioni definite dalla classe stessa Perché? Si può cambiare l’implementazione senza cambiare l’interfaccia e gli altri componenti non se ne accorgono modularità: si possono assemblare componenti diversi conoscendo solo l’interfaccia 19 Programmazione ad oggetti in Java Le classi come black box Implementazione invisibile Nome Interfaccia visibile attributo1 attributo2 attributoM comando1 comando2 metodo1 metodo2 metodoN Attributi (stato; visibilità limitata) manipolazioni Metodi (implementazione) comandi 20 attivazioni Programmazione ad oggetti in Java 10 Programmazione ad oggetti in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione: cioè la classe Si ricorda che un programma ad oggetti consiste di oggetti creati a partire da classi diverse che interagiscono fra loro public class NomeClasse { //Definizione Attributi di istanza o di classe //Implementazione Costruttori //Implementazione Metodi } 21 Programmazione ad oggetti in Java Come descrivere al programmatore le classi? Esempio classe Punto: «Realizzare una classe che rappresenta un punto in uno spazio bidimensionale a cui attribuire nome Punto. Qualsiasi oggetto creato a partire dalla classe Punto è caratterizzato dall’avere un attributo con identificativo x e di tipo int (che rappresenta l’ascissa) e un altro attributo con identificativo y e di tipo int (che rappresenta l’ordinata). Entrambi gli attributi hanno visibilità pubblica.» 22 Programmazione ad oggetti in Java 11 Programmazione ad oggetti in Java Rappresentazione in UML La classe Punto in un diagramma delle classi di design è rappresentata come in figura Punto + + Sintassi: x: int y: int Modificatore_di_visibilità Identificatore_dell’attributo: tipo Modificatore_di_visibilità: + indica public (appartenente all’interfaccia della classe) 23 Programmazione ad oggetti in Java Esempio: la classe Punto Definizione di classe Il nome della classe public class Punto { public int x; public int y; } Definizione degli attributi di istanza Modificatore di visibilità. public: appartiene all’interfaccia 24 Programmazione ad oggetti in Java 12 Programmazione ad oggetti in Java Come si crea un oggetto? dichiara, non crea NomeClasse nomeReference; crea nomeReference = new NomeClasse(); nomeReference.comando(); nomeReference.attributo; 25 accesso all’interfaccia pubblica Programmazione ad oggetti in Java Esempio: utilizzo della classe Punto Ogni attributo di istanza possiede un tipo! Punto p1; p1 = new Punto(); p1.x = 3; p1.y = 4; int valoreX = p1.x; int valorey = p1.y; 26 Programmazione ad oggetti in Java 13 Programmazione ad oggetti in Java Esempio Creare due punti e assegnare i valori per x e y 3 e 4 e 50 e 90. Stampare a video quale punto ha x maggiore public class TestPunto1 { public static void main(String a[]) { Punto p1, p2; p1 = new Punto(); p2 = new Punto(); p1.x = 3; p1.y = 4; p2.x = 50; p2.y = 90; if(p1.x >= p2.x) { System.out.println(Il punto p1 ha x maggiore); } else { System.out.println(Il punto p2 ha x maggiore); } } } 27 Programmazione ad oggetti in Java Esercizi Rettangolo Creare una classe che rappresenta un rettangolo Creare 2 istanze della classe assegnando valori per la base e l’altezza Calcolare l’area e il perimetro di entrambi indicando quale ha area e perimetro maggiore Auto 28 Creare una classe che rappresenta un’auto (proprietario, vel max e velocità corrente) Creare tre istanze della stessa assegnando i valori per gli attributi Determinare se le due istanze create hanno lo stesso stato! Programmazione ad oggetti in Java 14 Programmazione ad oggetti in Java Oggetti e reference Variabili di tipo classe (tipo p1 o p2 dell’esempio precedente) sono molto differenti rispetto a variabili di tipo primitivo (come int o char) Punto p1, p2; p1 = new Punto(); p2 = new Punto(); int n, m; n = 10; m = n; n = 9; System.out.println(“n ” + n + “ m ” + m); p1.x = 1; p1.y = 2; p2 = p1; p2.x = 3; p2.y = 4; System.out.println(“p1 x: ” + p1.x + “ y: ” + p1.y); System.out.println(“p2 x: ” + p2.x + “ y: ” + p2.y); ? 29 Programmazione ad oggetti in Java L’operatore = Il risultato di un assegnamento tra reference: fa si che l’oggetto a sinistra dell’assegnamento sia referenziato anche dal reference a destra 1) 2) p1 ? p2 ? Punto p1, p2; p1 p1 = new Punto(); p2 3) 30 x y ? p1 x y p2 x y p2 = new Punto(); Programmazione ad oggetti in Java 15 Programmazione ad oggetti in Java L’operatore = 4) 5) 6) p1 x=1 y p2 x y p1 x=1 y=2 p2 x y p1 x=1 y=2 p2 x y p1.x = 1; p1.y = 2; p2 = p1; 31 Programmazione ad oggetti in Java L’operatore == Permette di verificare se due reference referenziano lo stesso oggetto Esempio: Punto p1, p2; p1 = new Punto(); p2 = new Punto(); p1.x = 1; p1.y = 2; p2.x = 4; p2.y = 3; System.out.println(p1 == p2); p1 x=1 x=2 p2 x=4 y=3 p2 = p1; System.out.println(p1 == p2); p1 x=1 x=2 p2 x=4 y=3 La prima stampa stampa false, la seconda true 32 Programmazione ad oggetti in Java 16 Programmazione ad oggetti in Java La keyword instanceof Permette di verificare se un oggetto è stato istanziato a partire dalla classe specificata Sintassi: reference instanceof NomeClasse Esempio: Punto p1; p1 = new Punto(); if (p1 instanceof Punto) System.out.println(“p1 referenzia un oggetto” + “ di tipo Punto”); 33 Programmazione ad oggetti in Java La costante null Si indica con null la costante utilizzata per inizializzare un reference ad un valore di default usato anche per verificare se il reference è stato correttamente inizializzato dopo la dichiarazione Esempio: Punto p1 = null; if (p1 == null) { p1 = new Punto(); } else { System.out.println(“oggetto già istanziato”); } 34 Programmazione ad oggetti in Java 17 Programmazione ad oggetti in Java Esercizi Creare una classe che rappresenti una Bicicletta. La bicicletta è caratterizzata da avere un colore, una marca ed il numero di marce. Creare quindi una nuova classe (TestBicicletta) in cui vengono istanziate la bicicletta di colore blu, marca Bianchi e numero di marce 4 e la bicicletta di colore rosso, marca Bianchi e numero di marce 5. Stampare quindi a video lo stato dei due oggetti creati Creare una classe che rappresenti un DVD. Il DVD è caratterizzato dal titolo, dal nome del regista, dal tipo di film e dalla lunghezza (espressa in minuti) del movie. Creare quindi una nuova classe (TestDVD) in cui vengono istanziati 3 dvd i cui attributi verranno inizializzati dall’utente. Stampare quindi a video lo stato dei tre oggetti creati. Creare una classe (Moto) che rappresenti una moto (proprietario, modello, colore) Creare tre istanze della stessa assegnando i valori per gli attributi Stampare a video lo stato delle istanze Assegnare due reference allo stesso oggetto Stampare a video (dopo aver verificato) lo stato dell’istanza con un solo reference 35 Programmazione ad oggetti in Java Esercizi Creare una classe Auto (modello, proprietario, colore) Utilizzare la classe Moto (del punto precedente) Creare una classe TestVeicolo dove si istanziano 2 auto e 2 moto (inserimento dati dall’utente), stampare gli stati degli oggetti, indicando se sono auto o moto. Creare una classe StampaVeicoli, dove vengono istanziati 1 moto e 2 auto, dato a tutti il valore di default null, in un secondo momento fare inserire i dati di alcuni oggetti e stampare solo quelli diversi da null. 36 Programmazione ad oggetti in Java 18 Programmazione ad oggetti in Java Le associazioni Ogni sistema è composto da più classi Le associazioni collegano classi e sono il mezzo attraverso cui gli oggetti possono interagire Concetto molto simile a (derivato da) le relazioni nei diagrammi relazionali dei DB Un’associazione è un legame semantico fra classi; significa che fra i corrispondenti oggetti c’è un legame (detto link) Un link è un’istanza di associazione così come un oggetto è istanza di una classe Per default, un’associazione è bidirezionale, anche se può essere resa unidirezionale 37 Programmazione ad oggetti in Java Un esempio di associazione Motore Classe + + Auto +ilMotore numeroCilindri: int 1 potenza: int + + 1 + + marca: String modello: String velocitaMassima: int targa: String Classe Associazione Fra le classi Auto e Motore c’è un’associazione: questo significa che fra ogni istanza della classe auto e ogni istanza della classe motore c’è un link Oggetto : classe = link : associazione La navigabilità specifica in quale classe verrà codificata l’associazione 38 Programmazione ad oggetti in Java 19 Programmazione ad oggetti in Java Il codice public class Auto { public String marca; public String modello; … public Motore ilMotore; } public class Motore { public int cilindrata; public int potenza; … } public class Test { public static void main(String ar[]) { Auto a = new Auto(); Motore m = new Motore(); a.ilMotore = m; ... } } 39 Programmazione ad oggetti in Java Metodi: definizione Definire un metodo comporta la definizione di: intestazione (o signature) ci permette di invocare successivamente il metodo body definisce il comportamento del metodo la sequenza di istruzioni che devono essere eseguite Esistono 2 tipi di metodi: 40 quelli che eseguono esclusivamente istruzioni quelli che eseguono istruzioni e restituiscono un valore Programmazione ad oggetti in Java 20 Programmazione ad oggetti in Java Metodi: definizione dell’intestazione Intestazione o signature per metodi che esclusivamente eseguono operazioni: [modificatore/i] void nomeMetodo([lista parametri formali]) Esempi: public void variaVelocita(int nuovoValore) private void controllaPressione() Intestazione o signature per metodi che eseguono operazioni e ritornano valori: [modificatore/i] tipoRitorno nomeMetodo([lista parametri formali]) Esempi: public int calcolaArea() public boolean areaUguale(int valore) 41 Programmazione ad oggetti in Java Metodi: definizione del body Il corpo o boby del metodo contiene la sequenza di distruzioni che deve essere eseguita nel momento in cui il metodo viene invocato Il body è racchiuso tra parentesi graffe {} e segue la definizione della signature o intestazione del metodo stesso Se il metodo restituisce un valore, l’ultima istruzione che viene eseguita deve essere return valore; Se il metodo non restituisce valore non ho l’obbligo di inserire la keyword return 42 Programmazione ad oggetti in Java 21 Programmazione ad oggetti in Java Metodi: definizione del body esempi public boolean confrontaArea(int valore) { boolean confronto = false; if (area >= valore) { confronto = true; } else { confronto = false; } return confronto; } public boolean confrontaArea(int valore) { boolean confronto = false; if (area >= valore) { confronto = true; } return confronto; } public boolean confrontaArea(int valore) { if (area >= valore) { return true; } else { return false; } } 43 Programmazione ad oggetti in Java La descrizione dei metodi Tutti i metodi devono essere descritti La descrizione dovrebbe contenere: le precondizioni indicano le condizioni che devono essere vere prima di invocare il metodo il metodo non deve essere invocato se le precondizioni non sono verificate le postcondizioni 44 potrebbe fornire dei risultati non attesi descrivono gli effetti prodotti dall’invocazione del metodo esempio: ciò che viene restituito, se il metodo restituisce un valore; gli effetti sullo stato del calling object,se void, Programmazione ad oggetti in Java 22 Programmazione ad oggetti in Java Esempio descrizione Esempio: Sorgente (directory slide 45) LineaTelefonica 45 + + + numero: String prefissoNazionale: String prefissoInternazionale: String + + isInterurbana(String) : boolean componiNumero(String) : void Programmazione ad oggetti in Java La descrizione in Java Java fornisce un comando javadoc per generare file in formato HTML che descrivono l’interfaccia pubblica della classe Basta esprimere le precondizioni e le postcondizioni in maniera un po’ più formale È possibile commentare tutto ciò che appartiene all’interfaccia pubblica Esempio: 46 Sorgente (directory slide 46) per generare la documentazione: javadoc Sorgente.java LineaTelefonica.html (directory slide 46) Programmazione ad oggetti in Java 23 Programmazione ad oggetti in Java Incapsulamento L’incapsulamento permette di separare l’interfaccia dall’implementazione l’interfaccia contiene ciò che è visibile all’esterno (cioè a chi utilizza la classe incapsulata) l’implementazione tutti i dettagli implementativi che si vogliono nascondere a chi utilizza la classe incapsulata Che vantaggi nell’effettuare incapsulamento? Riuso del codice Un programmatore che usa un metodo che è stato definito da altri non necessita di conoscere i dettagli implementativi (il body!) Il programmatore devo solo conoscere cosa il metodo fa e non come lo fa Possibilità di modificare l’implementazione (ad esempio per rendere la classe più efficiente) senza che le classi che utilizzano quella modificata se ne accorgano esempio: voi utilizzate il metodo SavitchIn.readInt() sapendo che legge da input standard un valore intero, ma non vi siete mai chiesti come lo fa (e non vi interessa!!!!) mi accorgo che l’implementazione del metodo la cui interfaccia è cercaCarattere utilizza un algoritmo troppo inefficiente, lo modifico lasciando inalterata l’interfaccia Stato dell’oggetto sempre consistente incapsulo gli attributi e permetto la loro modifica attraverso metodi che appartengono all’interfaccia e che effettuano i controlli 47 Programmazione ad oggetti in Java Esempio in cui cambio l’implementazione public class LineaTelefonica{ public String numero; In blu ciò che appartiene all’interfaccia In nero ciò che apprtiene all’implementazione public String restituisciPrefissoInternazionale() { String nazione = numero.substring(0, 4); return nazione; } } LineaTelefonica + numero: String + restrituisciPrefissoInternazionale() : String public class LineaTelefonica{ public String numero; public String restituisciPrefissoInternazionale() { String nazione = ""; for(int i=0; i<4; i++) { nazione = nazione + numero.charAt(i); } tutto ciò che dichiaro return nazione; public appartiene all’interfaccia } } 48 Programmazione ad oggetti in Java 24 Programmazione ad oggetti in Java Esempio La classe Semaforo rappresenta un semaforo di un incrocio stradale public class Semaforo{ public String colore; public void cambiaColore() { if (colore.equals("rosso")) { colore = "verde"; } else { if (colore.equals("verde")) { colore = "giallo"; } else { if (colore.equals("giallo")) { colore = "rosso"; } } } } Semaforo + colore: String + cambiaColore() : void } 49 Programmazione ad oggetti in Java Esempio public class Semaforo{ public static void main(String a[]) { Semaforo s1 = new Semaforo(); s1.colore = "rosso"; s1.cambiaColore(); s1.cambiaColore(); s1.colore = "blu"; //Errore } } L’implementazione di Semaforo è incapsulata? Posso modificare l’implementazione senza che la classe TestSemaforo debba moficarla? Posso ignorare i dettagli implementativi in fase di utilizzo della classe Semaforo? L’oggetto s1 rimane sempre in uno stato consistente? 50 No! Cambio il tipo di colore da String a int e il main non funziona piu’! No! Avendo la possibilità di accedere a colore, devo sapere di che tipo è No! Posso assegnare il colore blu senza alcun problema. Ma si è mai visto un semaforo blu? Programmazione ad oggetti in Java 25 Programmazione ad oggetti in Java Realizzare l’incapsulamento Distinguere fra interfaccia e implementazione Gli attributi di istanza sono un dettaglio implementativo, il significato è dato dalle operazioni che le manipolano Soluzione: modificatori di visibilità per impedire a chi usa oggetti acceda direttamente agli attributi in scrittura esempio: Il significato di un Semaforo non dipende dal fatto che l’attributo colore sia di tipo String o int, ma dal funzionamento del metodo cambiaColore esempio: impedire a chi usa oggetti Semaforo di accedere all'attributo colore, mettendo a disposizione solo il metodo cambiaColore Permettere solo stati validi per gli oggetti Lo stato degli oggetti deve contenere sempre valori validi Soluzione: controllare tutte le modifiche dello stato attraverso metodi esempio: “blu” non è un valore valido per il colore di un Semaforo 51 Programmazione ad oggetti in Java Modificatori public e private Non è considerata buona norma programmativa dichiarare gli attributi di istanza public! non devono far parte dell’interfaccia della classe Tali attributi devono essere dichiarati private! devono appartenere all’implementazione (si deve operare anche per loro incapsulamento) Se si utilizza il modificatore public ogni altra classe può accedere in maniera diretta all’attributo di istanza e quindi modificarlo direttamente! Esempio: Automobile 52 Sorgente (directory slide 52) + + velocitaCorrente: int proprietario: String + toString() : String Programmazione ad oggetti in Java 26 Programmazione ad oggetti in Java Gli attributi private Dichiarare un’attributo d’istanza private comporta che è accessibile esclusivamente all’interno della classe in cui è definito Automobile Esempio corretto: Sorgente (directory slide 53) velocitaCorrente: int proprietario: String + + + setVelocitaCorrente(velocita :int) : void setProprietario(proprietario :String) : void toString() : String Come già visto è possibile dichiarare anche i metodi private tali metodi sono metodi di servizio che vengono invocati da altri esempio: - calcolaBase() e calcolaAltezza() sono metodi di servizio per la classe Rettangolo che esporta solo metodi per il calcolo dell’area e del perimetro Se la norma è dichiarare gli attributi d’istanza private, come faccio al di fuori della classe ad accedere agli attributi stessi? 53 Programmazione ad oggetti in Java Metodi di incapsulamento o accesso Dichiarare gli attributi di istanza private obbliga a chi definisca la classe di dotarla di metodi che permettono l’accesso agli attributi stessi Un metodo di incapsulamento è semplicemente un metodo che permette ad un’altra classe di leggere o impostare il valore di un attributo di istanza dichiarato private Tali metodi devono appartenere all’interfaccia pubblica della classe! Quando l’attributo può essere acceduto 54 sia in scrittura che in lettura occorrerà dotare la classe di 2 metodi solo in lettura occorrerà dotare la classe di 1 metodo solo in scrittura occorrerà dotare la classe di 1 metodo Programmazione ad oggetti in Java 27 Programmazione ad oggetti in Java Naming ed esempio I metodi di incapsulamento seguono più o meno la seguente convenzione: in modifica: setNomeAttributo in lettura: getNomeAttributo Esempio: Sorgente (directory slide 55) Automobile 55 - velocitaCorrente: int proprietario: String + + + + + setVelocitaCorrente(velocita :int) : void setProprietario(proprietario :String) : void toString() : String getVelocita() : int getProprietario() : String Programmazione ad oggetti in Java La keyword this Nell-esempio di Automobile, nel metodo setProprietario(String proprietario) ho ambiguità nella seguente istruzione: proprietario = proprietario; Devo esplicitare quale delle 2 variabili si riferisce all’attributo di istanza: this.proprietario = proprietario; this vuol dire l’istanza corrente public void setProprietario(String proprietario){ this.proprietario = proprietario; } 56 Programmazione ad oggetti in Java 28 Programmazione ad oggetti in Java Naming rispettata sempre? Non è sempre conveniente utilizzare la convenzione Si utilizza esclusivamente quando ha senso! Guardiamo questo esempio: Luce Luce - boolean accesa - boolean accesa + void setAccesa(boolean valore) + boolean getAccesa() + void accendi() + void spegni() + boolean isAccesa() 57 Programmazione ad oggetti in Java Riassumendo Quando si definiscono classi usare sempre le seguenti regole: 58 1. inserire sempre un commento in testa alla classe che specifica l’astrazione che rappresenta. Usare i commenti per generare la documentazione 2. dichiarare tutti gli attributi di istanza appartenenti all’implementazione (modificatore private) 3. fornire tutti gli opportuni metodi di incapsulamento per leggere e modificare gli attributi di istanza (appartenenti quindi all’interfaccia pubblica, modificatore public) 4. fornire tutti i metodi dell’interfaccia pubblica (modificatore public) 5. documentare tutti i metodi inserendo le precondizioni e le postcondizioni 6. dichiarare i metodi di servizio appartenenti all’implementazione (modificatore private) 7. inserire sempre nella definizione di classe il metodo toString() Programmazione ad oggetti in Java 29 Programmazione ad oggetti in Java Overloading Definizione formale: Come fa Java a sapere quale definizione deve eseguire? operare overloading di un metodo vuol dire assegnare lo stesso nome a due o più definizioni differenti all’interno della stessa classe Java determina la definizione corretta sulla base del numero e del tipo di argomenti Quando e perché si fa overloading? Non è più semplice definire metodi con nomi diversi? quando diversi metodi semanticamente fanno la stessa cosa ma con parametri in ingresso diversi. Non ha senso modificare il nome 59 Programmazione ad oggetti in Java Esempio La classe LineaTelefonica fornisce anche un metodo che permette di richiamare l’ultimo numero selezionato la definizione va modificata inserendo fra gli attributi di istanza anche una stringa che memorizza l’ultimo numero composto LineaTelefonica - numero: String prefissoNazionale: String prefissoInternazionale: String ultimoNumeroComposto: String + + + isInterurbana(String) : boolean componiNumero(String) : void componiNumero() : void Sorgente (directory slide 60) 60 Programmazione ad oggetti in Java 30 Programmazione ad oggetti in Java Ancora sull’overloading Non è possibile overloadare un metodo modificando esclusivamente il tipo di ritorno! esempio: public String toString() { ... } public void toString() { ... } 61 Programmazione ad oggetti in Java L’inizializzazione degli oggetti Quando si crea un oggetto è buona norma inizializzare i valori degli attributi Come detto, gli attributi vengono inizializzati a valori di default Non è detto che tali valori siano effettivamente quelli corretti. Come faccio a modificarli? utilizzo i metodi di incapsulamento! È possibile però che le operazioni di inizializzazione dell’oggetto vadano oltre alla pura assegnazione di valori iniziali per gli attributi se devo costruire un’interfaccia grafica, voglio che tutte le operazione di costruzione vengano fatte nel momento in cui istanzio l’oggetto 62 Programmazione ad oggetti in Java 31 Programmazione ad oggetti in Java I costruttori Un costruttore è uno speciale tipo di metodo destinato ad effettuare le inizializzazioni dell’oggetto Fino ad ora si sono creati oggetti grazie a la sequente sintassi: Sintassi: new NomeClasse() Esempio: new Automobile() Tale sintassi crea l’oggetto ed inizializza gli attributi di istanza a valori di default (che non necessariamente sono quelli desiderati!) Usando i costruttori è possibile creare oggetti inizializzandoli a valori desiderati Il costruttore è un metodo speciale che viene invocato nel momento in cui viene creato un oggetto (e solo in quel momento!) 63 Programmazione ad oggetti in Java La sintassi Come un metodo, un costruttore esegue tutte le istruzioni specificate nella sua definizione quando si scrive un costruttore, occorre pero’ ricordarsi che il suo scopo è quello di eseguire le azioni necessarie all’inizializzzione dell’oggetto esempio: la classe LineaTelefonica possiede una serie di metodi che hanno come precondizione l’inizializzazione della linea stessa: sarebbe opportuno, al posto di invocare i 3 metodi di incapsulamento, inizializzare opportunamente l’oggetto linea con i valori per i 3 attributi Sintassi: public NomeClasse([lista parametri formali]) { //inizializzazioni } NomeClasse ref = new NomeClasse([argomenti]) 64 Programmazione ad oggetti in Java 32 Programmazione ad oggetti in Java Con la “vecchia” modalità public class Automobile { private int velocitaCorrente; private String proprietario; public void setVelcita(int v) { velocitaCorrente = v; } public void setProprietario(String p) { proprietario = p; } ... } public class TestAuto { public static void main(String ar[]) { //Voglio creare l’auto di Paperino con velocità 100 Automobile a = new Automobile(); a.setVelocita(100); a.setProprietario(“Paperino”); } } 65 Programmazione ad oggetti in Java Con il costruttore ... public class Automobile { private int velocitaCorrente; private String proprietario; public Automobile(int velocitaC, String proprietario) { velocitaCorrente = velocitaC; this.proprietario = proprietario; } public void setVelcita(int v) { velocitaCorrente = v; } public void setProprietario(String p) { proprietario = p; } ... } public class TestAuto { public static void main(String ar[]) { //Voglio creare l’auto di Paperino con velocità 100 Automobile a = new Automobile(100, “Paperino”); } } 66 Programmazione ad oggetti in Java 33 Programmazione ad oggetti in Java ... Se ho vincoli sui valori public class Automobile { private int velocitaCorrente; private String proprietario; public Automobile(int velocitaC, String proprietario) { setVelocita(velocitaC); this.proprietario = proprietario; } public void setVelcita(int v) { if(v>=0 && v <= 180) { velocitaCorrente = v; } else { velocitaCorrente = 0; } } public void setProprietario(String p) { proprietario = p; } ... } public class TestAuto { public static void main(String ar[]) { //Voglio creare l’auto di Paperino con velocità 100 Automobile a = new Automobile(100, “Paperino”); } } 67 Programmazione ad oggetti in Java Posso ancora usare l’istanziazione classica? Considerando l’esempio precedente, la seguente istruzione è lecita? NO! Perchè? Automobile a = new Automobile(); perchè non esiste un costruttore nella classe Automobile che non accetta in ingresso parametri (chiamato costruttore di default)! Perché prima era lecita? E perchè potevo istanziare oggetti? se non viene definito un costruttore all’interno di una classe, ne viene assegnato uno di default (costruttore di default) che non accetta in ingresso parametri e la cui implementazione è più o meno la seguente: public class Automobile { ... public Automobile() { } } 68 Programmazione ad oggetti in Java 34 Programmazione ad oggetti in Java Overlodare i costruttori Sempre! ovviamente dove ha senso che significa rendere la classe più flessibile Overlodare i costruttori vuol dire realizzare più costruttori che inizializzano l’pggetto variando la lista dei parametri formali nei costruttori in cui non viene richiesto il valore di inizializzazione di uno più attributi, devono, nell’implementazione, comunque inizializzare tali attributi 69 Programmazione ad oggetti in Java Esempio: definizione classe Automobile public class Automobile { private int velocitaCorrente; private String proprietario; public Automobile(int velocitaC, String proprietario) { setVelocitaCorrente(velocitaC); this.proprietario = proprietario; } public Automobile(String proprietario) { velocitaCorrente = 0; this.proprietario = proprietario; } public Automobile(int velocita) { setVelocitaCorrente(velocita); this.proprietario = null; } public Automobile() { velocitaCorrente = 0; this.proprietario = null; } ... } 70 Programmazione ad oggetti in Java 35 Programmazione ad oggetti in Java Esempio: uso classe Automobile public class TestAutomobile { public static void main(String a[]) { //Voglio creare una auto con velocità corrente 100 //e proprietario “Paperino” Automobile a1 = new Automobile(100, “Paperino”); //Voglio creare una auto con proprietario “Paperino” Automobile a2 = new Automobile(“Paperino”); //Voglio creare una auto con velocità corrente 130 Automobile a3 = new Automobile(130); //Voglio creare una auto con valori di default Automobile a2 = new Automobile(); ... } } 71 Programmazione ad oggetti in Java Richiamare un costruttore da un’altro Come notato, i costruttori visti nell’esempio compiono le stesse azioni: È comodo invocare da un costruttore un’altro costruttore passando i giusti argomenti inizializzare il valore di velcoitaCorrente e di proprietario a tutti gli effetti è l’invocazione di un metodo Regola più o meno generale: implemento il costruttore (a) che accetta in ingresso i valori per tutti gli attributi di istanza inizializzabili con passaggio di parametri implemento i costruttori che accettano in ingresso un sottoinsieme dei valori accettati dal costruttore (a) invocando il costruttore (a) stesso come se fosse un metodo 72 Programmazione ad oggetti in Java 36 Programmazione ad oggetti in Java La keyword this Per fare ciò, non invoco esplicitamente il costruttore con il nome, ma utilizzo la keyword this (deve essere la prima istruzione nella definizione del metodo) public class Automobile { private int velocitaCorrente; private String proprietario; public Automobile(int velocitaC, String proprietario) { setVelocitaCorrente(velocitaC); this.proprietario = proprietario; } public Automobile(String proprietario) { this(0, proprietario); } public Automobile(int velocita) { this(velocita, null); } public Automobile() { this(0, null); } ... 73 } Programmazione ad oggetti in Java Esercizi Individuare metodi di incapsulamento e costruttori per una classe che rappresenta un’automobile caratterizzata da: una classe che rappresenta una videocassetta. La videocassetta è caratterizzata da 74 velocitaCorrente velocitaMassima numeroDiTelaio un titolo, una durata il fatto che sia protetta o meno in registrazione Programmazione ad oggetti in Java 37