Lezione 4 Programmazione Object-Oriented in Java

Documenti analoghi
Organizzazione della lezione. Organizzazione della lezione. Lezione 3 Programmazione Object-Oriented. Oriented in Java

Lezione 5 Namespace e JavaDoc

7. Java: Programmazione generica

Laurea in Informatica. "Programmazione Distribuita" - Prof. Scarano. A.A Università di Salerno 1. Organizzazione della lezione

Dichiarazione di una classe. Dichiarazione ereditarietà

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

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

Programmazione II. Lezione 18. Daniele Sgandurra 11/1/2011.

OOP in C++ ha membro (dati membro) e funzioni membro In Java i dati membro sono chiamati attributi e le funzioni membro metodi

6. Java: Ereditarietà

Organizzazione della lezione. Organizzazione della lezione. Lezione 4 Programmazione Object-Oriented. Oriented in Java

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Corso di Informatica

Programmazione II. Lezione 13. Daniele Sgandurra 3/12/2010.

Java: Definire Classi e Creare Oggetti

14 - Metodi e Costruttori

Fondamenti di Informatica

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

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

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

Definizione di classi. Walter Didimo

Organizzazione della lezione. Organizzazione della lezione. Lezione 5 Programmazione generica e eccezioni

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

Programmazione II. Lezione 15. Daniele Sgandurra 10/12/2010.

Funzioni, Stack e Visibilità delle Variabili in C

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Array. Walter Didimo

Programmi e Oggetti Software

Indice. Prefazione. 3 Oggetti e Java 53

Programmi e Oggetti Software

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione a oggetti

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Proprietà delle Classi e degli Oggetti in Java

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

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

Lezione 6: Array e puntatori

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

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

UML UNIFIED MODELING LANGUAGE

Proprietà delle Classi e degli Oggetti in Java

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

Progettazione Object-Oriented

Programmazione I - corso B a.a prof. Viviana Bono

Laboratorio di Informatica I

Ereditarietà: concetti di base

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

NON ABBIAMO ANCORA CORRETTO LE PROVETTE!!!

Programmazione Java Avanzata Programmazione Object- Oriented in Java

PIANO DI STUDIO DELLA DISCIPLINA DISCIPLINA: Informatica

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Marco Faella Introduzione al corso

La programmazione ad oggetti: chiamate di metodi. Overloading. This

Ingegneria del Software

Modello procedurale versus modello O-O

Programmazione ad oggetti

Il paradigma Object Oriented. Iolanda Salinari

La programmazione ad oggetti (OOP)

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

A. Ferrari Object Oriented Design

Programmazione a Oggetti Lezione 8. Definizioni di Classi II

Esercitazione n 2. Obiettivi

Variabili e Parametri. Scope, Lifetime Inizializzazione

Variabili e Parametri

Lezione 13 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Lezione 13 programmazione in Java

Programmazione M.A. Alberti. Comunicazione digitale AA 2009/ Classi in Java 1. Le classi in Java. Oggetti. Classi. Classi. Visibilità dei dati

Introduzione alla programmazione orientata agli oggetti (prima parte) Rel 1.0

Introduzione alla OOP Object Oriented Programming. Programmazione Orientata agli Oggetti

UML Introduzione a UML Linguaggio di Modellazione Unificato. Corso di Ingegneria del Software Anno Accademico 2012/13

Introduzione alla programmazione Object Oriented. Luca Lista

Paradigma a oggetti. Programmazione orientata agli oggetti. Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30

Programmazione ad oggetti. Paradigma a oggetti. Esempio. Esempio L estensione del tipo di dato comporta la ridefinizione del codice

Oggetti. Definizioni di Classi II

Introduzione alla OOP Object Oriented Programming

Corso sul linguaggio Java

Corso di Linguaggi di Programmazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Esercitazione n 2. Obiettivi

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

Funzioni, Stack e Visibilità delle Variabili in C

Laboratorio di programmazione

Gerarchia di classi Java 1

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

Programmazione in Java (I modulo) Lezione 21: Classi derivate e l'operatore instanceof Riscrivere il metodo tostring() Riscrivere il metodo equals()

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

Gerarchia di classi Java 1

