Programmazione client/server in Java

Transcript

Programmazione client/server in Java
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