CdL in Ingegneria Informatica CdL in Ingegneria delle Telecomunicazioni e dell’Automazione Corso di Telematica II A.A. 2006 - 2007 Programmazione client/server in Java 1 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Storia di Java • Nel 1991 Sun Microsystems avviò un progetto, chiamato Green, per sviluppare software per dispositivi a microprocessore per l’elettronica di consumo (set-top box, palmari, elettrodomestici, …) • Il prodotto di questo progetto fu un linguaggio che il suo creatore, James Gosling, chiamò Oak. Successivamente fu ribattezzato Java • Dato che il mercato dell’elettronica di consumo non si sviluppò nei modi previsti, Sun decise di orientare il suo nuovo linguaggio alla creazione di pagine web dinamiche • Nel Maggio 1995 Sun annunciò ufficialmente il nuovo linguaggio Java, che fu supportato dal browser Netscape Navigator • Attualmente Java, giunto alla seconda edizione, viene utilizzato oltre che per creare pagine web dinamiche ed interattive (applet), per applicazioni aziendali (J2EE), per estendere i web server (servlet), per programmare cellulari e palmari (J2ME) 2 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 • • • • • Il linguaggio Java General-purpose Object oriented Strongly-typed Concurrent Platform-independent (write once, run everywhere…) 3 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Sviluppo di un applicativo Java bytecode javac Hello World! Virtual Machine Operating System 4 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 5 di 140 La piattaforma Java Programmazione client/server in Java M. Ruta Telematica II Versioni di Java A.A. 20062006-07 • J2SE – Java 2 Standard Edition – Applicazioni desktop • J2EE – Java 2 Enterprise Edition – Applicazioni server • J2ME – Java 2 Micro Edition – Applicazioni per Smartphone/PDA • Javacard – Applicazioni per smartcard 6 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Tipologia di applicazioni Java • Applicazioni stand-alone – Applicazioni in grado di girare autonomamente, senza l’ausilio di altri ambienti • Applet – Applicazioni integrate in una pagina web • Servlet – Applicazioni eseguite da un application server (Tomcat, BEA Weblogic,…) • Midlet – Applicazioni eseguite su un dispositivo mobile (palmare, cellulare, …) 7 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Object Oriented Programming (OOP) • Il mondo reale è fatto di oggetti : persone, animali, piante, automobili, aerei, computer, … • Ciascun oggetto è caratterizzato da: – attributi o proprietà (dimensione, forma, colore, peso, …) – comportamenti o metodi (un bambino piange, dorme, cammina; una automobile accelera, frena, sterza) 8 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Oggetti software • La progettazione orientata agli oggetti modella gli oggetti del mondo reale • Un oggetto è una specifica entità del dominio del problema da modellare caratterizzata da: – identità – comportamento – stato • Un programma può essere pensato come costituito da un insieme di oggetti che interagiscono tra di loro allo scopo di risolvere un problema 9 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Esempi di oggetti Ferrari F430 Cilindrata: 4307 Potenza: 490 Stato: spento Accendi() Spegni() Accelera() Porsche 911 Carrera Cilindrata: 3596 Potenza: 325 Stato: acceso Accendi() Spegni() Accelera() 10 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Classi • Oggetti che hanno le stesse caratteristiche e lo stesso comportamento possono essere raggruppati in classi. • I membri di una classe condividono gli stessi metodi, ma ciascun membro ha un proprio stato. 11 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Esempio di classi ed istanze Automobile Cilindrata: int Potenza: int Stato: boolean Accendi() Spegni() Accelera() istanzia Porsche 911 Carrera: Automobile Cilindrata: 3596 Potenza: 325 Stato: acceso Accendi() Spegni() Accelera() 12 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Interfaccia • Si può pensare ad un oggetto come “provider di servizi” • Le richieste che possono essere fatte ad un oggetto sono definite dalla sua interfaccia • Il codice per soddisfare la richiesta, insieme ai dati nascosti, rappresenta l’implementazione 13 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Esempio di interfaccia Automobile richieste implementazione interfaccia 14 di 140 Accendi() Spegni() Accelera() Frena() Sterza() Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Information hiding • Secondo il paradigma OOP i programmatori possono essere suddivisi in due categorie: – Creatori di nuove classi – Utilizzatori di classi esistenti • L’obiettivo dei creatori di nuove classi deve essere quello di rendere nota solamente l’interfaccia agli utilizzatori, nascondendo l’implementazione – In questo modo il creatore della classe può modificare l’implementazione, senza che gli utilizzatori debbano cambiare il loro codice 15 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Riutilizzo del codice • Una volta che è stata creata e testata, una classe rappresenta una unità di codice utile alla risoluzione di un problema • Il modo più semplice di riutilizzo è la composizione : si definisce un oggetto di una classe come membro di un’altra classe Motore Automobile Cambio 16 di 140 Programmazione client/server in Java M. Ruta Telematica II Ereditarietà A.A. 20062006-07 • Quando è necessario specializzare il comportamento di una classe, aggiungendone delle funzionalità, si può ricorrere all’ereditarietà Automobile Coupè 17 di 140 Cabriolet Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Ereditarietà (2) • La classe derivata (o sottoclasse) eredita le caratteristiche ed il comportamento della classe base (o superclasse) Automobile Accendi() Spegni() Accelera() Cabriolet Accendi() Spegni() Accelera() ApriCapote() ChiudiCapote() 18 di 140 Programmazione client/server in Java M. Ruta Telematica II Diagramma di sequenza A.A. 20062006-07 Ferrari F430 tempo MotoreV8 CambioF1 Folle() Accendi() InserisciMarcia() Accelera() regime:int StaccaFrizione() 19 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 OOP in Java • Java è un linguaggio object oriented che consente di implementare un sistema progettato secondo i metodi dell’Object Oriented Design (OOD) • In linguaggi procedurali come il C, l’unità di programmazione è la funzione • In Java l’unità di programmazione è la classe, da cui possono essere istanziati oggetti 20 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Il primo programma Java /* * file : Hello.java * scopo: visualizzare un messaggio */ /** * Questa classe visualizza un messaggio di benvenuto. * */ public class Hello { /** * metodo di avvio dell’applicazione. * * @param args argomenti passati tramite la linea di comando */ public static void main(String[] args) { // stampa un messaggio a video System.out.println(“Hello world!”); } } 21 di 140 Programmazione client/server in Java M. Ruta Telematica II Commenti A.A. 20062006-07 • Su una singola linea // questo è un commento su una linea singola • Su linee multiple /* commento su linee multiple */ • Javadoc /** commento usato per generare la documentazione con javadoc */ 22 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 JavaDoc • JavaDoc nacque come strumento interno utilizzato dai ricercatori della Sun che stavano lavorando alla creazione del linguaggio Java e delle sue librerie • la grande mole di sorgenti fece pensare alla creazione di un tool per la generazione automatica di documentazione HTML • la creazione e manutenzione di un gran numero di pagine web richiese l'aiuto di un sistema automatico per la gestione dei riferimenti incrociati fra classi e gli inevitabili errori di battitura • JavaDoc nacque quindi per permettere ai programmatori di inserire dei frammenti HTML nei commenti (ignorati quindi dal compilatore) • con le prime versioni si potevano inserire le descrizioni di ogni classe e dei suoi metodi, nonché il significato dei parametri e delle variabili membro 23 di 140 Programmazione client/server in Java M. Ruta Telematica II JavaDoc (2) A.A. 20062006-07 /** * descrizione della classe * * @author autore * @version versione */ public class DocTest { /** descrizione dell’attributo */ public int i; /** * descrizione del metodo * * @param nome_parametro descrizione * @return valore di ritorno */ public void f(int p1) {} } 24 di 140 Tag Descrizione @author Nome dello sviluppatore @deprecated classe e/o metodo destinati a scomparire in future versioni @exception eccezione generata da un metodo @link collegamento ipertestuale a documentazione locale e non @param parametri di un metodo (richiesto per ogni parametro) @return valori di ritorno di un metodo (non va usato per metodi o costruttori che restituiscono void ) @see associazione a un altro metodo o classe @since data di aggiunta di un metodo a una classe @throws sinonimo di @exception introdotto in Javadoc 1.2 @version numero di versione di una classe o un metodo Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Coding style • I nomi delle classi devono iniziare con una lettera maiuscola • Metodi, variabili, attributi devono iniziare con una lettera minuscola • I nomi composti vengono dichiarati secondo la convenzione CamelCase : le parole vengono riportate per esteso in minuscolo, una di seguito all’altra, utilizzando un carattere maiuscolo come lettera iniziale di ogni parola NomeClasse nomeVariabile nomeMetodo() 25 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 La keyword class • Ogni programma Java consiste di almeno una classe • Per definire una nuova classe si usa la keyword class: public class Hello { • Lo specificatore public indica che la classe è visibile dall’esterno • Il codice va salvato in un file con lo stesso nome della classe ed estensione .java 26 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Il metodo main • Un’applicazione Java comincia l’esecuzione dal metodo chiamato main • La definizione di questo metodo deve essere: public static void main(String[] args) • public indica che il metodo è visibile dall’esterno. • I metodi statici si possono richiamare senza creare un’istanza della classe: Classe.metodoStatico(); • La keyword void indica che il metodo non restituisce alcun valore in output • Segue (tra parentesi tonde) la lista dei parametri accettati dal metodo: in questo caso un array di stringhe 27 di 140 Programmazione client/server in Java Per Peradoperare adoperareililmetodo metododidi una unaclasse classeoccorre occorre sempre sempreistanziarla. istanziarla.Questa Questa può essere una limitazione può essere una limitazione per peralcune alcuneprocedure procedureche che sisilimitano a ricevere un limitano a ricevere un input inputeeprodurre produrreun unoutput, output, senza che debba essere senza che debba essere memorizzato memorizzatouno unostato stato (funzioni). E’ possibile (funzioni). E’ possibile dichiarare dichiararemetodi metodiininmodo modo che non richiedano una che non richiedano una istanza istanzaper peressere essere utilizzati: si tratta utilizzati: si trattadei dei metodi metodistatici statici M. Ruta Telematica II A.A. 20062006-07 Metodo di stampa a video • Per stampare un messaggio a video, si usa l’oggetto predefinito System.out, che permette la stampa a video di messaggi • Per richiamare un metodo di un oggetto si usa la notazione puntata (dot notation): oggetto.metodo(); • System.out ha il metodo println() che stampa un messaggio a video, andando a capo System.out.println(“Hello world!”); 28 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Compilazione ed esecuzione • Per compilare il file Hello.java: javac Hello.java • Se non viene dato nessun messaggio d’errore, verrà creato il corrispondente file .class • Per eseguire il programma: java Hello 29 di 140 Programmazione client/server in Java M. Ruta Telematica II Tipi di dato primitivi A.A. 20062006-07 Interi Reali byte float short double Caratteri Booleani int long 30 di 140 Programmazione client/server in Java M. Ruta Telematica II Range dei tipi di dato A.A. 20062006-07 Tipo Dim (bit) Min Max boolean 8 - - char 16 Unicode 0 Unicode 216-1 byte 8 -128 +127 short 16 -215 +215-1 int 32 -231 +231-1 long 64 -263 +263-1 float 32 1.4012*10-45 3.4282*1038 double 64 4.9406*10-324 1.7976*10138 31 di 140 Programmazione client/server in Java M. Ruta Telematica II Operatori aritmetici A.A. 20062006-07 Operazione Java Operatore Espressione algebrica Espressione Java Addizione + a+b a+b Sottrazione - p-c p-c Moltiplicazione * bm b*m Divisione / x/y x/y Modulo % r mod s r%s Autoincremento ++ x=x+1 x++ Autodecremento -- x=x-1 x-- 32 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Operatori relazionali Operatore Significato Esempio < Minore di a < b <= Minore o uguale a a <= b > Maggiore di a > b <= Maggiore o uguale di a >= b == Uguale a == b != Diverso a != b 33 di 140 Programmazione client/server in Java M. Ruta Telematica II Operatori logici A.A. 20062006-07 Operatore Significato Esempio && And logico (x<a) && (x>b) || Or logico (x<0) || (x>c) ! Not logico !x 34 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Operatori sui bit Operatore Significato Esempio & And bit a bit a&0x01 | Or bit a bit a|0x01 ~ Not (complemento a 1) ~x ^ Xor bit a bit a^0x01 << Shift a sinistra x<<8 >> Shift a destra x>>8 35 di 140 Programmazione client/server in Java M. Ruta Telematica II Istruzioni Java A.A. 20062006-07 Istruzione Dichiarativa Imperativa Semplice assegnazione return 36 di 140 continue Strutturata blocco break Programmazione client/server in Java iterativa condizionale M. Ruta Telematica II A.A. 20062006-07 Istruzioni dichiarative • Dichiarazione di variabile: tipo nomeVar [=val]; int numeroCilindri; float cilindrata = 1993.4f; • Dichiarazione di costante: final tipo NOMECOSTANTE = val; final double RAGGIO = 3.0; 37 di 140 Programmazione client/server in Java M. Ruta Telematica II Istruzioni semplici A.A. 20062006-07 • Assegnazione var = valore; raggio = 2.0f; var = espressione; – Espressioni • Variabili • Costanti • Operatori area = PI*raggio*raggio; areaTriangolo = (base*altezza)/2; 38 di 140 Programmazione client/server in Java M. Ruta Telematica II Condizioni booleane A.A. 20062006-07 • Rappresentano il risultato di espressioni più o meno complesse • Producono un risultato di tipo vero/falso • Si possono usare tutti gli operatori relazionali e logici • Esempi: (x>=10 && x<=100) (X==7 || x==8) 39 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Istruzione condizionale if if(condizione) istruzione; if(condizione) istruzione1; else istruzione2; if(condizione1) istruzione1; else if(condizione2) istruzione2; else if(condizione3) istruzione3; else istruzione4; • istruzione può essere sia una singola istruzione che un blocco di istruzioni, racchiuse tra parentesi graffe 40 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Istruzione condizionale switch switch(espressione) { case val_1: istruz_1_a; … istruz_N_a; break; … case val_N: istruz_1_b; … istruz_N_b; break; default: istruz_1_d; … istruz_N_d; break; } L’espressione deve essere di uno dei seguenti tipi: long, int, byte, short, char 41 di 140 Programmazione client/server in Java M. Ruta Telematica II Istruzioni iterative A.A. 20062006-07 • while while(espr_booleana) istruzione – L’istruzione viene eseguita ripetutamente finché l’espressione booleana risulta vera (ciclo a condizione iniziale) • do-while do istruzione while(espr_booleana); – L’istruzione viene eseguita almeno una volta, mentre con while può non essere mai eseguita (ciclo a condizione finale) • istruzione può essere sia una singola istruzione che un blocco di istruzioni, racchiuse tra parentesi graffe 42 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Istruzioni iterative (2) • for for(init; boolean_expr; step) istruzione • Prima della prima iterazione viene eseguita l’istruzione di inizializzazione; quindi viene effettuato il test sulla condizione booleana; se è vera viene eseguita l’istruzione e quindi l’istruzione step; altrimenti l’esecuzione passa all’istruzione successiva al for (cicli enumerativi) • Esempio: for(int i=0; i<100; i++) System.out.println(“n=“+i); 43 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Metodi • I metodi consentono di rendere modulare un programma • Vantaggi della modularizzazione: – Manutenibilità – Riutilizzo del codice – Compattezza (si evitano ripetizioni di frammenti di codice) 44 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Dichiarazione di un metodo outputType nome(type1 param1,type2 param2,…,typeN paramN) { istruzione1; … istruzioneN; return outputVal; } • param1,param2,…paramN sono detti parametri formali • Il tipo speciale void indica che il metodo non restituisce alcun valore 45 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Chiamata di un metodo • Un metodo può essere richiamato solo in riferimento ad un dato oggetto, usando la seguente sintassi: nomeOggetto.nomeMetodo(arg1,arg2,…, argN); int x = a.f(); • Spesso, nel gergo dell’OOP, ci si riferisce alla chiamata di un metodo di un oggetto nel senso di “inviare un messaggio ad un oggetto” 46 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Passaggio dei parametri by value • Il valore del parametro attuale viene copiato nel corrispondente parametro formale. Qualsiasi modifica ai parametri formali non altererà il valore dei parametri attuali public void m1() { int a=5; m2(a); System.out.println(a); } public void m2(int i) { i=10; } • Per default tutte le variabili dei tipi primitivi (int, float, …) vengono passate by value 47 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Passaggio dei parametri by reference • Il metodo chiamato ha la possibilità di accedere direttamente ai dati del chiamante ed eventualmente modificarli public void m1() { int[] a=new int[5]; a[0]=1; m2(a); System.out.println(a[0]); } public void m2(int[] i) { i[0]=10; } • Per default tutti gli array e gli oggetti vengono passati by reference 48 di 140 Programmazione client/server in Java M. Ruta Telematica II Array A.A. 20062006-07 • Un array è una struttura dati composta da elementi dello stesso tipo • Dichiarazione: tipo[] nome = new tipo[dim]; • Esempio: int[] vett = new int[10]; • L’operatore new alloca la memoria per l’array 49 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Gestione della memoria • Viene utilizzato l’operatore new per allocare memoria per un oggetto • La pulizia della memoria da oggetti non più utilizzati viene svolta automaticamente dal Garbage Collector della JVM • Non appena la memoria scende al di sotto di una certa soglia, viene invocato il Garbage Collector, che va in cerca di tutti gli oggetti non più referenziati e li distrugge, liberando la memoria da essi occupata 50 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Gestione della memoria(2) Prima dell’intervento del Garbage Collector: 51 di 140 Dopo l’intervento del Garbage Collector: Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Inizializzazione di un array • E’ possibile inizializzare un array con una lista di valori: int n[] = {1,2,3,4,5}; • Per default gli elementi degli array dei tipi primitivi sono inizializzati a 0 oppure false per i boolean • La lunghezza di un array è memorizzata nell’attributo length: dim = n.lentgh; 52 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Stringhe • Vengono gestite dalla classe String • Questa classe ha ben 9 tipi di costruttori, qui vengono mostrati i più comuni: – String s = new String(); – String s = new String(“hello”); – String s1 = new String(s); – String s2 = “Ciao”; I Icostruttori costruttorisono sonometodi metodispeciali specialichiamati chiamatiquando quandoviene vienecreata creatauna unanuova nuovaistanza istanzadidiclasse classeeeservono servono ad adinizializzare inizializzarelolostato statoiniziale inizialedell’oggetto. dell’oggetto.Questi Questimetodi metodihanno hannololostesso stessonome nomedella dellaclasse classedidicui cui sono membro e non restituiscono nessun tipo. Se una classe non è provvista di costruttore, Java sono membro e non restituiscono nessun tipo. Se una classe non è provvista di costruttore, Javane ne utilizza uno speciale di default senza caratteristiche specifiche. Dal momento che il linguaggio utilizza uno speciale di default senza caratteristiche specifiche. Dal momento che il linguaggio garantisce garantiscelalachiamata chiamataalalcostruttore costruttoread adogni ogniinstanziazione instanziazionedidiun unoggetto, oggetto,un uncostruttore costruttorescritto scritto correttamente garantisce che tutti i dati membro vengano inizializzati. correttamente garantisce che tutti i dati membro vengano inizializzati. 53 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Metodi per la manipolazione di stringhe • int length() restituisce il numero di caratteri componenti • boolean equals(String s2) confronta due stringhe • int indexOf(String s2) ricerca la sottostringa s2, restituendone l’indice oppure -1 se questa non è presente • String substring(int beginIndex,int endIndex) estrae una sottostringa di indici iniziali e finali beginIndex,endIndex 54 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 • Tipi di dato astratto (ADT) Implementiamo, tramite una classe, un nuovo tipo di dato per memorizzare il tempo nel formato HH:MM:SS import java.text.DecimalFormat; public class Time1 { private int hour; private int minute; private int second; public Time1() { setTime(0,0,0); } public void setTime(int setTime(int h,int h,int hour = (h>=0 && h<24) ? minute = (m>=0 && m<60) second = (s>=0 && s<60) } m,int m,int s) { h : 0; ? m : 0; ? s : 0; Definire Definireun unADT ADTsignifica significaspecificare: specificare: 1.1. Nome dell’ADT Nome dell’ADT 2.2. Costruttori: Costruttori:insieme insiemedelle dellemodalità modalità con cui definire (creare) i valori con cui definire (creare) i valori dell’ADT dell’ADT 3.3. Funzioni: Funzioni:insieme insiemedelle dellesignature signature didifunzioni (operatori) usate funzioni (operatori) usateper per manipolare manipolarei ivalori valoridell’ADT dell’ADT 4.4. Assiomi Assiomi • • regole regoleper perdefinire definireilil significato significato(semantica) (semantica)delle delle funzioni funzioni • • sono sonoregole regoledidiriscrittura, riscrittura, trasformazione trasformazione public String toString() { DecimalFormat twoDigits = new DecimalFormat(“ DecimalFormat(“00” 00”); return twoDigits.format(hour) + “:” + twoDigits.format(minute) + “:”+twoDigits.format(second)+(hour<12?” +twoDigits.format(second)+(hour<12?”AM” AM”:”PM” PM”); } } 55 di 140 Programmazione client/server in Java M. Ruta Telematica II Modificatori di accesso A.A. 20062006-07 • Gli attributi o i metodi dichiarati con la keyword public sono accessibili da ogni parte del programma • Gli attributi o i metodi dichiarati con la keyword private sono accessibili solo da metodi della stessa classe: private int hour; private int minute; • E’ buona norma di progettazione dichiarare private tutti gli attributi di una classe, permettendo l’accesso tramite degli appositi metodi; in questo modo si può controllare la validità dei valori da assegnare agli attributi 56 di 140 Programmazione client/server in Java M. Ruta Telematica II Costruttore A.A. 20062006-07 • E’ uno speciale metodo che ha lo stesso nome della classe ed è privo del valore di ritorno • Ha lo scopo di inizializzare gli attributi di un oggetto durante la fase di creazione public class Punto { double x,y; public Punto(double x0,double y0) { x=x0; y=y0; } }; • Viene invocato quando si crea un oggetto tramite l’operatore new Punto p1 = new Punto(1.0,-1.5); 57 di 140 Programmazione client/server in Java M. Ruta Telematica II Overloading A.A. 20062006-07 • All’interno di una classe è possibile definire più volte un metodo con lo stesso nome, in modo da adeguarlo a contesti di utilizzo differenti • Due metodi possono avere lo stesso nome a patto di: • Il costruttore non è altro che un metodo, quindi è possibile fare overloading: – – Avere lo stesso tipo di ritorno Differire per numero e tipo dei parametri formali public Time1(int h) { setTime(h,0,0); } public Time1(int h,int m) { setTime(h,m,0); } 58 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Creazione di oggetti • Per poter utilizzare la classe Time1, creiamo un’altra classe TimeTest: public class TimeTest { public static void main(String args[]) { Time1 time = new Time1(); time.setTime(13,27,6); System.out.println(“Time: “+time.toString()); } } 59 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Creazione di oggetti (2) • Per creare un nuovo oggetto della classe Time1: Time1 time = new Time1(); • L’operatore new alloca la memoria per il nuovo oggetto della classe Time1. Quindi richiama il costruttore della classe Time1 per inizializzarne gli attributi. Infine collega l’oggetto appena creato con il reference time • Digitando: Time1 time; si crea un reference ad un oggetto di classe Time1, che non è collegato a nessun oggetto. Di conseguenza se si prova a richiamare un metodo, si riceverà un messaggio d’errore 60 di 140 Programmazione client/server in Java M. Ruta Telematica II Metodi set/get A.A. 20062006-07 • Gli attributi privati di una classe possono essere manipolati solo da metodi della stessa classe • Per assegnare un valore ad un attributo, o per ottenerne il valore, si creano dei metodi pubblici, chiamati rispettivamente setAttributo(), getAttributo(); ad esempio: public void hour = } setHour(int h) (h>=0 && h<24) { ? h : 0; public int getHour() { return hour; } 61 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Composizione • Una forma di riutilizzo del codice è la composizione , in cui una classe ha come attributi dei reference ad oggetti di altre classi • Esempio: public class AlarmClock { private Time1 alarmTime; … in questo caso la classe AlarmClock ha come attributo un oggetto della classe Time1 62 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 This reference • Ogni oggetto ha accesso ad un reference a se stesso, chiamato this, tramite il quale si può accedere sia agli attributi che ai metodi • Esempio: public class Time1 { int hour,minute,second; public Time1(int hour,int minute,int second) { this.hour = hour; this.minute = minute; this.second = second; } } • i nomi dei parametri sono uguali a quelli degli attributi. Si usa il reference this per riferirsi a questi ultimi 63 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Attributi statici • Ciascun oggetto di una data classe ha una propria copia degli attributi • Ci sono casi in cui si vuole che una sola copia di un attributo sia condivisa tra tutte le istanze della classe • In questo caso si dichiara tale attributo statico : static int count; Attraverso Attraversolalaparola parolariservata riservatastatic staticèèpossibile possibilespecializzare specializzarealcune alcuneproprietà proprietàoometodi metodi appartenenti ad una classe. In particolare, se una proprietà è preceduta dalla parola appartenenti ad una classe. In particolare, se una proprietà è preceduta dalla parolastatic, static,tale tale proprietà (il suo valore) si intenderà come una proprietà di classe e non solo di una determinata proprietà (il suo valore) si intenderà come una proprietà di classe e non solo di una determinata istanza istanzadidiessa. essa.Una Unaeventuale eventualemodifica modificaalalvalore valoredidiuna unaproprietà proprietàdidiclasse classeverrebbe verrebbe automaticamente avvertita da tutte le istanze esistenti di tale classe. Analogamente, automaticamente avvertita da tutte le istanze esistenti di tale classe. Analogamente,un unmetodo metodo static staticèèconsiderato consideratoun unmetodo metodoappartenente appartenentead aduna unaclasse. classe. 64 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Package • Un package è una collezione di classi • I principali benefici derivanti dall’uso di package sono: – Riutilizzo del codice – Garantiscono l’unicità del nome di una classe • Con il JDK vengono forniti una serie di package per le funzionalità più comuni: I/O, grafica, networking, suono, … 65 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Creazione di un package • Aggiungere prima della dichiarazione di una classe: package it.poliba.sisinflab; • Compilare con: javac –d . Time1.java L’opzione –d dice al compilatore di creare le directory specificate nel nome del package a partire da quella corrente. In questo caso sarà creata una directory it, contenente la directory poliba, contenente sisinflab che conterrà il file Time1.class 66 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Visibilità a livello package • Nella dichiarazione di attributi o di classi, se non si specifica né public né private, la visibilità è da intendersi a livello di package • Esempio: package it.poliba.prova; class Prova { int nome; } in questo caso la classe Prova e il suo attributo nome sono visibili solo dalle altre dello stesso package 67 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Uso di un package • Per poter utilizzare le classi contenute in un package in un’altra classe esterna a tale package, si usa la keyword import: import it.poliba.sisinflab.*; questa istruzione importa tutte le classi del package specificato 68 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Classpath • Il compilatore Java cerca le classi da linkare: – prima in quelle standard fornite insieme al J2SDK – poi nella directory ext di tale Software Development Kit – infine nei percorsi specificati tramite la variabile d’ambiente classpath • Per default la variabile classpath contiene solo la directory corrente. Se si devono usare package contenuti in altre directory, si deve aggiungere il percorso a tale variabile d’ambiente: CLASSPATH=c:\mypackages; 69 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 File jar • Quando un’applicazione Java è composta da molte classi, è possibile raggruppare i files .class in un archivio compresso, di estensione .jar • In ogni archivio jar è presente un file chiamato MANIFEST.MF che contiene informazioni sul contenuto dell’archivio • Il file MANIFEST è un file di testo composto da coppie attributo-valore, ad esempio: Manifest-version: 1.0 Created-By: NetBeans IDE Main-class: ServerMain • Per creare un archivio si usa il comando jar: jar cvmf MANIFEST.MF archivio.jar input-files Un UnIntegrated IntegratedDevelopment DevelopmentEnvironment Environment(IDE), (IDE),ininitaliano italianoambiente ambienteintegrato integratodidisviluppo, sviluppo,(anche (anche Integrated Design Environment o Integrated Debugging Environment) è un software che aiuta Integrated Design Environment o Integrated Debugging Environment) è un software che aiutai i programmatori programmatorinello nellosviluppo sviluppodel delsoftware. software. Normalmente Normalmenteconsiste consisteininun uneditor editordidicodice codicesorgente, sorgente,un uncompilatore compilatoree/o e/oun uninterprete, interprete,un untool tooldidi building buildingautomatico automaticoee(solitamente) (solitamente)un undebugger. debugger. 70 di 140 Programmazione client/server in Java M. Ruta Telematica II File jar A.A. 20062006-07 Opzione Descrizione c Crea un archivio nuovo o vuoto aggiungendovi i file. Se uno qualsiasi qualsiasi dei nomi indicati è una directory questa viene elaborata in modo ricorsivo t Visualizza il contenuto dell’ dell’archivio u Aggiorna un file jar esistente x [nomefile] Estrae i file. Se se ne indicano i nomi vengono estratti solo i file corrispondenti f Specifica il nome del file jar come secondo argomento del comando. Se manca questo flag, flag, il comando jar riporta il risultato nell’ nell’output standard (se si sta creando un file .jar) jar) oppure legge dall’ dall’input standard (se si sta estraendo o visualizzando un file .jar) jar) v Genera un output verboso m Aggiunge un manifest ad un file .jar. jar. Ogni archivio ha un manifesto predefinito, ma si può anche indicare un proprio manifesto se si vuole autenticare autenticare il contenuto dell’ dell’archivio 0 Memorizza senza compressione M Non crea un file di manifesto per queste voci I Crea un file indice C Cambia temporaneamente la directory di destinazione 71 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Ereditarietà • E’ una forma di riutilizzo del software in cui una nuova classe viene creata a partire da una esistente, ereditandone gli attributi ed i metodi, ed aggiungendone di nuovi, per specializzarne il comportamento • Il vantaggio è che non è necessario disporre del codice sorgente di una classe per poterla estendere 72 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 • Superclasse e sottoclasse Classe base (superclasse): public class Biciclo { public void sterza() {}; public void frena() {}; public void avvia() {}; private Color colore; } • Classe derivata (sottoclasse): public class Ciclomotore extends Biciclo { public accendiMotore() {}; private String targa; private float cilindrata; } 73 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 74 di 140 Gerarchia di classi Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 • Membri “protected” Gli attributi e i metodi di una classe dichiarati con lo specificatore di accesso protected sono visibili soltanto dalle sue sottoclassi public ClasseBase { protected int attr1; } public ClasseDerivata extends ClasseBase { public ClasseDerivata() { attr1=0; } } 75 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Costruttori nelle classi derivate • Quando viene istanziato un oggetto di una classe derivata, deve essere richiamato il costruttore della superclasse per inizializzare gli attributi ereditati • Per default viene richiamato il costruttore standard della superclasse • Se si vuole specificare un particolare costruttore, si usa la keyword super: super(x,y); 76 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Overriding di metodi nelle classi derivate • E’ possibile ridefinire un metodo già dichiarato nella superclasse public class Ciclomotore extends Biciclo { public void avvia() { accendiMotore(); premiFrizione(); innestaMarcia(); rilasciaFrizione(); } } 77 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Polimorfismo • Si supponga di avere le seguenti classi Cerchio,Triangolo,Rettangolo tutte derivate da Figura • Sia dato un array figure[] di oggetti delle suddette classi • Ciascuna di esse ha un metodo draw(), con una specifica implementazione • Si supponga di voler disegnare tutte le figure contenute nel suddetto array: Figura[] figure figure[0] = new figure[1] = new figure[2] = new = new Figura[3]; Cerchio(); Triangolo(); Rettangolo(); for(int i=0; i<figure.lentgh; i++) figure[i].draw(); • Possiamo semplicemente richiamare il metodo draw() della superclasse Figura, lasciando al programma, a run-time, il compito di stabilire quale metodo draw() richiamare in base al tipo dell’oggetto 78 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Interfacce • Un’interfaccia permette di stabilire la forma di una classe (nome dei metodi, lista dei parametri e valori di ritorno), ma il corpo dei metodi deve essere vuoto • Serve per stabilire un protocollo di comunicazione tra classi • Per crearla basta usare la keyword interface al posto di class • Affinchè una classe si conformi ad una particolare interfaccia, si usa la keyword implements: class Flute implements Instrument con questa sintassi, la classe Flute implementa l’interfaccia Instrument, ovvero dovrà ridefinire i metodi esposti dall’interfaccia, specificandone il codice 79 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Gestione delle eccezioni • Un’eccezione indica che si è verificato un evento non convenzionale durante l’esecuzione di un programma • Il sistema di gestione delle eccezioni in Java è basato sull’assunzione che il metodo che rileva l’evento generalmente non è in grado di gestirlo, piuttosto lancia (throw) un’eccezione • Di noma esiste un’altra porzione di codice che cattura (caught) l’eccezione e la gestisce 80 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Blocco try-catch • Il codice in grado di lanciare eccezioni viene racchiuso in un blocco try • Di norma esiste uno o più blocchi catch, che specificano il tipo di eccezione che possono gestire e contengono il codice per gestirla • Di norma esiste un blocco finally che contiene codice da eseguire comunque, indipendentemente dal verificarsi dell’eccezione 81 di 140 Programmazione client/server in Java M. Ruta Telematica II Esempio A.A. 20062006-07 public int div (int a, int b) { int ExceptionNum = 0; try { int c = a/b; } catch(ArithmeticException e) { System.out.println(“Eccezione: ”+ e.getClass()); System.out.println(“Errore: ”+ e.getMessage()); ExceptionNum++; } finally { if (ExceptionNum==0) System.out.println(“Nessuna eccezione sollevata”); else System.out.println(“Eccezioni sollevate: ”+ ExceptionNum); } return c; } 82 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Lanciare un’eccezione • Quando, in un proprio metodo, si vuole lanciare un’eccezione, si usa la keyword throw, seguita da un oggetto di una classe derivata da Throwable • Quando viene lanciata un’eccezione, il controllo esce dal blocco try e passa alla prima clausola catch • I metodi che possono lanciare eccezioni, devono dichiararlo esplicitamente nella loro signature, usando la keyword throws, seguita dalla classe di eccezione che possono lanciare 83 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Esempio di throw public class DivideByZeroException extends ArithmeticException { public DivideByZeroException() { super(“Tentativo di divisione per zero!”); } }; … public double quoziente(int numeratore,int denominatore) throws DivideByZeroException { if(denominatore==0) throw new DivideByZeroException(); return (double) numeratore/denominatore; } 84 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 Stream di I/O • L’I/O in Java è basato sul concetto di stream (flusso), che rappresenta una connessione ad un canale di comunicazione • Uno stream è quindi collegato ad un dispositivo fisico di I/O • Esistono sia stream di input che di output 85 di 140 Programmazione client/server in Java M. Ruta Telematica II A.A. 20062006-07 • Proprietà degli stream sono FIFO : ciò che viene scritto da un OutputStream viene letto nello stesso ordine dal corrispondente InputStream • sono ad accesso sequenziale: non è fornito alcun supporto per l'accesso casuale • sono read-only oppure write-only: uno stream consente di leggere (InputStream) o scrivere (OutputStream) ma non entrambe le cose. Se ambedue le funzioni sono richieste, ci vogliono 2 distinti stream: questo è un caso tipico delle connessioni di rete: da una connessione (socket) si ottengono due stream, uno in scrittura e uno in lettura • sono bloccanti: la lettura blocca il programma che l'ha richiesta finché i dati non sono disponibili. Analogamente, la scrittura blocca il richiedente finché non è completata • quasi tutti i loro metodi possono generare eccezioni 86 di 140 Programmazione client/server in Java M. Ruta