Diagrammi di classe e sistemi orientati agli oggetti

Transcript:

Lezione 4 Programmazione Object-Oriented in Java Vittorio Corso di Programmazione Distribuita Laurea di I livello in Informatica Università degli Studi di Salerno Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 2 A.A. 2002-2003 Università di Salerno 1

Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 3 Hardware/Software: una evoluzione sbilanciata Hardware: progresso tecnologico velocissimo i PC di oggi erano chiamati supercomputer 20 anni fa uso di processori e memorie in moltissimi manufatti Software: di complessità sempre crescente che coinvolge team di programmatori Obiettivi contrastanti: un sistema per risolvere problemi in maniera efficiente che sia però così semplice da essere gestibile 4 A.A. 2002-2003 Università di Salerno 2

Alcune leggi e strategie Hofstadter's Law: It always takes longer than you expect, even when you take Hofstadter's Law into account. Ninety-Ninety Rule of Project Schedules: The first ninety percent of the task takes ninety percent of the time, and the last ten percent takes the other ninety percent. 5 La programmazione orientata agli oggetti Una metodologia per costruire sistemi software: robusti adattabili e portabili riusabili Principio economico prima che informatico: Dell, Compaq, etc. contro IBM, HP, etc. McLaren, Williams contro Ferrari (anni 80) L idea: Non importa il colore del gatto, basta che acchiappi il topo Mao Tze Tung Implementazione nascosta dalla interfaccia 6 A.A. 2002-2003 Università di Salerno 3

Obiettivo 1: la robustezza del software Software robusto: capace di trattare in maniera coerente con input strani Importanza nei sistemi life-critical: un fallimento: il software per il Therac-25 cancellazione di caratteri a video ma non dall input Capace di seguire richieste dell utente: Esempio: input e memorizzazione di più dati di quelli previsti Correttezza: per tutti i valori dell input, compreso i valori detti di boundary (limite) 7 Obiettivo 2: la adattibilità del software I programmi hanno una vita molto lunga Necessario trattare con la evoluzione dell ambiente aumento velocità della CPU, rete videogiochi antichi non utilizzabili sicurezza (alla aumentata connettività ) mutazioni esterne: anno 2000, Euro, etc. Software capace di evolvere con poco sforzo portabile su piattaforme diverse 8 A.A. 2002-2003 Università di Salerno 4

Obiettivo 3: la riusabilità del software Sviluppo del software di qualità: costoso veloce Necessario poter riutilizzare il software già scritto importanza del lavoro cooperativo Riusabilità fatta con sicurezza la specifica precisa delle componenti da riutilizzare permette di evitare possibili errori 9 La programmazione a oggetti Il programma è costituito da oggetti scelti tra quelli disponibili o creati ex-novo che espongono delle funzionalità la cui implementazione si ignora Confronta con programmazione strutturata: algoritmi per risolvere problemi (funzioni) (poi) memorizzazione dati in strutture dati La OOP inverte l ordine: la organizzazione dei dati precede la scelta delle funzionalità 10 A.A. 2002-2003 Università di Salerno 5

Caratteristiche chiave della OOP Ogni oggetto è responsabile delle azioni correlate ai dati che contiene un oggetto può manipolare i propri dati ma non deve (dovrebbe) mai manipolare i dati degli altri. Un oggetto espone dei metodi: funzioni che permettono di accedere ai dati nella maniera corretta. Chi (o cosa) usa un oggetto ignora i dettagli della implementazione 11 Il vocabolario della OOP: le classi Classe: modello (schema) secondo il quale un oggetto verrà creato (istanziato) Tutto quanto è disponibile in Java è in una classe: la libreria standard fornisce di tutto, di più anche i nostri programmi sono in una o più classi necessaria una accurata progettazione OOP Principi guida della progettazione OOP: Astrazione Incapsulamento Modularità 12 A.A. 2002-2003 Università di Salerno 6

Principio 1: Astrazione Descrizione formale delle caratteristiche fondamentali di un sistema nomi e funzionalità Sufficientemente dettagliata per il comportamento sufficientemente astratta (ad alto livello) per non includere dettagli non necessari Astrazione alla progettazione di strutture dati: Abstract Data Types (ADT) modello matematico di organizzazione dei dati specifica tipo di dati, operazioni, e parametri delle operazioni cosa fa non come lo fa (interfaccia (interface Java)) realizzata da una classe Java 13 Principio 2: Incapsulamento (Information hiding) Le componenti del sistema non devono rivelare dettagli sulle implementazioni interne Concede la libertà al programmatore: le scelte implementative possono essere cambiate solo necessario mantenere la interfaccia verso l esterno L incapsulamento permette la adattabilità necessario solamente cambiare implementazione interna alla classe L incapsulamento permette la riusabilità riuso di componenti con implementazione non nota 14 A.A. 2002-2003 Università di Salerno 7

Principio 3: Modularità Struttura organizzata in cui componenti diverse di un sistema sono diverse in unità funzionali separate. Esempio: una casa suddivisa in: unità elettrica unità di riscaldamento e raffreddamento unità idraulica unità strutturale (mura) Di norma, strutturata in maniera gerarchica: definizioni simili vengono raggruppate a livelli dallo specifico verso il generale gerarchia is a ( è un ) 15 Un esempio di gerarchia is a Edifici Appartamenti Case Commerciali In parchi In edifici A 2 piani Basse Grattacieli 16 A.A. 2002-2003 Università di Salerno 8

Il vocabolario della OOP: gli oggetti Tre caratteristiche fondamentali: il comportamento dell oggetto: quali metodi possono essere applicati? lo stato dell oggetto: come reagisce l oggetto? l identità dell oggetto: come si distingue l oggetto tra altri oggetti simili? Tutti gli oggetti istanza della stessa classe: hanno lo stesso comportamento differiscono di solito nello stato differiscono sempre nella identità 17 Progettare con oggetti Identificare le classi ed i metodi da applicare nella programmazione procedurale si definivano prima gli algoritmi e poi la struttura dati Nella fase di progettazione, si arriva ad una descrizione del problema in linguaggio naturale Una regola empirica da applicare : nella descrizione in linguaggio naturale del problema i sostantivi sono le classi i verbi sono i metodi 18 A.A. 2002-2003 Università di Salerno 9

Progettare con oggetti: un esempio Per elaborare ordini in un magazzino merci: Le classi possono essere: Articolo (Item) Ordine (Order) Indirizzo per la spedizione (Shipping Address) Pagamento (Payment) Conto (Account) I metodi possono essere: Aggiungere un articolo (add) ad un ordine Spedire (ship) o annullare (cancel) un ordine Un pagamento viene applicato (apply) ad un ordine 19 Relazioni tra classi Tra le tante relazioni possibili, le più importanti: Dipendenza Aggregazione Ereditarietà Le relazioni tra classi formano un diagramma delle classi usato per modellare il sistema software da progettare 20 A.A. 2002-2003 Università di Salerno 10

Relazioni: Dipendenza La relazione più comune e generale: una classe A dipende da un altra classe B se gli oggetti di A devono accedere a metodi degli oggetti di B Esempio: gli oggetti della classe Order devono necessariamente usare oggetti della classe Account controllano lo stato del conto del cliente prima di effettuare la spedizione gli oggetti della classe Item, invece, non devono accedere a oggetti della classe Account. 21 Relazioni: Aggregazione ed ereditarietà Aggregazione: un oggetto della classe A contiene oggetti della classe B esempio: un oggetto della classe Order contiene oggetti della classe Item Ereditarietà relazione tra una classe più specializzata ed una più generale esempio: una classe RushOrder (ordine urgente) specializza (eredita) da una classe Order eredita metodi ma ha suoi propri metodi specifici 22 A.A. 2002-2003 Università di Salerno 11

Un esempio sulla ereditarietà Una classe Persona che ha: stato: nome, cognome, annodinascita metodi: getcognome(), getnome(), dimmieta() Una classe Studente specializza Persona aggiungendo allo stato: matricola, scuola, classe, sezione, voti, etc. metodi: annodidiploma(), votomaturità(), etc. In questa maniera Studente eredita i metodi di Persona 23 Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 24 A.A. 2002-2003 Università di Salerno 12

Unified Modeling Language Un linguaggio per specificare, visualizzare costruire e documentare le componenti di un sistema software UML definisce una ampia varietà di diagrammi: diagrammi di classe diagrammi di collaborazione diagrammi di stato. Notazione simbolica per rappresentare le relazioni tra classi in maniera semplice, chiara e completa 25 Le relazioni tra classi in UML (1) Dipendenza una classe A dipende da un altra classe B se gli oggetti di A devono accedere a metodi degli oggetti di B Esempio: gli oggetti della classe Order devono necessariamente usare oggetti della classe Account Order Account 26 A.A. 2002-2003 Università di Salerno 13

Le relazioni tra classi in UML (2) Aggregazione: un oggetto della classe A contiene oggetti della classe B Esempio: un oggetto della classe Order contiene oggetti della classe Item Order Item 27 Le relazioni tra classi in UML (3) Ereditarietà relazione tra una classe più specializzata ed una più generale Esempio: una classe RushOrder (ordine urgente) specializza (eredita) da una classe Order Order RushOrder 28 A.A. 2002-2003 Università di Salerno 14

Un esempio in UML: Classe Persona Studente TasseScolastiche 29 Programmazione OO e procedurale (1) Programmazione procedurale Due tecniche: top-down: raffinamento graduale di operazioni in operazioni più piccole e semplici fino alla codifica in un linguaggio bottom-up: scrittura procedure per compiti semplici e loro composizione per ottenere la funzionalità desiderata Di solito, utile una miscela delle due tecniche: provvedere ad una prima analisi top-down con scrittura del codice e composizione bottom-up 30 A.A. 2002-2003 Università di Salerno 15

Programmazione OO e procedurale (2) Caratteristica: identificazione ed isolamento delle classi (e solo dopo) identificazione dei metodi delle classi Vantaggi: modularizzazione in maniera indipendente lavoro per team di programmatori identificazione e raggruppamento chiaro dei metodi invece di 2000 funzioni, si hanno 100 classi con 20 metodi 31 Alcune domande. Una buona programmazione procedurale è in effetti programmazione orientata agli oggetti? in effetti, scomporre ed isolare le funzioni ed evitare variabili e dati globali è una buona tecnica, indipendentemente dalla metodologia usata Si può programmare ad oggetti con un linguaggio che non sia object-oriented? posso evitare di imparare Java o C++ e continuare a usare il C? 32 A.A. 2002-2003 Università di Salerno 16

Ed alcune risposte (parziali) Una buona programmazione procedurale è in effetti programmazione orientata agli oggetti? Il vantaggio di avere la classe e di usarla per avere più oggetti dello stesso tipo non può essere ottenuto in un linguaggio procedurale Si può programmare ad oggetti con un linguaggio che non sia object-oriented? Si, così come è possibile inchiodare un chiodo usando un cacciavite invece di un martello. (sarebbe No ) 33 Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 34 A.A. 2002-2003 Università di Salerno 17

Oggetti e variabili oggetto Per lavorare con gli oggetti si deve costruirli specificando lo stato iniziale In Java esistono i costruttori un metodo speciale offerto dalla classe che permette di costruire, inizializzandone il valore, nuovi oggetti Un esempio: la classe Date Un commento: perché si ritiene di usare una classe e non un tipo predefinito (come in alcuni linguaggi)? perché una classe è modificabile, un tipo primitivo no. 35 La classe Date I costruttori hanno sempre lo stesso nome della classe Per costruire un nuovo oggetto si combina il costruttore con l operatore new new Date() Cosa si fa dell oggetto creato? lo si può passare a un metodo: si può invocarne un metodo: si assegna ad una variabile: System.out.println(new Date()); String s = new Date().toString(); Date compleanno = new Date(); 36 A.A. 2002-2003 Università di Salerno 18

Variabili di riferimento (reference) Le variabili oggetto contengono riferimenti a oggetti, non oggetti l operatore new restituisce un riferimento all oggetto creato possibili assegnarle a null per indicare che non fa riferimento ad alcun oggetto la copia di variabili oggetto effettua la copia dei riferimenti non degli oggetti Date compleanno = new Date(); Date scadenza = compleanno; compleanno scadenza Date 37 Classe Date Memorizza un punto temporale: implementazione: numero (positivo o negativo) di millisecondi trascorsi dalla epoch 1 gennaio 1970 Greenwich Mean Time La progettazione object-oriented: un esempio una descrizione di data (31 dicembre 1976, 23:59:59) è una convenzione arbitraria disciplinata da un calendario il calendario è quello gregoriano (esistono anche quello ebraico, cinese etc.) separazione tra il tempo (Date) e la rappresentazione mediante convenzioni (GregorianCalendar) possibile usare altri calendari 38 A.A. 2002-2003 Università di Salerno 19

Uso di Date e GregorianCalendar Classe Date : pochi metodi metodo before e after: if (today.before(compleanno)) System.out.println ( Comprare il regalo! ); else System.out.println ( Troppo tardi: un altra figuraccia! ); Classe GregorianCalendar : molti metodi e costruttori GregorianCalendar s1 = new GregorianCalendar(); //data e ora della costruzione GregorianCalendar s2 = new GregorianCalendar(1999,11,31); GregorianCalendar s3 = new GregorianCalendar(1999,Calendar.DECEMBER,31); GregorianCalendar s4 = new GregorianCalendar(1999,Calendar.DECEMBER,31, 23, 59, 59); 39 Uso di GregorianCalendar Metodo get preleva informazioni da un oggetto uso di costanti GregorianCalendar now = new GregorianCalendar(); int mese = now.get(calendar.month); int giorno = now.get (Calendar.DAY_OF_WEEK); Metodo set modifica lo stato di un oggetto GregorianCalendar Metodo add scadenza.set(2001, Calendar.April, 15); scadenza.add(calendar.month, 2); //sposta avanti di 2 mesi 40 A.A. 2002-2003 Università di Salerno 20

Alcuni commenti Metodi di modifica cambiano lo stato dell oggetto (Es. set, add ) Metodi di accesso leggono lo stato dell oggetto (Es. get) Convenzione in Java: i metodi di modifica iniziano con set i metodi di accesso iniziano con get Esempio: metodo settime e gettime 41 Conversione tra Date e GregorianCalendar Conversione da GregorianCalendar a Date GregorianCalendar now = new GregorianCalendar(); Date ora = now.gettime(); Conversione da Date a GregorianCalendar GregorianCalendar now = new GregorianCalendar(); now.settime(ora); int anno = now.get(calendar.year); Maggiori dettagli l esempio CalendarTest.java (pag. 134-136) la nota API a pag. 136 del libro 42 A.A. 2002-2003 Università di Salerno 21

Costruzioni di classi personalizzate Definizioni di classi più complesse con più metodi e costruttori di norma senza il metodo main Una convenzione importante (in Java): si definiscono prima i metodi di una classe la sua interfaccia verso l esterno e poi si definiscono i campi (stato) della classe Esempio: definizione di una classe Employee (impiegato) con metodi per il nome, il salario (aumenti etc.), data di assunzione etc. 43 Definizione di una classe In generale: class NomeDellaClasse { costruttore 1 (..) costruttore 2 (..) metodo 1 (..) metodo 2 (..) campo 1 campo 2 44 A.A. 2002-2003 Università di Salerno 22

Definizione di una classe Employee Employee.java import java.util.*; // per Date e Calendar public class Employee { // costruttore public Employee (String n, double s, int year, int month, int day) { name = n; salary = s; GregorianCalendar cal = new GregorianCalendar(year, month-1, day); hireday = cal.gettime(); public String getname () { return name; private String name; private double salary; private Date hireday; Il costruttore stesso nome della classe assegna i campi dell oggetto che costruisce Un metodo di accesso restituisce il nome Campi della istanza una stringa (Nome) un double (salario) data di assunzione tutti campi privati 45 Definizione di una classe EmployeeTest EmployeeTest.java import java.util.*; public class EmployeeTest { public static void main (String [ ] args) { Employee[ ] staff = new Employee [ 3 ] ; staff [0]=new Employee ( Gianni, 30000, 1987, 12, 10); staff [1]=new Employee ( Giorgio, 35000, 1985, 10, 31); staff [2]=new Employee ( Ugo, 28000, 2000, 1, 1); for (int i=0; i< staff.length; i++) System.out.println ( Nome: + staff[i].getname() + Salario: + staff[i].getsalary() + Assunto: + staff[i].gethireday() ); Dichiarazione di array di Employee Assegnazione: uso del costruttore Stampa dei dati inseriti uso di metodi getsalary() e gethireday() definiti in maniera simile a getname() (vedi libro) 46 A.A. 2002-2003 Università di Salerno 23

Compilazione ed esecuzione C:\>javac Employee.java C:\>javac EmployeeTest.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10. Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31. Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01. C:\> 47 Java è dinamico, vero? La classe Employee viene caricata dalla macchina virtuale durante la esecuzione Facciamo una prova: modifichiamo il costruttore in modo da inserire un salario negativo (il valore negativo del salario passato dal costruttore!) ricompiliamo la classe Employee eseguiamo senza ricompilare EmployeeTest e. 48 A.A. 2002-2003 Università di Salerno 24

Compilazione ed esecuzione C:\>javac Employee.java C:\>javac EmployeeTest.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 C:\>javac Employee.java C:\>java EmployeeTest Nome:Gianni Salario:-30000.0 Assunto:Thu Dec 10 Nome:Giorgio Salario:-35000.0 Assunto:Thu Oct 31 Nome:Ugo Salario:-28000.0 Assunto:Sat Jan 01 C:\> 49 Compilazione ed esecuzione C:\>javac Employee.java C:\>javac EmployeeTest.java C:\>java EmployeeTest Nome:Gianni Salario:30000.0 Assunto:Thu Dec 10 Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 C:\>javac Employee.java C:\>java EmployeeTest Nome:Gianni Salario:-30000.0 Assunto:Thu Dec 10 Nome:Giorgio Salario:-35000.0 Assunto:Thu Oct 31 Nome:Ugo Salario:-28000.0 Assunto:Sat Jan 01 C:\> 50 A.A. 2002-2003 Università di Salerno 25

Una descrizione in UML Modificatori di accesso - = privato + = pubblico EmployeeTest «misc» + main (String [ ] args) Nome della classe Employee -name : String - salary : double -hireday : Date «constructor» +Employee(n: String, s:double, year: int, month: int, day: int) «misc» + getname() : String + getsalary() : double + gethireday() : Date + raisesalary(percent double) Variabili delle istanze Metodi delle istanze 51 Alcuni commenti sui costruttori Costruttore: metodo con lo stesso nome della classe Attenzione: un costruttore può essere chiamato solamente con l operatore new una classe può avere più costruttori un costruttore può accettare zero, uno o più parametri un costruttore non restituisce un valore 52 A.A. 2002-2003 Università di Salerno 26

Un tipico errore nei costruttori public class Employee { public Employee (String n, double s, int year, int month, int day) { String name = n; double salary = s; Date hireday = new GregorianCalendar(year, month-1,day);. private String name; private double salary; private Date hireday; Dove è l errore? stiamo oscurando con variabili locali al costruttore i campi della istanza: 53 Il metodo raisesalary() Per poter modificare il salario di un dipendente Implementato così: Chiamato così: public class Employee {. public void raisesalary (double percent) { double raise = salary * percent/100; // calcolo aumento salary += raise; // aggiorno stipendio. private String name; private double salary; private Date hireday; Employee e = new Employee ( tizio, 1000, 1998, 12, 1); e.raisesalary(5.3); 54 A.A. 2002-2003 Università di Salerno 27

I parametri di raisesalary() public void raisesalary (double percent) Un parametro esplicito (percent) ed uno implicito (l oggetto che figura prima della chiamata del metodo) e.raisesalary(5.3); Ci si può riferire al parametro implicito con this public class Employee {. public void raisesalary (double percent) { double raise = this.salary * percent/100; // calcolo aumento this.salary += raise; // aggiorno stipendio 55 L importanza della privatezza dei dati Campi privati (name, salary, hireday) accesso esclusivamente attraverso i metodi (pubblici) Se si riscontrano errori: si conosce esattamente quali sono i metodi che modificano i campi che si trovano all interno della classe Si può modifica la implementazione semplicemente modificando i metodi Eventuali errori di assegnazione possono essere riconosciuti dai metodi (salario < 0) 56 A.A. 2002-2003 Università di Salerno 28

Un esempio con la classe Employee Ricordiamo che: public class Employee {. public void raisesalary (double percent) { double raise = salary * percent/100; // calcolo aumento salary += raise; // aggiorno stipendio. private String name; private double salary; private Date hireday; il metodo raisesalary è pubblico mentre il campo salary è privato 57 Un errore evitato a tempo di compilazione!! Sarebbe possibile scrivere in EmployeeTest: public class EmployeeTest { public static void main (String [ ] args) { Employee[ ] staff = new Employee [ 3 ] ;. staff[0].raisesalary(5.3); // ok, accesso con metodo pubblico. // poi, per errore. Morale: staff[0].salary = 1000; // NO! errore IN COMPILAZIONE! non dichiarare campi istanza pubblici campo ma fornire la implementazione di metodi getcampo(), setcampo() per l accesso al campo 58 A.A. 2002-2003 Università di Salerno 29

Accesso dei metodi ai dati privati Una caratteristica sorprendente: i metodi di un oggetto accedono ai dati privati di tutti gli oggetti della stessa classe Esempio: public class Employee { boolean equals (Employee other) { return name.equals(other.name); il metodo equals() accede al campo name sia dell oggetto a cui appartiene sia al campo privato dell oggetto Employee other 59 Metodi privati Pratica di buona programmazione: I campi istanza sono privati ed i metodi pubblici Eccezione: metodi privati che suddividono il codice in moduli indipendenti (usati solo da altri metodi della classe) possibile cambiarlo senza preoccuparsi di chi lo usa: solamente i metodi della classe lo usano Campi di istanza final tipo di campo in cui il valore assegnato dal costruttore non può essere cambiato. Esempio: il nome di un impiegato public class Employee { String final name; 60 A.A. 2002-2003 Università di Salerno 30

Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 61 Campi statici Una variabile statica (di classe) è una variabile di cui ne esiste solamente una copia per tutta la classe Esempio: supponiamo di voler assegnare un campo ID ad ogni impiegato della classe Employee aggiungiamo: una variabile di istanza (per ogni singolo impiegato) id una variabile statica (per tutti gli oggetti della classe) nextid che viene inizializzata (1 volta) ad 1. public class Employee { private int id; private static int nextid = 1; 62 A.A. 2002-2003 Università di Salerno 31

L uso di campi statici Implementiamo un metodo per assegnare l id: public class Employee { public void setid() { id = nextid++; private int id; private static int nextid = 1; Così dopo ogni chiamata di setid() il prossimo dipendente prenderà una nuova id. 63 La nuova versione di Employee Employee.java import java.util.*; public class Employee {. public void setid() { id = nextid++; public int getid () { return id;. // campi delle istanze della classe private String name; private double salary; private Date hireday; private int id; private static int nextid = 1; Due nuovi metodi: uno per settare l Id l altro per leggerla Il campo id risulta essere privato: accesso solo tramite setid() e getid() Il campo nextid static (unico per tutta la classe) viene incrementato ogni volta che l id è usato da un impiegato 64 A.A. 2002-2003 Università di Salerno 32

La nuova classe EmployeeTest EmployeeTest.java import java.util.*; public class EmployeeTest { public static void main (String [ ] args) { Employee[ ] staff = new Employee [ 3 ] ; staff [0]=new Employee ( Gianni, 30000, 1987, 12, 10); staff [1]=new Employee ( Giorgio, 35000, 1985, 10, 31); staff [2]=new Employee ( Ugo, 28000, 2000, 1, 1); for (int i=0; i< staff.length; i++) { staff[i].setid(); System.out.println ( Nome: + staff[i].getname() + Salario: + staff[i].getsalary() + Assunto: + staff[i].gethireday() + Id: + staff[i].getid() ); Per ogni staff setto la ID questo fa incrementare nextid (campo statico) alla stampa, l id sarà 1,2,3 per i tre impiegati 65 Costanti statiche Le costanti statiche sono abbastanza comuni classicamente in Math vengono definiti valori utili Tipicamente le costanti statiche sono allo stesso tempo public e final: questo va bene: risultano accessibili solamente in lettura (di fatto) non essendo modificabili Altri esempi di costanti: la codifica intera dei mesi nella classe Calendar public class Math { public static final double PI = 3.14159; 66 A.A. 2002-2003 Università di Salerno 33

Metodi statici Sono metodi che non operano su oggetti (non hanno parametri impliciti) Esempio: i metodi messi a disposizione da Math Math.pow(x,y) Non è necessario chiamare il metodo statico da un oggetto basta chiamare il metodo con il nome della classe I metodi statici possono accedere ai campi statici: public class Employee { public static int getnextid() { return nextid; 67 Metodi statici particolari Metodi fabbricatori metodi che pur non essendo costruttori restituiscono un oggetto della classe Metodo main () permette la esecuzione di un programma associato ad una classe spesso utile aggiungere un metodo main ad una classe anche se non si userà perché può servire per testare il comportamento della classe esempio: si può aggiungere un main di test a Employee 68 A.A. 2002-2003 Università di Salerno 34

Organizzazione della lezione La programmazione orientata agli oggetti motivazioni, obiettivi e principi guida della progettazione Unified Modeling Language (UML) Alcune semplici classi Uso della classe Date e GregorianCalendar Creazione di una nuova classe (Employee) Campi e metodi statici Parametri dei metodi Costruzione di oggetti ed inizializzazione 69 Parametri dei metodi Passaggio di parametri: per valore il valore del parametro attuale viene copiato nel parametro formale le modifiche effettuate dal metodo non hanno effetto sulla variabile passata al metodo (parametro attuale) per riferimento il metodo riceve la locazione di memoria della variabile le modifiche effettuate dal metodo sono effettuate sulla variabile passata al metodo (parametro attuale) 70 A.A. 2002-2003 Università di Salerno 35

Il passaggio di parametri in Java Poiché le uniche variabili non di riferimento sono quelle dei tipi primitivi: tutte i passaggi di parametri di variabili di tipo primitivo sono fatti per valore tutti i passaggi di parametri di oggetti sono fatti passando per valore la variabile riferimento (per i puristi) questo non è un passaggio per riferimento. ad esempio non si può fare lo swap 71 Alcuni metodi statici in EmployeeTest EmployeeTest.java import java.util.*; public class EmployeeTest { public static void triplesalary (Employee x) { x.raisesalary (200); public static void main (String [ ] args) { Employee[ ] staff = new Employee [ 3 ] ;.// creazione dei tre impiegati triplesalary (staff[1]); // metodo statico for (int i=0; i< staff.length; i++) { staff[i].setid(); System.out.println ( Nome: + staff[i].getname() + Salario: + staff[i].getsalary() + Assunto: + staff[i].gethireday() + Id: + staff[i].getid() ); Definizione metodo statico passaggio di parametri di una variabile di riferimento le modifiche fatte a x sono fatte a staff[1] Stampa degli impiegati 72 A.A. 2002-2003 Università di Salerno 36

L overloading dei metodi È possibile avere più metodi con lo stesso nome utile per gestire (ad esempio) costruttori diversi Come capisce il compilatore quale metodo usare? ogni metodo ha una sua firma: la sequenza di nome ed il tipo (e la successione) dei parametri passati ad esempio, la classe String ha 4 metodi indexof indexof (int) indexof (int, int) indexof (String) indexof (String, int) 73 Costruttori predefiniti Solo se non si costruisce una classe senza costruttori, allora viene fornito (dal compilatore) il costruttore predefinito (senza parametri) altrimenti si inserisce esplicitamente, se lo si vuole public class Employee {. public Employee () { // costruttore vuoto 74 A.A. 2002-2003 Università di Salerno 37

Inizializzazione di campo esplicita I campi possono essere esplicitamente inizializzati: public class Employee {. private String qualifica = Impiegato ; anche eventualmente con chiamate a metodi della classe: public class Employee {. static int assignid() { int r = nextid++; return r private int id = assignid(); 75 Blocchi di inizializzazione Blocchi di codice inseriti nella classe eseguiti ogni volta che viene creato un oggetto public class Employee {. public Employee (String n, double s) { name = n; salary = s: { // blocco di inizializzazione id = nextid; nextid++; private String name; private double salary; private int id; private static int nextid=1; 76 A.A. 2002-2003 Università di Salerno 38