Sei sulla pagina 1di 207

Programmazione OO in Java

Istruzioni di controllo

Andrea Bei
andrea.bei@dis.uniroma1.it

Istruzioni per il controllo di flusso


Istruzioni di selezione
if
switch

Istruzioni di iterazione
while
do-while
for

Istruzioni di salto
break
continue
return
Programmazione OO in Java - Andrea Bei

Istruzione di selezione: IF - 1
Sintassi:
if(<condizione>) <istruzione_1>
[else <istruzione_2>]
<istruzione_1> e <istruzione_2> possono essere istruzioni
singole o blocchi

Semantica:
Se <condizione>=true viene eseguita listruzione o il blocco
di istruzioni <istruzione_1> [ altrimenti viene eseguita
listruzione o il blocco di istruzioni <istruzione_2> ]

Il ramo else si lega allistruzione if pi vicina

Programmazione OO in Java - Andrea Bei

Istruzione di selezione: IF 2
Esempio 1:
if (x==10) System.out.println(il valore di x 10);

Esempio 2:
if (x>0 && y>0)System.out.println (coordinate positive);
else if (x>0) System.out.println(ascissa positiva);
else if (y>0) System.out.println(ordinata positiva);
else System.out.println(coordinate nulle o negative);

Esempio 3:
if (x==10) {
System.out.println(il valore di x 10);
System.out.println(...sono ancora nel blocco if);
}
System.out.println(...sono fuori dal blocco if)
Programmazione OO in Java - Andrea Bei

Istruzione di selezione: IF 3
Esempio 4:

Programmazione OO in Java - Andrea Bei

Istruzione di selezione: SWITCH - 1


Sintassi:

switch(<espressione>){
case <costante 1>:[<istruzione 1>;]*
case < costante 2>:[<istruzione 2>;]*

case < costante n>:[<istruzione n>;]*


[default : [<istruzioneDefault>;]*]
}

Semantica:
Se <espressione>=<costante i> vengono eseguite le
listruzioni/blocchi <istruzione j> con j>=i . Se
<espressione> divers da tutte le costanti viene
eseguita listruzione <istruzioneDefault>

Lespressione allinterno dello switch deve essere di


tipo char, byte, short o int
Programmazione OO in Java - Andrea Bei

Istruzione di selezione: SWITCH 2

Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: WHILE - 1


Sintassi:
while(<condizione>) <istruzione>;

Semantica:
Finch <condizione>=true viene eseguita
listruzione/blocco <istruzione>

Esempio:
int i = 0;
while (i<10){
System.out.println(Il valore di i e: +i);
i=i+1;
}
Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: WHILE 2

Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: DO WHILE -1


Sintassi:
do <istruzione> while (<condizione>);

Semantica:
Viene eseguita listruzione/blocco <istruzione> finch
<condizione>=true. A differenza del while-do in questo
caso listruzione/blocco viene sempre eseguita almeno
una volta.

Esempio:
int r = 5;
do{
System.out.println(Countdown=+r);
r--;
} while (r>0)
Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: DO WHILE -2

Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: FOR - 1


Sintassi:
for (<istr1>; <condiz>; <istr2>) <istr3>;
<istr1> e <istr2> sono istruzioni semplici o liste di
istruzioni separate da virgola
<istr3> un istruzione o un blocco

Semantica:
<istr1>;
while (<condiz>){
<istr3>
<istr2>
}
Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: FOR - 2


Esempio 1:

int x;
for(x=0; x<10; x++)
System.out.println(Counter: +x);

Esempio 2:

for(int x=0; x<10; x++)


System.out.println(Counter: +x);

Esempio 3:

for(int x=0, int i=10; x<10; x+=2, i--)


System.out.println(i=+i+ x=+x );

Programmazione OO in Java - Andrea Bei

Istruzione di iterazione: FOR - 3

Programmazione OO in Java - Andrea Bei

Istruzione di salto: BREAK - 1


Sintassi:
break [<label>]
Semantica:
restituisce il controllo allistruzione che
include quella con il break e che marcata
con <label>
Listruzione break usata soprattutto:
Allinterno dellistruzione di switch
Per uscire da un ciclo
Programmazione OO in Java - Andrea Bei

Istruzione di salto: BREAK - 2


Esempio 1: Per uscire da un ciclo
java.io.FileInputStream s = new FileInputStream(a);
while (true){
b = s.read();
if (b == -1) break;
System.out.println(b);
}

Osservazione rispetto alluscita da un ciclo:


while
do while
for
break

cicli condizione allinizio


cicli condizione alla fine
ciclo con contatore
ciclo con condizione anche in mezzo
Programmazione OO in Java - Andrea Bei

Istruzione di salto: BREAK - 3

Programmazione OO in Java - Andrea Bei

Istruzione di salto: CONTINUE - 1


Sintassi:
continue [<label>]
Semantica:
forza uniterazione anticipata del ciclo che include il
blocco con il continue e che marcato con <label>
Esempio:
Stampa i numeri da 1 a 10 tranne il 5.
for (int i= 0; i<10; i++){
if (i==5) continue;
System.out.println(i)
}
Programmazione OO in Java - Andrea Bei

Istruzione di salto: CONTINUE - 2

Programmazione OO in Java - Andrea Bei

Istruzione di salto: RETURN


Sintassi:
return [<valore>]
Semantica:
Istruzione di controllo usata per ritornare
esplicitamente da un metodo. In altri termini fa s
che il controllo del programma venga trasferito di
nuovo a chi ha chiamato il metodo.
Osservazione:
Le istruzioni successive allistruzione di return non
vengono eseguite.
Programmazione OO in Java - Andrea Bei

Programmazione OO in Java

Collezioni

Andrea Bei
andrea.bei@dis.uniroma1.it

Collezioni
Una collezione un oggetto contenitore di altri
oggetti
La necessit di strutture dati che raggruppino oggetti
comune a molte applicazioni.
Es: mail folder (collezione di mail) , rubriche (collezione
di associazioni nome-numero di telefono) ...

Una collezione una struttura di pi alto livello


rispetto agli array.
Non necessario stabilire a priori il massimo numero degli
elementi di una collezione (negli array deve essere fissato
allallocazione)
E possibile inserire o cancellare un oggetto in qualsiasi
posizione senza dover necessariamente spostare gli altri
oggetti
E possibile mantenere un ordinamento tra gli oggetti
E possibile avere diverse politiche di accesso (es: FIFO,
Programmazione OO in Java - Andrea Bei
LIFO)

Le collezioni in Java
Liste
Mantengono un ordinamento
Hanno posizioni indicizzate
Possono avere diverse politiche di accesso (es:LIFO,FIFO)

Insiemi
Non ammettono duplicati

Mappe
Gestiscono un insieme di coppie (chiave,valore) e
consentono laccesso diretto del valore a partire dalla
chiave

Programmazione OO in Java - Andrea Bei

Il framework per la gestione di collezioni


Il package java.util fornisce un framework per la gestione di
collezioni costituito da:
interfacce: consentono di utilizzare un tipo di collezione senza doverne
conoscere limplementazione
classi: implementazioni concrete dei tipi di collezione definiti dalle
interfacce
algoritmi:metodi che implementano funzioni sulle collezioni come ricerca
e ordinamento

I benefici delluso del framework sono molteplici


riduzione dellimpegno. Sono gi disponibili le principali strutture dati,
non occorre riscriverle.
incremento di performance. Classi e algoritmi ottimizzati
incremento della qualit del codice. Si fa leva sul concetto di interfaccia.
Le implementazioni di ogni interfaccia sono intercambiabili conferendo
manutenibilit al codice
interoperabilit tra metodi. Molti metodi ritornano o accettano come
parametro una interfaccia del framework. E un modo standard di
trattare aggregati di oggetti
Programmazione OO in Java - Andrea Bei

Liste e Insiemi: interfacce

Programmazione OO in Java - Andrea Bei

Mappe: interfacce

Programmazione OO in Java - Andrea Bei

Liste e Insiemi: implementazioni

ArrayList
limplementazione pi usata
conviene se si hanno
prevalentemente accessi posizionali
agli elementi (tempo costante)
LinkedList
conviene se si hanno
prevalentemente inserimenti in testa
e cancellazioni al centro (tempo
costante)

HashSet
limplementazione pi usata
conviene se si hanno
prevalentemente accessi diretti agli
elementi (tempo costante)
TreeSet
conviene se si ha necessit di
mantenere un ordinamento (tempo
logaritmico rispetto agli elementi)

Programmazione OO in Java - Andrea Bei

Mappe: implementazione

HashMap
limplementazione pi usata
conviene se si hanno accessi
diretti agli elementi
tempo di accesso costante
TreeMap
conviene se si ha necessit di
mantenere un ordinamento tra gli
elementi
tempo di accesso logaritmico

Programmazione OO in Java - Andrea Bei

Iteratori
Un iteratore fornisce metodi per eseguire una visita degli
elementi di una collezione (iterare sugli elementi)
Linterfaccia Iterator fornisce i seguenti metodi
Object next(): si posiziona sullelemento successivo e lo restituisce
boolean hasNext(): restituisce true se il esiste successivo
elemento
void remove(): rimuove lattuale elemento

Esempio: il metodo filtro rimuove tutti gli elementi che


non soddisfano la condizione verificata dal metodo cond
static void filtro(Collection c) {
Iterator i = c.iterator();
while(i.hasNext())
if (!cond(i.next())) i.remove();
}
Programmazione OO in Java - Andrea Bei

ArrayList: esempio

Notare:
1) La variabile l di tipo Collection NON ArrayList (riga 4 di MainClass). I
riferimenti a collezioni dovrebbero essere sempre del tipo di una delle
interfacce del framework. Evitare sempre luso delle classi concrete come tipi
per le variabili.
2) Il metodo printSommeEConcat polimorfo ha come parametro
Collection e pu funzionare per tutti i sottotipi di Collection
Programmazione OO in Java - Andrea Bei

HashSet, TreeSet: esempio


Notare:
1. Utilizzando le interfacce come
tipi per le variabili posso
cambiare limplementazione da
HashSet a TreeSet modificando
una sola riga (Utility riga 4)

Programmazione OO in Java - Andrea Bei

HashMap, TreeMap: esempio


Lapplicazione Frequenza legge il nome di un file da linea di comando e
fornisce in output la frequenza delle parole nel file. La mappa mantiene le
coppie (key,value) dove (key=parola,value=frequenza parola)

Programmazione OO in Java - Andrea Bei

HashMap, TreeMap: esempio

java.util.StringTokenizer
permette di dividere una stringa
nelle parole (token) che la
costituiscono.
Il metodo nextToken restituisce
il token successivo.

Programmazione OO in Java - Andrea Bei

Algoritmi
La classe Collections fornisce metodi statici che
impementano algoritmi di utilit. I principali sono:
Sorting: ordina gli elementi di una lista
static void sort(List list)

Shuffling: permuta in modo casuale gli elementi di una lista


static void shuffle(List list)

Reverse: inverte gli elementi di una lista


static void reverse(List list)

Fill: inserisce un oggetto in tutti gli elementi di una lista


static void fill(List list, Object obj)

Copy: copia il contenuto di una lista in un altra lista


static void copy(List dest, List src)

Searching: ricerca binaria di una chiave in una lista


static int binarySearch(List list, Object key)

Min e Max:
static Object min(Collection coll)
static Object max(Collection coll)
Programmazione OO in Java - Andrea Bei

Relazioni dordine
Alcuni metodi (es: sorting, min e max, e searching) si basano sull
esistenza di una relazione dordine tra gli oggetti della lista. In altre
parole: dati due oggetti A e B della lista deve essere possibile stabilire
quali delle relazioni A>B;A=B;A<B sia vera.
Lesistenza di una relazione dordine tra gli oggetti di una classe
rappresentata dallimplementazione dell interfaccia Comparable

Per molte classi (es:Integer, Double, Date, File, String,...) la relazione


dordine naturale nota e linterfaccia Comparable gi implementata

E possibile usare i metodi della classe Collections con qualsiasi classi di


oggetti per cui sia stata definita una relazione dordine naturale tramite
limplementazione dellinterfaccia Comparable.
Programmazione OO in Java - Andrea Bei

Interfaccia Comparable: esempio

Programmazione OO in Java - Andrea Bei

Programmazione Orientata agli Oggetti

Elaborazione

Concetti OO e Modello di
Progetto

Andrea Bei
andrea.bei@dis.uniroma1.it

Concetti OO
Classe
Rappresenta una classe di oggetti aventi le stesse caratteristiche
strutturali e comportamentali
Es.: la classe Automobile rappresenta la classe degli oggetti che hanno
4 ruote, un motore, una marca, un modello (caratteristiche strutturali) e
che possono accelerare, frenare, sterzare, fare retromarcia, fare
rifornimento (caratteristiche comportamentali)

Oggetto
Un entit appartenente ad una classe.
Es.: Alfa 147, Ford ka, Fiat Punto, sono oggetti della classe
Automobile

Attributi
Definiscono le caratteristiche strutturali di una classe.
Es: attributi della classe Automobile possono essere: motore, ruote,
marca e modello

Operazioni
Definiscono le caratteristiche comportamentali di una classe.
Es: accelera(), frena(), rifornimento(int litri), retromarcia(), sterza(int
gradi)
Programmazione Orientata agli Oggetti - Andrea Bei

Classi e oggetti
Nome della classe

Classe Libro

Attributi della classe (struttura)


Operazioni della classe (comportamento)
copieAcquistate:
copieDisponibili=copieDisponibili+numeroCopie

copieVendute:
copieDisponibili=copieDisponibili-numeroCopie

getCopie restituisce il valore copieDisponibili

Nome oggetto:
Classe

Valore degli
attributi
per il particolare
oggetto della
classe

L1,L2,L3: Oggetti o
instanze della
classe Libro
Programmazione Orientata agli Oggetti - Andrea Bei

Classi: definizione e notazione


Definizione: caratterizzata da
Identit: il nome della classe
Attributi: sono lastrazione delle propriet comuni degli oggetti della
classe
Operazioni: definiscono il comportamento della classe. Sono i servizi
che un oggetto della classe offre agli altri oggetti. Una operazione
definita dalla sua segnatura: nome, numero,ordine, tipo degli
argomenti e tipo del valore ritornato. Un metodo limplementazione
di una operazione in un linguaggio di programmazione
Interfaccia: linsieme delle operazioni visibili dagli altri oggetti
(pubbliche)

Notazione UML

v specifica la visibilit dellattributo o delloperazione. Pu essere uno dei simboli:


+ :Public, visibile da tutti gli altri oggetti
- :Private, visibile solo dai metodi della classe
# :Protected, visibile dai metodi della classe e delle sottoclassi
% :Package, visibile dagli oggetti di classi dello stesso package della classe
Programmazione Orientata agli Oggetti - Andrea Bei

Oggetto: definizione e notazione


Oggetto
Ecaratterizzato da:
Identit: il nome delloggetto
Stato: comprende gli attributi e i valori degli attributi
Comportamento: definito dai metodi che usano gli attributi o ne
cambiano il valore

Notazione UML
Varie possibilit di scelta a seconda del livello di dettaglio del
diagramma
Oggetto
Oggetto
nominato
anonimo
Oggetto con
stato visibile

Programmazione Orientata agli Oggetti - Andrea Bei

Interfacce
Definizione
una interfaccia una specifica di comportamento: una classe che
implementa una interfaccia fornisce una possibile realizzazione della
specifica
una interfaccia definita da un insieme di operazioni astratte.
la relazione che lega una interfaccia alla classe che la implementa si
chiama realizzazione
una interfaccia pu ereditare operazioni da unaltra interfaccia

Notazione UML

Realizzazione
La classe Elicottero
implementa linterfaccia
IVolante in quanto
implementa tutte le sue
operazioni (in questo caso
vaiA)

Programmazione Orientata agli Oggetti - Andrea Bei

Interfacce: notazioni UML

Window1

Timer

Notazione
a socket
socket line notation
Window1 usa linterfaccia
Timer
Window1 uses the Timer
E
una interfaccia richiesta
interface
it has a required interface

Notazione
di dipendenza
dependency
line notation
Window2 ha una dipendenza con
linterfaccia
Timer
quando collabora
Window2 has
a dependency
on the
conTimer
loggetto
Clock2
interface
when it collaborates
with a Clock2 object

interface
Timer

Clock2
...

getTime()

Clock1
...
getTime()
...

Timer

Window2

Timer

Window3

getTime()
...

Clock1
Clock1
implementa
implements and
linterfaccia
Timer.
provides
the
Timer
una
Timer interface
interfaccia
fornita
da Clock1

Clock3
...
getTime()
...

La notazione
lollipop
indica
che Clock3
lollipop
notationa indicates
Clock3
implements
fornisce
linterfaccia
Timer.
and provides the Timer interface to clients
Timer una interfaccia fornita

Notazione a socket
Window3
hanotation
una dipendenza con
socket line
linterfaccia Timer quando collabora
con
loggetto
Clock3
Window3
has a
dependency on the

Timer is a provided interface

Programmazione Orientata agli Oggetti - Andrea Bei

Timer interface when it collaborates


with a Clock3 object

Principi OO
Incapsulamento.
E la capacit di una classe di incapsulare insieme dati e operazioni sui
dati

Information Hiding
nascondere attributi e operazioni che rappresentano limplementazione.
mostrare solo le operazioni che devono essere visibili dagli altri oggetti.

Ereditariet
E la possibilit di derivare una classe da una classe esistente ereditando
da questultima attributi e operazioni.
La classe derivata detta sottoclasse, la classe esistente superclasse.
La sottoclasse pu definire nuovi attributi e operazioni e ridefinire attributi
e operazioni della superclasse sovrascrivendoli (Overriding)

Polimorfismo
Dal greco pluralit di forme: la capacit di una cosa di assumere forme
diverse a seconda del contesto.
Nei linguaggi OO i tipi di polimorfismo sono 4: ad-hoc
(coercion,overloading) e universale (per inclusione, parametrico)
In Java ci si riferisce principalmente alla possibilit per una variabile di
contenere valori di tipi
diversi e per una operazione di eseguire
8
Programmazione Orientata agli Oggetti - Andrea Bei
implementazioni diverse a seconda del contesto (polimorfismo universale

Progettazione a oggetti
Approcci alla progettazione OO:
Si progetta mentre si codifica

Si progetta mentre si codifica (uso di IDE con strumenti di refactoring)

Prima si progetta in UML e poi si codifica (il pi comune)

Si progetta in UML (a mano libera o con uno strumento CASE) e poi si


codifica con un IDE

Prima si progetta in UML e poi si genera automaticamente il codice


Strumenti per la generazione automatica di codice da UML

Capacit necessarie per la progettazione OO

La progettazione OO richiede due capacit fondamentali


Assegnare correttamente responsabilit agli oggetti
Conoscere e applicare i Design Pattern

I diagrammi UML sono solo una rappresentazione delle decisioni di


progetto prese grazie alle competenze di cui sopra
Conoscere UML non significa sapere progettare ma saper
rappresentare le scelte di progettazione
Programmazione Orientata agli Oggetti - Andrea Bei

Progettazione a oggetti con UML


Modellazione dinamica: realizzazione di diagrammi dinamici quali
interazione (sequenza o comunicazione), automi a stati, di attivit
obiettivo: progettare la logica e il comportamento degli oggetti (i metodi)
la pi importante perch si individuano le responsabilit degli oggetti

Modellazione statica: realizzazione dei diagrammi delle classi, dei


package e di deployment
obiettivo: progettare nomi delle classi e dei package, degli attributi e delle
operazioni

Programmazione Orientata agli Oggetti - Andrea Bei

10

Relazioni dinamiche tra oggetti: messaggi


Messaggi
Un messaggio una relazione dinamica tra oggetti
Un oggetto O1 spedisce un messaggio ad un oggetto O2 quando
richiede alloggetto O2 lesecuzione di una operazione
Gli oggetti che costituiscono un programma comunicano tra di loro
mediante lo scambio di messaggi
I messaggi vengono usati per mostrare questa comunicazione negli
interaction diagram
I messaggi sono sincroni (il mittente si pone in attesa del risultato)
oppure asincroni (il mittente continua lesecuzione il risultato pu non
esserci)

asincrono

Programmazione Orientata agli Oggetti - Andrea Bei

sincrono

11

Modellazione dinamica: Diagrammi di interazione


Diagrammi di sequenza
:A

myB : B

doOne

Una possibile
implementazione della
classe A in Java

public class A {
doTwo

private B myB;
doThree

Diagrammi di comunicazione
doOne

:A

public A(){
myB=new B();
}
public doOne(){
myB.doTwo();
myB.doThree();
}
}

1: doTwo
2: doThree
myB : B

Diagrammi di sequenza e comunicazione sono isomorfi (


possibile ricavare automaticamente luno dallaltro)

i diagrammi di sequenza danno enfasi alla sequenza temporale


dei messaggi scambiati
i diagrami di comunicazione danno enfasi alla comunicazione
tra oggetti
Programmazione Orientata agli Oggetti - Andrea Bei

12

Esempi di diagrammi di interazione


: Register

: Sale

makePayment(cashTendered)
makePayment(cashTendered)
create(cashTendered)

Sequenza

: Payment

direction of message

Comunicazione

makePayment(cashTendered)

:Register

1: makePayment(cashTendered)

Una possibile implementazione della classe Sale in Java

:Sale

1.1: create(cashTendered)
:Payment

public class Sale {


private Payment payment;
public makePayment(Money cashTendered){
payment=new Payment(cashTendered)
//...
}
}

Programmazione Orientata agli Oggetti - Andrea Bei

13

Notazione partecipanti
Istanza anonima della classe
lifeline box representing an
Sale

unnamed instance of class Sale

:Sale

Istanza nominata della classe


lifeline box representing a
Sale. (il nome s1)

named instance

Istanza
di una
metaclasse
lifeline box
representing
the(Font
class
una
istanza
della
classe
Class)
Font, or more precisely, that Font is

an instance of class Class an


instance of a metaclass

metaclass
Font

s1 : Sale

Istanza
di una
classe ArrayList
lifeline box
representing
an
parametrizzata
per contenere
instance of an ArrayList
class,
oggetti
di tipo Sale
parameterized
(templatized) to

hold Sale objects

sales:
ArrayList<Sale>

Istanza di una classe Sale come


lifeline box representing
elemento iesimo della lista sales

one instance of class Sale,


selected from the sales
ArrayList <Sale> collection

List un interfaccia. In UML 2


List is an interface
possibile usare interfacce e classi
astratte

in UML 1.x we could not use an


interface here, but in UML 2, this (or
an abstract class) is legal

sales[ i ] : Sale

x : List

Esempio
related
correlato

example

Programmazione Orientata agli Oggetti - Andrea Bei

14

Notazione linee di vita


: Register

: Sale

doX
doA
Un messaggio trovato: si
a found
message in cui
chiama cos
un messaggio
whoseilsender
will not da
viene omesso
partecipante
be
specified
cui generato

Specifica di esecuzione:
rappresenta lintervallo di tempo in
cui il partecipante (in questo caso
specification
una istanza execution
di Register)
ha il
bar indicates focus of
controllo

control

doB
doC
doD

Un messaggio sincrono: E un
messaggio mostrato con una
typicalpiena.
sychronous message
freccia

shown with a filled-arrow line

Programmazione Orientata agli Oggetti - Andrea Bei

15

Notazione messaggi self e valori di ritorno


: Register

: Sale

doX
d1 = getDate

Valori di ritorno:
si pu etichettare il messaggio con
var=nomeMessaggio(parametro)
Si pu usare una freccia di ritorno
tratteggiata etichettata con il valore
di ritorno

getDate
aDate

: Register
doX
clear

Messaggio a this ( a se stesso )


si usa una freccia che parte dalla
linea di specifica di esecuzione e
rientra in una linea di specifica di
esecuzione annidata rispetto alla
prima

Programmazione Orientata agli Oggetti - Andrea Bei

16

Notazione creazione e distruzione


: Register

Loggetto
creato
note that newly created
mostrato
alla
stessa
objects are placed
at their
altezza
del
messaggio
di
creation "height"
creazionev

: Sale

makePayment(cashTendered)
create(cashTendered)

: Payment

authorize

: Sale
create(cashTendered)

: Payment

...
destroy

Una X sulla linea di vita


rappresenta
unstereotyped
messaggio di
the destroy
distruzione esplicita

message, with the large


X and short lifeline
indicates explicit object
destruction

Programmazione Orientata agli Oggetti - Andrea Bei

17

Notazione - Frame
:A

:B
makeNewSale

Ciclo con un
espressione di
guardia
a UML loop
booleana
frame, with a

loop

[ more items ]

enterItem(itemID, quantity)

boolean guard
expression

description, total

endSale

Condizione con
UML 2.0
: Foo

opt

Condizione con
UML 1.0
: Bar

: Foo

: Bar

xx

xx

calculate

[ color = red ] calculate

yy

yy

[ color = red ]

Programmazione Orientata agli Oggetti - Andrea Bei

18

Notazione Frame
Messaggi
condizionali
mutuamente esclusivi
(if .. then .. else)

:A

:B

:C

doX
alt

[ x < 10 ]
calculate

Iterazione su una
collezione

[ else ]
calculate

lineItems[i] :
SalesLineItem

: Sale
t = getTotal

loop

[ i < lineItems.size ]

st = getSubtotal

i++

Una istanza di
This lifeline box represents one
SalesLineItem
della
instance from a collection of many
collezione
il
SalesLineItem lineItems.
objects.
valore di i coincide con
lineItems[i]
is theguardia
expressiondel
to
quello
della
select one element from the
frame
loop
collection of many
SalesLineItems; the i value
refers to the same i in the guard
in the LOOP frame

an action
box may
contain arbitrary
language
Una
casella
di azione
pu permettere
statements (in this case, incrementing i)
di esplicitare una o pi operazioni in
un
linguaggio
it isqualsiasi
placed over the
lifeline to which it applies
Programmazione Orientata agli Oggetti - Andrea Bei

19

Notazione messaggi polimorfi


Payment {abstract}

Payment una classe


Payment con
is an abstract
astratta
delle
superclass, with concrete
sottoclassi
che
subclasses that implement the
polymorphic authorize
operation
implementano
il metodo
astratto authorize

authorize() {abstract}
...

CreditPayment

DebitPayment

authorize()
...

authorize()
...

Messaggio
polimorfo
polymorphic message
:Register

:Payment {abstract}

doX
authorize

:DebitPayment

:Foo

authorize

Oggetto
suo ruolo di
object in rolenel
of abstract
superclass
classe
astratta

Non si prosegue ulteriormente nello


il seguito
dipende dalla classe concreta che
implementa authorize

stop
at this point
dont show any
scambio
di messaggi
perch
further details for this message

:CreditPayment

:Bar

authorize
doA

doX

doB

Il seguito
interazione
dipende
dalla
classe concreta sottoclasse
separatedella
diagrams
for each polymorphic
concrete
case
di Payment. Si rappresentano tutti i casi possibili (in questo caso 2)
20
DebitPayment
CreditPayment
Programmazione eOrientata
agli Oggetti - Andrea Bei

Diagrammi di comunicazione
1: makePayment(cashTendered)
2: foo

: Register

:Sale

2.1: bar

Link

link line

msg1

1: msg2
2: msg3
3: msg4

: Register

:Sale

3.1: msg5

Tutti i messagi scorrono sullo stesso Link

all messages flow on the same link

Ogni messaggio ha:


un numero
il nome
una freccia che indica
la direzione

Programmazione Orientata agli Oggetti - Andrea Bei

21

Notazione - Creazione
3 modi per mostrare la creazione di
una nuova
un diagramma
Three
waysistanza
to showin
creation
in a
di comunicazione
communication
diagram

messaggio di creazione con parametri (opzionali). Viene codificato


create
message, with
optional
initializing parameters. This will
con
linvocazione
di un
costruttore
normally be interpreted as a constructor call.

1: create(cashier)
: Register

:Sale

1: create(cashier)
: Register

: Register

:Sale {new}

create
1: make(cashier)

:Sale

Se viene usato un messaggio di creazione non ovvio per


if an unobvious creation message name is used, the
chiarezza possibile usare uno stereotipo
message may be stereotyped for clarity

Programmazione Orientata agli Oggetti - Andrea Bei

22

Notazione Numerazione legale


msg1

Il primo messaggio in genere


non viene numerato per evitare
numbered
un prefissonot
comune
a tutti gli
altri messaggi

1: msg2

:A

:B

1.1: msg3

Schema di numerazione legale.


legal numbering
Lannidamento progressivo dei
messaggi viene mostrato con
la notazione punto

Primo
first

:C

Secondo
second
Terzo
third

msg1

:A

1: msg2

:B
1.1: msg3
2.1: msg5

2: msg4

:C

Quinto

Quarto
fourth

fifth

2.2: msg6

Sesto
sixth
Programmazione Orientata agli Oggetti - Andrea Bei

:D

23

Notazione messaggi condizionali


Messaggio condizionale con Test
conditional message, with test

message1
1 [ color = red ] : calculate

: Foo

Messaggio inviato
unconditionaldopo
after 1
comunque
either msg2 or msg4
o 1b

:E

: Bar

1a e 1b sono messaggi
1a and 1b are mutually
mutuamente
esclusivi
exclusive conditional
paths

2: msg6
1a [test1] : msg2
msg1

:A

:B

1b [not test1] : msg4

:D

1b.1: msg5

Programmazione Orientata agli Oggetti - Andrea Bei

1a.1: msg3

:C

24

Notazione: iterazione su collezioni

runSimulation

: Simulator

1 * [ i = 1..n ]: num = nextInt

: Random

Literazione indicata con il carattere * e una clausola


di iterazione
iteration is[i=1..n]
indicated with a * and an optional

iteration clause following the sequence number

Programmazione Orientata agli Oggetti - Andrea Bei

25

Notazione: messaggi polimorfi


Messaggio polimorfo
polymorphic message

doX

:Register

Non si prosegue ulteriormente nello


scambio
messaggi
perch
stop
at thisdipoint
dont show
anyil seguito
dipende
dalla
classe
concreta
che
further details for this message
implementa authorize

authorize

authorize

:DebitPayment

:Payment {abstract}

Oggetto nel ruolo di


object in role of abstract
classe astratta
superclass

authorize
doA
doB

:Foo

:CreditPayment

doX

:Bar

Il seguito della interazione dipende dalla classe concreta sottoclasse


separate
diagrams for each
concrete
case caso 2)
di Payment.
Si rappresentano
tuttipolymorphic
i casi possibili
(in questo
DebitPayment e CreditPayment

Programmazione Orientata agli Oggetti - Andrea Bei

26

Modellazione statica: DCD (Design Class Diagram)


S uperclassF oo
or
S uperC lassF oo { abstract }

Sezioni: 3 com m on
com partm ents
Nome della
classe
Attributi 1 . cla ssifie r n am e
Operazioni
2 . attribu tes
3 . op eration s

Un interfaccia
mostrata
an interface
sho w n w ith a
con lo stereotipo
keyw ord
<<interface>>
interface
R unn ab le
ru n()

- classO rS taticA ttribute : Int


+ publicA ttribute : S tring
- p rivateA ttrib ute
assum edP rivateA ttrib ute
isInitia lized A ttribute : B ool = true
aC ollectio n : V e ggie B urge r [ * ]
attributeM ayLegallyB eN ull : S tring [0..1]
finalC onstantA ttribute : Int = 5 { readO nly }
/derivedA ttribute
+ classO rS taticM ethod ()
+ publicM ethod ()
assum edP ublicM etho d ()
- p rivateM etho d ()
# protectedM ethod ()
~ packageV isibleM ethod ()
constructo r S up ercla ssF oo ( Lon g )
m ethodW ithP arm s(parm 1 : S tring, parm 2 : F loat)
m ethodR eturnsS om ething () : V eggieB urger
m ethodT hrow sE xception () {exception IO E xception }
ab stractM etho d ()
abstractM ethod 2() { abstract } // alternate
finalM ethod () { leaf } // no override in subclass
synch ronizedM etho d () { gu arde d }

E possibile
officially
in U M L, specificare
the top form at isil
use
d
to
distingu
ish
th e packa ge
path della classe
nam e from the class na m e
completo dei package in

uno
the
second
altern ative
cuifficially,
questa
contenuta
is com m on

java .a w t::F ont


or
java .aw t.F ont
plain : Int = 0 { readO nly }
bold : Int = 1 { re adO nly }
nam e : S tring
style : Int = 0
...
getF ont(nam e : S tring) : F ont
getN am e () : S tring
...

Dipendenza

F ru it

dependency

...
...

Implementazione
di
interfa ce
im
ple
m
en
tation
interfaccia (linea
and
tratteggiata)
e eredita
su bcla ssin g
(subclassing) da una
superclasse (linea
continua)

S ubclassF oo

P urchaseO rder
1

...
ru n()
...

order
a sso ciatio n w ith
Associazione
m ultiplicities
con
molteplicit

e llip sis mche


ean spotrebbe
the re m ay beesserci
e lem e nts,qualcosa
but no t sho w
n
I puntini -mostrano
ma
- a b lank com partm ent officially m e ans unknow n bu t a s a
non vogliamo
mostrarlo.
significa
co nve ntion
w ill be u sedIltovuoto
m ea n no
m em b ersper ora
Programmazione
Orientata
agli Oggetti - Andrea Bei
sconosciuto

...
...

27

Relazioni tra classi nei DCD


Associazione
Dipendenza
Generalizzazione
Composizione
Aggregazione
Realizzazione (tra classi e interfacce)
Programmazione Orientata agli Oggetti - Andrea Bei

28

Associazione
Notazione UML

Semantica
Modella una relazione di connessione strutturale tra classi:Un
oggetto della classe A ha un riferimento ad uno o pi oggetti della
classe B
Lassociazione la pi generale delle relazioni e semanticamente
la pi debole. Specifica solamente il fatto che esiste una
connessione tra le classi ma non esprime il tipo di connessione.
Composizione e Aggregazione sono tipi particolari di
associazione. Sono semanticamente pi forti in quanto descrivono
meglio la realt specificando il tipo di associazione.
Quando il grado di conoscenza della realt che si sta modellando
lo consente consigliabile usare una relazione semanticamente
pi forte. Si ottiene un modello con pi alto potere espressivo
Programmazione Orientata agli Oggetti - Andrea Bei

29

Associazione: notazioni
Si inserisce un attributo
using
attribute
di tipo
Salethe
per
indicare
text
notation
to
che Register ha un
indicatead
Register
riferimento
una has
a reference
to one
istanza
di tipo Sale
Salesono
instance
Le classi
associate
ma visualmente separate
Si traccia una linea di
associazione tra Register e
OBSERVE: this style
Sale. Le classi sono
visually emphasizes
visualmente connesse da
the connection
una associazione. Questo
between these classes
rende immediatamente
leggibile lassociazione

La forma pi completa
prevede insieme
entrambe le forme
thorough
and
precedenti
unambiguous,
but some
attributo + link
people
dislike
the
Vantaggio:
chiarezza
possible
redundancy
Svantaggio:
ridondanza
di informazione

Sale

Register
currentSale : Sale

...

...

...

Register

Sale
1

...

currentSale

...

...
...

Si
usa the
la notazione
per indicare
using
associationassociazione
notation to indicate
che
Register
ha
una
istanza
di
Sale
Register has a reference to one Sale instance

Register

Sale
1

currentSale : Sale
...

currentSale

Programmazione Orientata agli Oggetti - Andrea Bei

...
...

30

Associazione: notazioni
Linea Guida
Mostrare
gli attributi
di tipi
applying
the guideline
di dato semplici (interi,
to show attributes as
testo, float, ..) come
attribute
text gli
versus
attributi
mentre
quelliasdi
tipoassociation
classe comelines
associazioni

Register

Sale
1

id: Int

currentSale

...

Register ha 3 attributi:
has THREE attributes:
1. Register
Id
2. 1. currentSale
id
3. 2. location
currentSale

3. location

time: DateTime
...

Store
1
location

address: Address
phone: PhoneNumber
...

Programmazione Orientata agli Oggetti - Andrea Bei

31

Dipendenza
Notazione UML
Classe cliente

Classe fornitore

Semantica
Modella una relazione di dipendenza

Un cambiamento di comportamento nellelemento fornitore (classe destinataria


B) provoca un cambiamento di comportamento dellelemento cliente (classe
sorgente A)
Un elemento cliente a conoscenza di un elemento fornitore

Si ha una dipendenza tra le classi A e B se la classe A usa la classe B. Cio se la


classe B un argomento di una delle operazioni della classe A oppure viene
creata dalla classe A.
Il concetto di dipendenza non esiste solo per la classi ma per tutti i modelli
UML. Per esprimere il tipo di dipendenza si usano gli stereotipi.
La dipendenza tra use case pu essere di tipo <<include>> o <<extend>>
Si ha una dipendenza tra la classe A e un oggetto che ne rappresenta un
instanza. In questo caso si ha una dipendenza di tipo <<instanceOf>>
Programmazione Orientata agli Oggetti - Andrea Bei

32

Associazione e Dipendenza: esempi


Associazione

Dipendenza

Programmazione Orientata agli Oggetti - Andrea Bei

33

Associazioni: nome, molteplicit e ruoli


Molteplicit
Il numero di oggetti che
partecipano alla associazione.
In questo caso: una Societ
ha almeno una Persona nel
ruolo di Impiegato.
Pu essere:
1..*: 1 o pi
*:
0 o pi
X..Y: un intervallo
X: un numero esatto

Nome
Esprime il significato
della associazione

Ruolo
Il ruolo che ha la classe nella
associazione.
In questo caso la Persona
assume il ruolo di Impiegato
nellassociazione Lavora Per

Programmazione Orientata agli Oggetti - Andrea Bei

34

Generalizzazione (Ereditariet)
Notazione UML
Superclasse

Sottoclasse

Semantica
E una relazione tassonomica tra un classificatore pi generale
(superclasse) e un classificatore pi specifico (sottoclasse)
Ogni istanza della sottoclasse anche una istanza della superclasse
La sottoclasse possiede indirettamente le caratteristiche strutturali
(attributi) e comportamentali (operazioni) della superclasse (in
relazione alle regole di visibilit)
Una generalizzazione in un DCD nei linguaggi OO si realizza con
lereditariet (B eredita da A)
B di tipo A (is-a, is-a-kind-of)
B ha i propri attributi e metodi + gli attributi e operazioni ereditati da A
(con visibilit public,protected)
Programmazione Orientata agli Oggetti - Andrea Bei

35

Generalizzazione (Ereditariet)
Esempio

Programmazione Orientata agli Oggetti - Andrea Bei

36

Classi astratte: definizione e notazione


Definizione
Create per generalizzazione, rappresentano descrizioni "incomplete" di
classi. Il livello di astrazione non consente una implementazione per tutte
le operazioni. Le operazioni non implementate sono chiamate astratte
Si demanda alle sottoclassi concrete la responsabilit di realizzare il
comportamento dichiarato dalla classe astratta (implementando le
operazioni astratte)
Non possibile istanziare una classe astratta. Non esistono oggetti di una
classe astratta, ma possono esistere oggetti di una delle sottoclassi non
astratte.
Usate per definire operazioni comuni a pi classi
Le classi astratte
Notazione UML
sono caratterizzate
La segnatura delle
dallo stereotipo
operazioni astratte
<<abstract>>
rappresentata in
italico

Le operazioni
astratte sono
implementate in
sottoclassi
concrete

Programmazione Orientata agli Oggetti - Andrea Bei

37

Classi astratte: esempio

La classe astratta Veicolo Terrestre definisce le caratteristiche


comuni di tutti i veicoli terrestri ma nella realt non esiste un
generico veicolo terrestre. In altre parole non pu essere creato
nessun oggetto della classe Veicolo Terrestre (la classe non
istanziabile). Lo stesso vale per le altre classi astratte Veicolo e
Veicolo Aereo
Le classi Automobile, Moto, Aereo ed Elicottero sono
invece classi istanziabili perche si riferiscono ad entit esistenti
nel
mondo reale di cui possibile definire una
38
agli Oggetti - Andrea Bei
implementazione Programmazione
per tutteOrientata
le operazioni.

Composizione
Notazione UML
Classe composta

Classe parte

Semantica
Modella una relazione di composizione di una o pi parti: un
oggetto della classe A composto da uno o pi oggetti della
classe B. B parte di A (relazione whole-part)
Un oggetto della classe B esiste solo fino a quando esiste un
oggetto della classe A di cui una parte
La responsabilit della creazione di un oggetto della classe B
interamente devoluta ad un oggetto della classe A
La classe componente (B) pu avere una sola relazione di
composizione nel ruolo di componente. La classe B non pu
essere la classe componente di unaltra classe oltre la A
Programmazione Orientata agli Oggetti - Andrea Bei

39

Aggregazione
Notazione UML

Classe parte

Classe aggregata

Semantica
Modella una relazione di aggregazione di una o pi parti: un
oggetto della classe A aggrega uno o pi oggetti della classe B
Laggregazione un vincolo pi debole della composizione
Oggetti della classe A mantengono riferimenti di oggetti della
classe B ma gli oggetti della classe B esistono
indipendentemente dagli oggetti della classe A.
La vita di un oggetto della classe B indipendente da quella di
un oggetto della classe A
Programmazione Orientata agli Oggetti - Andrea Bei

40

Aggregazione e Composizione: esempi


Composizione

Aggregazione

Class Diagram

Object Diagram

Programmazione Orientata agli Oggetti - Andrea Bei

41

Relazioni statiche tra oggetti: link


Link
Un link una relazione statica tra oggetti
Un link tra un oggetto della classe A ed un oggetto della classe
B indica che loggetto della classa A ha un riferimento ad un
oggetto della classe B
Esiste un link tra un oggetto della classe A ed un oggetto della
classe B se esiste una associazione, composizione
aggregazione o dipendenza tra classe A e classe B

Programmazione Orientata agli Oggetti - Andrea Bei

42

Note e Stereotipi
Note
E possibile fornire informazioni su un elemento di un diagramma
mediante una Nota. La Nota a tutti gli effetti un elemento del
linguaggio UML.

Stereotipi
E un nuovo elemento visuale derivato da uno esistente ma specifico
per la propria realt di interesse
Pu essere una icona o un nome tra parentesi angolate (<<nome>>)
Es: in Java ci sono delle classi di tipo Exception la cui specificit duso
ne giustifica la rappresentazione con un simbolo distinto da quello di
classe.

Programmazione Orientata agli Oggetti - Andrea Bei

43

Programmazione OO in Java

Java: Costrutti Object


Oriented

Andrea Bei
andrea.bei@dis.uniroma1.it

Caratteristiche OO di Java
Classi
Oggetti
Interfacce
Ereditariet
Incapsulamento, Information Hiding, Polimorfismo
Packages
Programmazione OO in Java - Andrea Bei

Programmare OO in Java
Programmare in Java significa:
1.
2.
3.

Definire classi e interfacce


Creare degli oggetti delle classi definite
Fare interagire tra loro gli oggetti per produrre
risultati

Osservazioni:
In Java tutto un oggetto tranne i tipi di dato
predefiniti (int, char, ecc.)
Le classi sono raggruppate in package
Molti package sono gi disponibili
Programmazione OO in Java - Andrea Bei

Classi

Una classe definisce

class <nome_classe>
{
<definizioni di attributi>
<definizioni di metodi>
}
sintassi minimale

un tipo di dato
un insieme di operazioni sul tipo di dato
limplementazione delle operazioni: i metodi

Esempio:
class Serbatoio{

Programmazione OO in Java - Andrea Bei

Attributi
Gli attributi di una classe definiscono la struttura
dello stato degli oggetti della classe
Sintassi: ogni attributo definito usando la stessa
sintassi usata per la definizione delle variabili locali
Esempio:
class Serbatoio
{
int livello;

Programmazione OO in Java - Andrea Bei

Metodi
<tipoRitornato> <nomeMetodo> ([<parametri>])
{
<body>
}
sintassi minimale

I metodi sono le implementazioni delle operazioni della


classe
implementano il comportamento degli oggetti della classe
<tipoRitornato>=void per i metodi che non ritornano alcun
valore

Esempio:

void consumo (int j)


{
livello = livello-j;
}
Programmazione OO in Java - Andrea Bei

Costruttori
I costruttori sono metodi particolari che hanno lo
stesso nome della classe
I costruttori di una stessa classe si distinguono per
numero, posizione o tipo dei parametri
Nei costruttori non deve essere indicato il tipo ritornato

Se non viene definito nessun costruttore viene


usato automaticamente quello di default
Quando viene creato un oggetto di una classe viene
invocato uno dei suoi costruttori
Nei costruttori viene inserito il codice di inizializzazione
delloggetto
Programmazione OO in Java - Andrea Bei

Esempio: la classe Serbatoio (UML)

Programmazione OO in Java - Andrea Bei

Esempio: la classe Serbatoio (Java)

Programmazione OO in Java - Andrea Bei

Oggetti
Gli oggetti sono creati attraverso loperatore new.
Sintassi
new <nome classe>(<parametri costruttore>);

Semantica
Viene allocato lo spazio per il nuovo oggetto
Viene creato un oggetto della classe <nome classe> tramite il
costruttore che ha come argomenti: <parametri costruttore>
Viene ritornato un riferimento alloggetto

Il costruttore di default invocato tramite


lespressione:
new <nome classe>();

Loperazione di creazione restituisce un riferimento


(handle o puntatore) alloggetto tramite il quale
viene usato loggetto
Programmazione OO in Java - Andrea Bei

Creazione di un oggetto: esempio


//dichiarazione della variabile s
//come riferimento ad un oggetto di
//tipo String

null

String s;

//creazione di un oggetto String


//e assegnazione del riferimento
//delloggetto alla variabile s

s = new String (Hallo)

Programmazione OO in Java - Andrea Bei

s
String(Hallo)

Creazione di un oggetto: esempio in BlueJ

(1)

In BlueJ tramite linterfaccia grafica


posso creare oggetti (1) ed
eseguire metodi sugli oggetti creati
(2). Sono funzioni molto utili per
testare le classi.

(2)
Programmazione OO in Java - Andrea Bei

Uso degli oggetti: notazione punto


Laccesso ad attributi e metodi di un oggetto si
effettua tramite la notazione punto applicata ad un
riferimento delloggetto.
Sintassi
1. <riferimento>.<nome metodo>(<parametri>)
2. <riferimento>.<nome attributo>
Semantica
1. Invoca il metodo <nome metodo>
2. Accede allattributo <nome attributo>

Esempio
...
int liv;
Serbatoio s = new Serbatoio();
liv = s.getLivello();
System.out.println(liv);
Programmazione OO in Java - Andrea Bei

Oggetti e riferimenti: esempio


Serbatoio S,S1;

s1

Serbatoio()
{livello=10}

S1=S;

s1

Serbatoio()
{livello=20}

Serbatoio()
{livello=15}

null
s

Serbatoio()
{livello=10}

S1.rifornimento(10);

s1
s

S.consumo(5);

s1

null

S = new Serbatoio();

null

s1

S=null;

null
Programmazione OO in Java - Andrea Bei

Serbatoio()
{livello=15}

s1

Oggetti e riferimenti: esempio


Creazione e uso di un oggetto della classe Serbatoio
Serbatoio S;
// dichiarazione
S = new Serbatoio();
/* creazione:l'attributo livello
* vale 10 */
S.consumo(5);
// ora livello vale 5
S.rifornimento(10);
// livello vale 15

Riferimenti ad un oggetto della classe Serbatoio


Serbatoio S,S1;
// dichiarazione, non creazione
S = new Serbatoio(); // S punta ad un oggetto Serbatoio
S1=S;
// S1 e S puntano allo stesso oggetto
S1=null;
S=null;
// loggetto non pi accessibile
Programmazione OO in Java - Andrea Bei

Esempio: uso della classe Serbatoio

Programmazione OO in Java - Andrea Bei

Distruzione di oggetti
Java non supporta "distruttori" espliciti: gli oggetti che non
hanno pi riferimenti vengono eliminati automaticamente
e la memoria che questi occupano viene liberata
String s;
s = new String ("abc");
s = "def";

// dichiarazione
// creazione: s punta a "abc
// "abc" non pi puntata da s

Questo viene fatto da un thread (garbage collector, o


GC) che viene eseguito contemporaneamente ai thread
utente e di sistema
Il programmatore non si deve preoccupare della
deallocazione della memoria

Programmazione OO in Java - Andrea Bei

Finalizzatori di oggetti
Per un oggetto potrebbero essere previste delle
operazioni da effettuare prima della definitiva
eliminazione (per esempio la chiusura di file aperti)
Prima di procedere alla eliminazione di un oggetto il GC
invoca il metodo delloggetto chiamato finalize,
definibile dall utente
void finalize ()
{ close (); }

// chiudi tutti i file aperti

Il metodo finalize esiste sempre: se non stato


ridefinito viene ereditato da Object la classe pi
generale nella gerarchia delle classi Java
Programmazione OO in Java - Andrea Bei

Parametri
Sintassi
<parametri>=<tipo> <nomePar>[,<tipo> <nomePar>]
Esempio:
int distanza(int x1,int y1,int x2,int y2)

Parametri attuali e formali


Formali: la lista dei parametri nella definizione del metodo
(allinterno del metodo si parla di parametri formali)
Attuali: la lista dei valori che vengono passati al metodo quando
lo invochiamo (allesterno del metodo si parla di parametri attuali)
class Prova {

int somma(int x,int y) {


int res=x+y;
return res;
}

int a=5;
Prova obj=new Prova();
int b=obj.somma(4,a);

parametri formali
Programmazione OO in Java - Andrea Bei

parametri attuali

Parametri
I parametri sono passati per valore: quando il
metodo viene invocato, al parametro formale
assegnata una copia del valore del corrispondente
parametro attuale.
Per i parametri il cui tipo sia uno dei tipi semplici
Una modifica del valore del parametro formale non
comporta una modifica del valore del parametro attuale.

Per i parametri il cui tipo sia un tipo riferimento


(classi, interfacce e array).
Una modifica delloggetto puntato dal parametro
formale comporta una modifica delloggetto puntato dal
parametro attuale. Questo perch il parametro formale e
il parametro attuale hanno come valore un riferimento
allo stesso oggetto.
Programmazione OO in Java - Andrea Bei

Parametri: esempio
tipi semplici

Robot r=new Robot();


int asc=5;
int ord=5;
r.muoviti(asc,ord);
System.out.println(asc);
//stampa 5. asc NON cambia
classi, interfacce, array
Robot r=new Robot();
Punto pnt=new Punto();
pnt.x=5;
pnt.y=5;
r. muoviti(pnt);
System.out.println(pnt.x);
// stampa 20

class Robot {

void muoviti(int x,int y} {

x=20;
}

class Robot {

void muoviti(Punto p} {

p.x=20;
}

Programmazione OO in Java - Andrea Bei

Visibilit dei nomi in una classe


I nomi degli attributi e dei metodi sono visibili da
tutti i metodi della classe
Le variabili locali ad un metodo o i parametri formali
possono mascherare gli attributi. Es:
class Serbatoio {
int livello;
// attributo livello

void rifornimento (int livello) {


livello = livello+10;
//sto modificando il valore del parametro formale livello
//lattributo livello rimane inalterato
}
void consumo (int x) {
int livello;
livello = livello-x;
//sto modificando il valore della variabile locale
//livello. Lattributo livello rimane inalterato
}

}
Programmazione OO in Java - Andrea Bei

Visibilit dei nomi in un blocco


Le variabili dichiarate in un blocco sono visibili solo allinterno del
blocco. Es:

{
int x=0;
System.out.println(x); //stampa 0
}
System.out.println(x); //errore: x non visibile da qui

Le variabili dichiarate allinterno di un blocco possono mascherare gli


attributi della classe. Es:
public class Esempio {
private int x;
public Esempio(){
x=5;
}
public void metodo(){
{
int x=0;
System.out.println(x); //stampa 0
}
System.out.println(x); //stampa 5
}}

Programmazione OO in Java - Andrea Bei

Il riferimento this
Il riferimento this implicitamente presente
in ogni oggetto e punta alloggetto stesso
Permette di usare lo stesso nome per
attributi e parametri. Es:
class Serbatoio {
int livello;

// attributo

Serbatoio (int livello){ // parametro


this.livello = livello; //disambiguazione
}
}
Programmazione OO in Java - Andrea Bei

Overloading
Allinterno di una classe ci possono essere pi metodi con lo
stesso nome, purch si possano distinguere per numero,
posizione o tipo dei parametri (il solo tipo di ritorno non
basta)
Es:
class Esempio {
...
public int somma(int a, int b){ ... };
//OK
public double somma(double a, double b){ ... }; //OK
public int somma(double a, double b) { ... };
//errore
...
}

Programmazione OO in Java - Andrea Bei

Metodi e attributi statici


Un attributo statico una variabile associata alla classe
(attributo di classe). Il valore dellattributo presente in copia
unica ed accessibile da tutti gli oggetti della classe
Un metodo statico (di classe) un metodo associato alla
classe
pu accedere ai soli attributi e metodi statici
i metodi non statici possono accedere anche a metodi e
attributi statici
Sintassi
Definizione:
static <definizione attributo o metodo>

Accesso/Invocazione: (non necessario creare un oggetto)


<nomeClasse>.<nomeAttributo>
<nomeClasse>.<nomeMetodo>(<par.attuali>)

Programmazione OO in Java - Andrea Bei

Metodi e attributi statici: esempio


Ogni volta che viene
invocato il costruttore
viene incrementata la
variabile statica di 1.
getNumeroDocumenti()
un metodo statico ed
invocato direttamente
sul nome della classe
(riga 10)

Programmazione OO in Java - Andrea Bei

Quando si usano metodi e attributi statici


Un metodo che non dipende dallo stato delloggetto (non
accede agli attributi non statici dell oggetto) un buon
candidato a diventare static
In genere nelle librerie di funzioni i metodi sono tutti statici (es: i
metodi della classe Math)

Gli attributi il cui valore deve essere condiviso da tutti gli


oggetti di una classe devono essere dichiarati static
In genere le costanti vengono dichiarate static

Programmazione OO in Java - Andrea Bei

Attributi costanti
Sintassi

final <definizioneAttributo> = <valore>

Esempio:
class Colori {
public static final int GIALLO = 0, ROSSO = 1,

Programmazione OO in Java - Andrea Bei

Programmazione OO in Java

Java: Ereditariet, classi


astratte e interfacce

Andrea Bei
andrea.bei@dis.uniroma1.it

Ereditariet: la parola chiave extends


Superclasse

class B extends A
{

Sottoclasse

//definizione attributi
//definizione metodi
}

B eredita gli attributi ed i metodi della classe


A (solo quelli consentiti dagli specificatori di
visibilit)
B pu definire propri attributi e metodi
B pu ridefinire i metodi di A (Overriding).
Java supporta solo lereditariet singola.
Programmazione OO in Java - Andrea Bei

Overriding dei metodi


Una sottoclasse pu aggiungere nuovi attributi e
metodi ma anche ridefinire (override) i metodi delle
sue superclassi

La classe Pianoforte eredita il metodo play e lo ridefinisce. Il


metodo invocato sulloggetto puntato da p quello ridefinito da
Pianoforte.
Programmazione OO in Java - Andrea Bei

Metodi final
Sintassi
final

<tipoRitornato><nomeMetodo> ([<parametri>])

{
<body>
}

Semantica
i metodi final non possono essere ridefiniti dalle sottoclassi. Per tali
metodi vietato loverriding

Esempio:
class Colori {
public static final int getColoreSfondo(...)}

Programmazione OO in Java - Andrea Bei

Classi final
Sintassi
final class NomeClasse [extends NomeSuperClasse]

{CorpoClasse}

Semantica
Le classi final non possono essere ereditate. Non possono avere
sottoclassi

Esempio:
final class Colori {
...}

Programmazione OO in Java - Andrea Bei

Il riferimento super
Il riferimento super viene usato per riferirsi alla
superclasse
Per riferirsi a variabili, metodi o costruttori della superclasse
(anche quelli sovrascritti dalla sottoclasse)
Spesso si invoca il costruttore della superclasse dal
costruttore della sottoclasse.

Sintassi:
Invocazione di un metodo della superclasse
super.<nomeMetodo>(<listaParamAttuali>);

Accesso ad un attributo della superclasse


super. <nomeAttributo>;

Programmazione OO in Java - Andrea Bei

Ereditariet e costruttori
I costruttori non vengono ereditati
Allinterno di un costruttore possibile richiamare il
costruttore della superclasse tramite listruzione
super(<listaParametriAttuali>)

posta come prima istruzione del costruttore


Se il programmatore non chiama esplicitamente un
costruttore della superclasse, il compilatore inserisce
automaticamente il codice che invoca il costruttore
di default della superclasse

Programmazione OO in Java - Andrea Bei

La classe Object
Tutte le classi discendono dalla classe Object
Se una classe non eredita esplicitamente da una
superclasse allora eredita implicitamente dalla classe
Object
La classe Object fornisce i seguenti metodi:
boolean equals(Object);: true se due riferimenti sono
alias
String toString();: restituisce una stringa di caratteri
contenente il nome della classe e un valore che
identifica loggetto univocamente

Programmazione OO in Java - Andrea Bei

Ereditariet: un esempio

Programmazione OO in Java - Andrea Bei

Classi Astratte
abstract class <nome_classe {
//definizione attributi
//definizione costruttori e metodi
//definizione metodi astratti
}

Una classe astratta definisce


un tipo di dato
un insieme di operazioni sul tipo di dato
alcune operazioni sono implementate: metodi
alcune operazioni non sono implementate: metodi astratti
(abstract)

Una classe astratta non pu essere istanziata ma


possibile derivarne sottoclassi
Una classe che ha un metodo abstract deve essere
definita abstract
Programmazione OO in Java - Andrea Bei

Classi Astratte

Programmazione OO in Java - Andrea Bei

Interfacce: definizione
interface Int {
//definizione operazioni
}

Una interfaccia definisce


un tipo di dato
un insieme di operazioni sul tipo di dato
Le interfacce possono ereditare da altre interfacce
(extends)
Esempio:
public interface Iconizable {
void iconize ();

// iconizza

public interface Resizable {


void resize (int width,int height); // ridimensiona
}
Programmazione OO in Java - Andrea Bei

Interfacce: implementazione
class A implements Int1,Int2,, IntN
{
//definizione attributi
//implementazione metodi di Int1,Int2, IntN
//implementazione altri metodi di A
}

Una classe che dichiara di implementare un insieme di


interfacce ha lobbligo di implementare tutti metodi
delle interfacce (altrimenti errore di compilazione)
Esempio:
class Window implements Iconizable,Resizable {
void iconize (){ <body> }
void resize (int width,int height) { <body> }
}
Programmazione OO in Java - Andrea Bei

Interfacce: uso
Le interfacce consentono la separazione tra operazioni (specifiche di
comportamento) e metodi (implementazione)

La classe B non usa direttamente la classe A (B non dipende da


A) ma usa Int: una interfaccia implementata da A. Posso
sostituire in MainProgram la classe A con un altra classe che
implementa Int senza dovere modificare la classe B
Programmazione OO in Java - Andrea Bei

Programmazione OO in Java

Java: Incapsulamento,
Information Hiding,
Polimorfismo

Andrea Bei
andrea.bei@dis.uniroma1.it

Incapsulamento e Information Hiding


Incapsulamento
Tenere insieme (incapsulare) dati e operazioni sui dati
I linguaggi OO supportano lincapsulamento con il
costrutto di classe (Dati= attributi, Operazioni sui
dati=metodi)

Information Hiding
Nascondere i dettagli implementativi agli utenti della
classe.
Evitare che gli utenti abbiano la necessit di conoscere
come una classe implementata al fine di poterla usare.

Spesso sono usati come sinonimi. In realt:


L incapsulamento facilita ma non garantisce linformation
hiding
In Java ci pu essere incapsulamento ma non information
hiding
Programmazione OO in Java - Andrea Bei

Information Hiding: modificatori di visibilit


<modificatore>[static][final]<tipoRitornato><nomeMetodo>
([<parametri>])
{ <body> }

Metodi: sintassi completa

<modificatore>[static][final]<tipo><identificatore>[=<valore>]
[,<identificatore>[=<valore>]]

Variabili: sintassi completa

<modificatore>

public
protected

Descrizione
accessibile ai metodi della classe in cui usato
accessibile ai metodi di altre classi
accessibile ai metodi della classe in cui usato
accessibile ai metodi delle sottoclassi della classe in cui usato
accessibile ai metodi di classi dello stesso package della classe in
cui usato
accessibile ai metodi della classe in cui usato
accessibile ai metodi di classi dello stesso package della classe in
cui usato

private

accessibile ai metodi della classe in cui usato


Programmazione OO in Java - Andrea Bei

Incapsulamento e Information Hiding:


regole
Incapsulamento
Inserire nella stessa classe i dati e le operazioni sui dati
Progettare in base alle responsabilit
Lasciarsi guidare dalle operazioni: chiedersi quali sono le azioni di cui
dovrebbe essere responsabile un oggetto della classe

Information Hiding
Non esporre i dati
Dichiarare privati tutti gli attributi e usare metodi getter e setter

Non esporre la differenza tra attributi e dati derivati


Se velocit un dato calcolato da altri attributi chiamare
comunque il metodo getVelocit() piuttosto che
calcolaVelocit()

Non esporre la struttura interna della classe


Evitare metodi come getDataArray()
Programmazione OO in Java - Andrea Bei

Incapsulamento e Information Hiding:


esempio
No incapsulamento: i dati (x e y) e
le operazioni sui dati (distanza(..))
non sono nella stessa classe

No information hiding: i dati (x


e y) non sono nascosti agli
utenti della classe

Programmazione OO in Java - Andrea Bei

Incapsulamento e Information Hiding:


esempio

Incapsulamento:
i dati (x e y) e le operazioni sui
dati (distanza(..)) ora sono nella
stessa classe Punto.

N.B.
La funzione distanza ora ha un solo
argomento. Laltro argomento
loggetto stesso su cui invocato il
metodo.

No Information Hiding
Uno dei limiti limpossibilit di
controllare che il valore
assegnato a x e y sia compreso in
un certo intervallo.
Es: supponiamo di voler gestire uno
spazio bidimensionale circolare in
cui x sia in [0,100] e y sia in
[0,100] e x=105 venga trasformato
in x=5

Programmazione OO in Java - Andrea Bei

Incapsulamento e Information Hiding:


esempio
Information Hiding

Incapsulamento e Information Hiding soddisfatti


Operazioni e dati sono in ununica classe e i dati sono nascosti (private) e
accessibili solo tramite i metodi getter e setter. In questo modo isolo le
classi utente (MainClass) anche dai futuri cambiamenti nei dati della
classe Punto. Per esempio cambiare la dimensione dello spazio da 100 a 50
non influenza MainClass
Programmazione OO in Java - Andrea Bei

Tipi, sottotipi e supertipi


Classi e interfacce definiscono dei tipi di dato
I supertipi di una classe sono:
Tutte le interfacce implementate direttamente e
indirettamente dalla classe
Tutte le superclassi della classe
Es: (fig.1) C,B,Int2,Int3,Int4 sono supertipi di A

I supertipi di una interfaccia sono:


Tutte le interfacce da cui eredita linterfaccia
Es: (fig.1) Int4 un supertipo di Int3

Fig.1

I sottotipi di una classe sono:


Tutte le sottoclassi
Es: (fig.1) B e A sono sottotipi di C

I sottotipi di una interfaccia sono:


Tutte le interfacce che ereditano dallinterfaccia
Tutte le classi che implementano direttamente o
indirettamente linterfaccia stessa o una delle interfacce
che eredita dallinterfaccia
Es: (fig.2) B,D,Int3,E,C e Programmazione
A sono sottotipi
di Int4
OO in Java - Andrea Bei

Fig.2

Polimorfismo per inclusione:


variabili polimorfe
Possibilit di usare variabili polimorfe, cio che possono
riferirsi ad oggetti di tipi diversi ("inclusi" in una certa
gerarchia). In pratica ad una variabile di tipo T possibile
assegnare il riferimento ad un qualsiasi sottotipo di T.
Esempio:

Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


variabili polimorfe (esempio)

Ad un riferimento di un classe (tipo) pu


essere assegnato un riferimento ad una
sottoclasse (sottotipo )
Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


mascheramento dei metodi

Sulla variabile di tipo T possibile invocare solo metodi e


attributi definiti in T anche se la variabile si riferisce ad un
sottotipo con pi metodi e attributi.
A rif=new A();

B rif =new A();

Variabile
rif
Oggetto A
Classe A
Classe B
Classe C
Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


mascheramento dei metodi

ERRORE

Da un riferimento di un tipo non pu essere invocato un metodo di un


sottotipo
Non posso invocare retromarcia su un riferimento di tipo
VeicoloAMotore
Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione: casting


Se la variabile che contiene il riferimento alloggetto di un supertipo del
tipo delloggetto possibile con loperazione di Casting ottenere un
riferimento al tipo delloggetto.
Sintassi:
<rifSottotipo>=(<rifSottotipo>) <rifSupertipo>
Esempio:

fordKa di tipo VeicoloAMotore


ma assegnata ad un oggetto di
tipo Automobile. Per ottenere un
riferimento di tipo Automobile si
effettua il casting (riga 16). Sul
riferimento ottenuto dal casting
posso invocare il metodo
retromarcia.
Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


metodi polimorfi e binding dinamico 1/2

Possibilit di usare metodi polimorfi: cio di indicare con lo stesso nome


dei metodi che appartengono a classi diverse (incluse nella stessa
gerarchia) e che hanno quindi generalmente diverse implementazioni
("polimorfo" = "avente pi forme").
Scenario:
Una variabile var di tipo T assegnata ad un oggetto di un sottotipo di T
S(T)
T e S(T) definiscono entrambi il metodo metodo1().
Listruzione var.metodo1() esegue il metodo definito in S(T).
la decisione su quale debba
essere il metodo da
richiamare viene presa a
tempo di esecuzione a
seconda della classe
effettiva (pi stretta) di
appartenenza dell'oggetto
rispetto a cui viene fatta la
chiamata. Questa tecnica
chiamata binding dinamico

Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


metodi polimorfi e binding dinamico 2/2
Attenzione !
Il Binding Dinamico vale solo per i metodi e NON per gli attributi

Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:


parametri polimorfi

Il metodo ripara ha un
parametro polimorfo di tipo
VeicoloAMotore.
Il parametro assume i
sottotipi Scooter e
Automobile.
Programmazione OO in Java - Andrea Bei

Polimorfismo per inclusione:instanceof


E possibile identificare a run-time il tipo effettivo delloggetto a cui si riferisce
una variabile (RTTI:Run-Time Type Identification)
Sintassi:
true/false=<variabile> instanceof <nomeClasse>
Esempio:

Se il parametro m di tipo
VeicoloAMotore punta ad un oggetto
di tipo Automobile (test a riga 9)
posso effettuare il casting per
ottenere un riferimento di tipo
Automobile (riga 10) e poter
invocare il metodo retromarcia (riga
11)
Programmazione OO in Java - Andrea Bei

Come usare il polimorfismo


Per creare strutture dati polimorfe
Sono strutture dati che gestiscono oggetti generici (oggetti della classe
Object).
Grazie al polimorfismo possono gestire ogni sottotipo di Object e quindi
qualsiasi tipo di oggetto
Alta riusabilit

Con classi astratte e interfacce per conferire estendibilit


manutenibilit e riusabilit al codice
Definendo tipi astratti (classi astratte e interfacce)
per i concetti che hanno probabilit di essere estesi in futuro
per le classi che sono maggiormente usate da altre classi (parametri di
metodi di altre classi)

Usando ogni volta che possibile parametri astratti (interfacce o classi


astratte) per i metodi. Questo significa:
massimizzare il numero dei tipi su cui possibile invocare il metodo (es:
strutture dati polimorfe)
renderlo resistente a future estensioni che aggiungano dei sottotipi al tipo
dei parametri.
Programmazione OO in Java - Andrea Bei

Strutture dati polimorfe: matrice di oggetti

La classe Matrix una matrice


polimorfa. La struttura dati un
array bidimensionale di elementi di
tipo Object ed i metod get e set
trattano parametri di tipo Object. Per
il polimorfismo possibile popolare
Matrix con qualsiasi oggetto che sia
sottotipo di Object e quindi con
oggetti di qualsiasi classe.
Le classi Integer e Float sono dette
Wrapper perch avvolgono i tipi
atomici int e float rendendoli oggetti.
Programmazione OO in Java - Andrea Bei

Polimorfismo, interfacce e classi astratte:


alternative per il progetto di un media-player
1 alternativa:
Il media-player ha un metodo per ogni formato con limplementazione
del relativo CODEC
Per ogni formato esiste una classe con lo stream dei dati e con le
caratteristiche specifiche per il formato
1.

2.

Caratteristiche
Bassa estendibilit: Se aggiungo un altro
formato (es:MIDI) devo modificare la classe
MediaPlayer per inserire il metodo play del
nuovo formato (es:playMIDI).
Bassa riusabilit (interna e esterna)
1. Non uso ereditariet: Alcuni attributi e metodi
sono identici nei formati audio (es:
titolo,durata,stream). Se in futuro dovr
aggiungere un formato dovr riscrivere da
zero anche i metodi e gli attributi comuni
2. Non uso lincapsulamento: Ho i dati
(stream) e le operazioni sui dati (play) in
classi diverse. Non posso riusare MP3 in un
altra applicazione mi mancherebbero le
operazioni

Programmazione OO in Java - Andrea Bei

Polimorfismo, interfacce e classi astratte:


alternative per il progetto di un media-player
2 alternativa:
Ogni classe formato ha un proprio metodo play con limplementazione
del CODEC per il proprio formato
Si introduce una classe astratta AudioMedia che fattorizza le popriet e i
metodi comuni alle classi formato (ereditariet)
La classe mediaplayer ha un solo metodo play che ha come parametro
AudioMedia (polimorfismo)

1.

2.

Caratteristiche
Media estendibilit: Se aggiungo un altro
formato audio (es:MIDI) non devo modificare la
classe MediaPlayer. Mi basta aggiungere una
classe MIDI che eredita dalla classe AudioMedia e
implementa il metodo play e tutto funziona
correttamente. Ma se voglio aggiungere un
formato Video ? Il problema che uso la classe
astratta per due funzioni contemporaneamente:
riuso (ereditariet) e estendibilit (polimorfismo)
Alta riusabilit (interna e esterna)
1. Esterna: Ogni classe formato riusabile
perche completa (dati e operazioni)
2. Interna: Riuso attributi e operazioni comuni
(ereditariet)

Programmazione OO in Java - Andrea Bei

Polimorfismo, interfacce e classi astratte:


alternative per il progetto di un media-player
3 alternativa:
Rispetto alla seconda alternativa si introduce linterfaccia Media con la quale
si ottiene lestendibilit a livello pi astratto possibile
La classe astratta AudioMedia implementa linterfaccia Media
La classe MediaPlayer ha un solo metodo play che ha come parametro
linterfaccia Media (polimorfismo)
Caratteristiche
Alta estendibilit: Ora posso aggiungere anche un
formato Video (es: AVI) semplicemente
aggiungendo la classe AVI e implementando
linterfaccia Media. Uso la classe astratta per il
riuso interno (con lereditariet) e linterfaccia
per l estendibilit (con il polimorfismo)
Best Practices
Cercare di utilizzare principalmente le
interfacce come strumento per
lestendibilit (tramite il polimorfismo)
eventualmente associate alle classi
astratte come strumento di riusabilit
interna (tramite lereditariet)
Programmazione OO in Java - Andrea Bei

Polimorfismo, interfacce e classi astratte:


alternative per il progetto di un media-player

Programmazione OO in Java - Andrea Bei

Polimorfismo, interfacce e classi astratte:


alternative per il progetto di un media-player

Programmazione OO in Java - Andrea Bei

Programmazione OO in Java

Java: Package

Andrea Bei
andrea.bei@dis.uniroma1.it

Package: definizione
Contenitori di classi e interfacce organizzati in modo gerarchico
Ad ogni package corrisponde una directory nel file system
Sintassi del percorso completo di una classe o interfaccia:
<package 1>.<package 2><package N>.<Classe/Interf.>

UML

Nel file system

Percorso completo della classe OracleAlertsDAO:


it.cnr.helpdesk.AlertsManagement.dao.OracleAlertsDAO
Programmazione OO in Java - Andrea Bei

Package: uso
Per usare una classe di un package (2 alternative):
specificare ogni volta il percorso completo
Altamente sconsigliata (dispendiosa, bassa manutenibilit)
importare la classe e usare il nome della classe
sintassi (per una classe):
import <package 1>.<package 2> <nomeClasse>;

sintassi (per tutte le classi di un package ) :


import <package 1>.<package 2> <package N>.*;

Le istruzioni import vanno prima della dichiarazione della


classe

I package predefiniti nel JSDK sono del tipo:


java.*, javax.*, org.* (es: java.math.*)
java.lang.* contiene le classi fondamentali ed importato
implicitamente
Programmazione OO in Java - Andrea Bei

Package: uso (esempio)


La classe Random responsabile
della generazione di numeri casuali
ed presente nel package
java.util.*;

Programmazione OO in Java - Andrea Bei

Package: dichiarazione
Il package a cui una classe appartiene specificato nella
prima istruzione del file sorgente in cui definita la classe
Sintassi:

package pkg1[.pkg2][.pkgN];
Listruzione package va inserita prima delle istruzioni import
Esempio:

Programmazione OO in Java - Andrea Bei

Package: dichiarazione (esempio in BlueJ)

BlueJ aggiunge
automaticamente
listruzione
package in base al
package da cui si
crea la classe

Programmazione OO in Java - Andrea Bei

Package: visibilit
Da un programma sono visibili solo i package
la cui directory base specificata nel classpath
SET CLASSPATH=;c:\MyPackages;
la cui directory base aggiunta come libreria (IDE)

In BlueJ possibile aggiungere le directory base dei


packages come librerie :

Programmazione OO in Java - Andrea Bei

Classi: sintassi completa


[Commento][Modificatore] class NomeClasse
[extends NomeSuperClasse]
[implements NomeInterfaccia [, NomeInterfaccia ]]
{CorpoClasse}

Modificatore
abstract: tra i vari metodi, deve contenerne almeno uno
astratto, ma non pu contenere metodi privati o statici; deve
dare origine a sottoclassi; non pu essere istanziata
final: termina una catena di classi-sottoclassi, non pu dare
origine a ulteriori sottoclassi
public: pu essere usata da altre classi nel package che ne
contiene la dichiarazione senza formalit; disponibile anche in
altri package, purch vi venga importata
synchronizable: tutti i metodi interni sono "sincronizzati
Programmazione OO in Java - Andrea Bei

Interfacce: sintassi completa


[Commento][Modificatore] interface NomeInterfaccia
[extends NomeSuperInterfaccia[,
NomeSuperInterfaccia]]
{CorpoInterfaccia}

Modificatore
public: visibile dalle classi di tutti i package
nessun qualificatore: visibile solo nel package in cui
definita

InterfaceBody
dichiarazione dei metodi (sono implicitamente abstract )
dichiarazione delle costanti (sono implicitamente final,
static e public)
Programmazione OO in Java - Andrea Bei

Programmazione OO in Java

Stringhe

Andrea Bei
andrea.bei@dis.uniroma1.it

Utilizzo delle stringhe in Java


In Java si possono utilizzare e gestire le
stringhe tramite le due classi:
String
Un oggetto di tipo String una stringa costante

StringBuffer
Un oggetto di tipo StringBuffer una stringa variabile
nel contenuto e nella dimensione.
Meno economico di String.
Programmazione OO in Java - Andrea Bei

La classe String: costruttori


La creazione di una oggetto String pu
essere:
Esplicita:
Attraverso il costruttore polimorfo String()
Es.
String S= new String(parola);
String S= new String();

Implicita:
Quando il compilatore incontra una serie di
caratteri delimitati da virgolette crea un oggetto
di tipo String a cui assegna la stringa
individuata.
Es.
String S = parola;
//equivale a
String S = new String(parola);
Programmazione OO in Java - Andrea Bei

La classe String: i metodi principali


In riferimento a: String s = parola
length(): ritorna la lunghezza della stringa
Es: int len = s.length();

// len == 6

charAt(int i): ritorna il carattere in posizione i-esima


Es: char c=s.charAt(0)

// c ==p

indexOf(char c): ritorna lindice della prima occorrenza


del carattere indicato
Es: int i=s.indexOf(o)

// i == 3

lastIndexOf(char c): come sopra ma per lultima


occorrenza di char
substring(int da, int a): ritorna una sottostringa
String sub = s.substring(2,4)

// sub==ro

Programmazione OO in Java - Andrea Bei

Es:

La classe String: concatenazione


E possibile concatenare stringhe tramite
loperatore +
Esempio:
String s =Prova +di+ concatenazione;
System.out.println(s);
Output:
Prova di concatenazione

Programmazione OO in Java - Andrea Bei

La classe StringBuffer: costruttori


I costruttori della classe StringBuffer sono:
StringBuffer()
Restituisce uno StringBuffer di capacit 16
StringBuffer(int c)
Restituisce uno StringBuffer di capacit c
StringBuffer(String s)
Restituisce uno StringBuffer contenente s e di
capacit s.legth() + 16
Es:
StringBuffer s = new StringBuffer(parola);
Programmazione OO in Java - Andrea Bei

La classe StringBuffer: i metodi


Oltre ai metodi definiti nella classe String e
alloperatore di concatenazione (+) definisce i
seguenti metodi per la manipolazione di stringhe:
append(char c): aggiunge in coda il carattere c
Es: s.append(a);
insert(int offset, char c): inserisce in posizione
offset+1 il carattere c
setCharAt(int pos, char c): sovrascrive il carattere in
posizione pos con c
capacity(): restituisce la quantit di spazio allocato
setLength(int length): imposta la dimensione della
stringa a length

Programmazione OO in Java - Andrea Bei

Esempio: inversione di una stringa

Programmazione OO in Java - Andrea Bei

Corso Java

Wrapper

Andrea Bei
andrea.bei@dis.uniroma1.it

Le classi wrapper
Le classi wrapper
sono classi involucro per i tipi atomici
servono per poter trattare come oggetti i tipi atomici.
Sono necessarie per poter usare strutture dati per Object
con interi,booleani,float

Esempio
...
Matrix m=new Matrix(3,3);
int num=10;
Integer numObj=new Integer(num);
...
m.set(2,2, numObj);
...
int i=((Integer) m.get(2,2)).intValue();
Programmazione OO in Java - Andrea Bei

num
numObj

La gerarchia dei wrapper


boolean

char

double

byte
short

float
long

int
Programmazione OO in Java - Andrea Bei

La classe Integer: costruttori


public Integer(int num)
Esempio:
Integer num = new Integer(10);
public Integer(String s)
Esempio:
Integer num = new Integer(10);

Programmazione OO in Java - Andrea Bei

La classe Integer: metodi principali


public int intValue()
descrizione: ritorna il valore rappresentato dalloggetto in formato
int
esempio:
int num = (new Integer(10)).intValue(); //num=10

public String toString()


descrizione: ritorna il valore rappresentato dalloggetto in formato
String
esempio:
String s = (new Integer(10)).toString(); //s=10

public static Integer valueOf(String s)


descrizione: ritorna un Integer rappresentato dallintero in s
esempio:
Integer num = Integer.valueOf(10); //num.intValue=10

public static int parseInt(String s)


descrizione: ritorna un int del valore dellintero in s
esempio:
int num = Integer.parseInt(10); //num=10
Programmazione OO in Java - Andrea Bei

Programmazione Orientata agli Oggetti

Modello di
implementazione
Andrea Bei
andrea.bei@dis.uniroma1.it

Modello di implementazione
Un Modello di Implementazione costituito
dallinsieme dei sorgenti che implementano un
Modello di Progetto
Linee guida per passare dal modello di progetto
al modello di implementazione
Progettare la visibilit
Creare classi e interfacce dai DCD
Creare metodi dai diagrammi di interazione
Usare collezioni per implementare relazioni uno a
molti tra classi
Seguire un ordine di implementazione guidato
sullaccoppiamento
Programmazione Orientata agli Oggetti - Andrea Bei

Progettare la visibilit
Un oggetto A pu inviare un messaggio
ad un oggetto B solo se questo visibile
ad A
4 tipi di visibilit da A verso B
Per attributo
B un attributo di A

Per parametro
B un parametro di un metodo di A

Locale
B un oggetto locale di un metodo di A

Globale
B visibile globalmente
Programmazione Orientata agli Oggetti - Andrea Bei

Visibilit per attributo


class Register
{
...
private ProductCatalog catalog;
...
}

enterItem
(itemID, quantity)

: Register

: ProductCatalog

desc = getProductDesc( itemID )

public void enterItem( itemID, qty )


{
...
desc = catalog.getProductDesc(itemID)
...
}

Programmazione Orientata agli Oggetti - Andrea Bei

Visibilit per parametro

enterItem(id, qty)
:Register

2: makeLineItem(desc, qty)

:Sale

1: desc = getProductDesc(id)
2.1: create(desc, qty)
:Product
Catalog
makeLineItem(ProductDescription desc, int qty)
{
...
sl = new SalesLineItem(desc, qty);
...
}

Programmazione Orientata agli Oggetti - Andrea Bei

sl : SalesLineItem

Visibilit per parametro -> attributo


enterItem(id, qty)
:Register

2: makeLineItem(desc, qty)

:Sale

2: desc = getProductDesc(id)
2.1: create(desc, qty)
:Product
Catalog
sl : SalesLineItem
// initializing method (e.g., a Java constructor)
SalesLineItem(ProductDescription desc, int qty)
{
...
description = desc; // parameter to attribute visibility
...
}

E comune trasformare la visibilit per parametro in visibilit per attributo


soprattutto nel caso di parametri passati ai costruttori

Programmazione Orientata agli Oggetti - Andrea Bei

Visibilit locale
enterItem(id, qty)
{
...
// local visibility via assignment of returning object
ProductDescription desc = catalog.getProductDes(id);
...
}
enterItem
(itemID, quantity)

: Register

: ProductCatalog

desc = getProductDesc( itemID )

Programmazione Orientata agli Oggetti - Andrea Bei

Creare classi e interfacce dai DCD


I DCD descrivono
nomi delle classi e delle
interfacce
le firme delle operazioni
gli attributi delle classi
A partire dai DCD possibile
descrivere la definizione di
base di classi e metodi
alcuni strumenti UML
producono
automaticamente la
definizione di base

public class SalesLineItem


{
private int quantity;
private ProductDescription description;
public SalesLineItem(ProductDescription desc, int qty) { ... }
public Money getSubtotal() { ... }
}

ProductDescription
SalesLineItem
quantity : Integer
getSubtotal() : Money

description description : Text


price : Money
1 itemID : ItemID
...

Programmazione Orientata agli Oggetti - Andrea Bei

Creare metodi dai diagrammi di interazione


Ogni messaggio allinterno di un metodo
trasformato in una istruzione
enterItem(id, qty)
:Register

2: makeLineItem(desc, qty)

1: desc = getProductDesc(id)

:Sale

2.1: create(desc, qty)


:Product
Catalog
sl: SalesLineItem

1.1: desc = get(id)


2.2: add(sl)
: Map<ProductDescription>

lineItems :
List<SalesLineItem>

class Register {
...
private ProductCatalog catalog;
public void enterItem(ItemID id,int qty) {
ProductDescription desc=catalog.getProdutDesc(id);
currentSale.makeLineItem(desc,qty);
}
...
Programmazione Orientata agli Oggetti - Andrea Bei

Collezioni per relazioni uno a molti


Implementare le relazioni uno a molti tra
classi con le collezioni
in Java: List, Set, Map
Sale

public class Sale


{
...

isComplete : Boolean
time : DateTime

private List lineItems = new ArrayList();


}

becomeComplete()
makeLineItem()
makePayment()
getTtotal()

SalesLineItem
lineItems
1..*

quantity : Integer
getSubtotal()

Le A
classi
collezione sono
collection class is necessary to
necessarie
per mantenere
maintain attribute
visibility to all la
the
visibilit
per
attributo
di
tutte
le
SalesLineItems.
SalesLineItem

Programmazione Orientata agli Oggetti - Andrea Bei

10

Seguire un ordine di implementazione


Implementare le classi dalla meno accoppiata
alla pi accoppiata
Acc=3
Store

address : Address
name : Text

ProductCatalog

addSale(...)
1

Acc=0

Acc=1

ProductDescription

...

1..*

getProductDesc(...)

description : Text
price : Money
itemID : ItemID
...

1
Register

Acc=2

Acc=2
Sale

isComplete : Boolean
time : DateTime

...
endSale()
enterItem(...)
makeNewSale()
makePayment(...)

SalesLineItem

becomeComplete()
makeLineItem(...)
makePayment(...)
getTotal()
...

1..*

quantity : Integer
getSubtotal()

Payment
1

1 Acc=0

amount : Money
...

Programmazione Orientata agli Oggetti - Andrea Bei

Acc=1

11

Caso di studio POS:modello di implementazione


1: Payment

2: ProductSpecification ( ProductDescription)

Programmazione Orientata agli Oggetti - Andrea Bei

12

Caso di studio POS:modello di implementazione


3: ProductCatalog

4: SalesLineItem

Programmazione Orientata agli Oggetti - Andrea Bei

13

Caso di studio POS:modello di implementazione


5: Sale

Programmazione Orientata agli Oggetti - Andrea Bei

14

Caso di studio POS:modello di implementazione


6: Register

6: Store

Programmazione Orientata agli Oggetti - Andrea Bei

15

Programmazione OO in Java

Gestione delle eccezioni

Andrea Bei
andrea.bei@dis.uniroma1.it

Eccezioni
Uneccezione un evento imprevisto anomalo e
indesiderato che non consente la normale
prosecuzione del programma.
Es: apertura di un file inesistente, divisione per 0, indice di
unarray al di fuori dellintervallo consentito

Affinch un programma sia robusto necessario


prevedere le possibili eccezioni e come queste
dovranno essere gestite
La mancata gestione delle eccezioni pu
comportare:
terminazione improvvisa del programma
comportamenti e risultati scorretti e imprevedibili
Programmazione OO in Java - Andrea Bei

Gestione tradizionale delle eccezioni


Nei linguaggi tradizionali non esistono costrutti adhoc per la gestione delle eccezioni. Queste sono
gestite:
Terminando lesecuzione del programma
spesso non necessaria una scelta cos drastica

Usando valori di ritorno particolari (es: -1) per segnalare il tipo di


eccezione alla funzione/metodo chiamante
confusione tra dati ed eccezioni se il tipo lo stesso
informazioni limitate sulle eccezioni

Usando una apposita funzione/metodo che gestisce le eccezioni


diminuisce la manutenibilit del programma. Il codice in cui viene gestito
leccezione lontano dal codice che lo pu generare
diminuisce la leggibilit

I linguaggi di ultima generazione superano questi


limiti con appositi costrutti per la gestione delle
eccezioni
Programmazione OO in Java - Andrea Bei

Eccezioni in Java

Una eccezione in Java rappresentata da un oggetto della


gerarchia di classi che ha come base la classe Throwable
Le sottoclassi di Throwable rappresentano specifiche
eccezioni che si dividono in
Errori
Eccezioni Checked
Eccezioni Unchecked
Programmazione OO in Java - Andrea Bei

Eccezioni in Java
Errori
le sottoclassi di Error rappresentano errori gravi non gestibili dalla
programma e di solito non provocati dal programma ma dalla JVM
es: VirtualMachineError

Eccezioni checked
Tutte le sottoclassi della classe Exception
es: IOException, FileNotFoundException
La gestione delle eccezioni checked obbligatoria

Eccezioni unchecked
Tutte le sottoclassi della classe RuntimeException
es: NullPointerException (obj=null; obj.m1(); )
es: IndexOutOfBoundsException (int a[]=new a[3]; a[5]=0;)
La gestione delle eccezioni unchecked opzionale

Le eccezioni unchecked possono essere generate ovunque (chiamate di


metodi, array,...). Renderne obbligatoria la gestione significa diminuire
notevolmente la leggibilit del codice
Programmazione OO in Java - Andrea Bei

La classe Throwable
Definizione:
Un oggetto di tipo Throwable una eccezione (checked o
unchecked) o un errore;

Costruttori:
Throwable()
Throwable(String message)

Metodi principali:
getMessage()
restituisce il messaggio associato alleccezione
printStackTrace(Stream s)
restituisce una fotografia dello stack di esecuzione
sulloggetto stream (PrintWriter o PrintStream)
printStackTrace()
restituisce una fotografia dello stack di esecuzione su
stderr
Programmazione OO in Java - Andrea Bei

Gestione delle eccezioni


Una eccezione pu essere:
catturata e gestita allinterno di un metodo
tramite il costrutto try/catch

propagata verso il metodo chiamante che pu


catturare e gestire leccezione o continuare la
propagazione
tramite la dichiarazione di propagazione nella definizione
del metodo
throws <classe Throwable>

generata da un metodo
tramite il costrutto
throw <oggetto Throwable>
Programmazione OO in Java - Andrea Bei

Cattura e gestione delle eccezioni:


try/catch
Cattura e gestione: sintassi del costrutto

try/catch
il costrutto try / catch costituito da un blocco try e da uno o pi
blocchi catch
Il blocco try contiene il codice che pu generare una o pi tipi di
eccezione
Il blocco catch i-esimo cattura e gestisce le eccezioni della classe
<classe eccezione i>) o sottoclassi di questa (Exception Handler)
Allinterno del blocco catch ci si pu riferire alla eccezione mediante
il riferimento ei
try{
// codice che pu generare leccezione
}catch (<classe eccezione 1> e1) {
// codice che gestisce leccezione e1
}
}catch (<classe eccezione 2> e2) {
// codice che gestisce leccezione e2
}
Programmazione OO in Java - Andrea Bei

Cattura e gestione delle eccezioni


Cattura e gestione: semantica del costrutto

try/catch

interruzione dellesecuzione del blocco try che ha generato


leccezione (1) e verifica del blocco catch che pu catturare
leccezione (nellordine in cui sono scritti)
cattura delleccezione da parte del primo blocco catch che ha
leccezione generata come classe dichiarata o come una delle
sottoclassi di questa (2)
gestione delleccezione con lesecuzione del blocco catch (3)
try{

1
...

// codice che pu generare leccezione

}catch (<classe eccezione> ei) {

// parte di codice che gestisce leccezione ei


}
...
Programmazione OO in Java - Andrea Bei

Cattura e gestione di eccezioni: esempio


Se k>=10
listruzione 3 genera
leccezione che viene
gestita da questo
blocco catch

1. int[] v=new int[10];


2.
3.
4.
5.

try{
s=s+v[k]/m;
...

}catch (ArrayIndexOutOfBoundsException e) {

6.

System.out.println(Errore! indice al di fuori

7.

dellintervallo consentito:+e.getMessage() );

8.
9.
10.

}catch (ArithmeticException e2) {


System.out.println(Errore! divisione
per 0:+e2.getMessage() );

11. }catch (Exception e3) {


12.

Se m=0
listruzione 3 genera
leccezione che
viene gestita da
questo blocco catch

System.out.println(Eccezione generica !) }

Tutte le altre
eccezioni sono
gestite da questo
blocco catch

Se ci sono blocchi catch per eccezioni che sono luna una


sottoclasse dellaltra (es: ArithmeticException ed Exception)
necessario che il blocco catch relativo alla superclasse sia
successivo al blocco catch relativo alla sottoclasse
In caso contrario il primo blocco catch maschera il secondo
che non verr mai raggiunto
Programmazione OO in Java - Andrea Bei

Propagagazione delle eccezioni


Propagazione: sintassi del costrutto

throws

Un metodo deve dichiarare tutte le eccezioni (checked) che propaga


(cio che sono generate dal metodo ma e non gestite localmente)
La lista delle eccezioni propagate deve essere inserita nella dichiarazione
del metodo dopo la parola chiave throws
Lelemento della lista <classe eccez. i> propaga la classe dichiarata e
tutte le sottoclassi
La lista delle eccezioni che un metodo propaga deve essere
documentata (javadoc) per consentire una gestione corretta delle
eccezioni da parte degli utenti del metodo
Chi user il metodo sar obbligato ad invocarlo in un blocco try/catch
oppure a dichiarare a sua volta la propagazione delle stesse eccezioni
public void m() throws <classe eccez. 1>, <classe eccez. 2>,... {
// metodo che pu generare leccezione
}

Programmazione OO in Java - Andrea Bei

Propagagazione delle eccezioni


Propagazione: semantica del costrutto throws
interruzione dellesecuzione del metodo che ha generato leccezione
(1)
propagazione verso il metodo chiamante (2) che a sua volta pu
catturare e gestire leccezione (interrompendo la propagazione) o
propagarla al chiamante
se leccezione viene propagata da tutti i metodi della catena e non
viene catturata neanche dallultimo metodo (il metodo main), la JVM
interrompe lesecuzione del programma con un messaggio di errore
(3)
m2()

m1()

public void m2() throws <classe eccezione>2 {


// metodo che pu generare leccezione
...

Programmazione OO in Java - Andrea Bei

main()

Esempio di gestione delle eccezioni


propaga tutti i
tipi di
eccezione

MainClass
main

m1()

cattura E1
propaga
le altre

cattura E2
propaga
le altre

Obj1:Class1

Obj2:Class2
m2()

genera
E0,E1,E2,E3
cattura E0
propaga
le altre
Obj3:Class3

m3()
E0

Errore !

E3

E3

E3

E3

E1

E1
E2

Programmazione OO in Java - Andrea Bei

tempo

Generazione di eccezioni: esempio


FileInputStream genera una
eccezione di tipo checked che
deve essere obbligatoriamente....

1. catturata e gestita (try/catch)

3. Altrimenti errore di compilazione

2. oppure propagata (throws)


Programmazione OO in Java - Andrea Bei

Gestione di eccezioni: esempio

FileNotFoundException
generata da m3 (8) e
catturata localmente (caso E0)

Programmazione OO in Java - Andrea Bei

Gestione di eccezioni: esempio

FileNotFoundException
generata da m3 (8),
propagata da m3 (4) ed m2
(4) e catturata da m1 (11)
(caso E1)

Programmazione OO in Java - Andrea Bei

Generazione di eccezioni
Generazione: sintassi del costrutto throw

throw <oggetto_di_tipo_Throwable>;
Generazione: semantica del costrutto throw
Se leccezione non catturata localmente viene interrotta
lesecuzione del metodo (1) e leccezione viene propagata al metodo
chiamante (2)
public int somma(int a,int b) throws Exception
int somma=a+b;

if (somma>10) throw new Exception("Somma:"+somma+">10 !!");


return(somma);
}

Programmazione OO in Java - Andrea Bei

Esempio

Programmazione OO in Java - Andrea Bei

Definizione di eccezioni proprie


E possibile definire delle proprie eccezioni
ereditando da una delle classi delle eccezioni
esistenti
per le eccezioni checked ereditare da Exception
per le eccezioni unchecked ereditare da
RuntimeException
class RangeException extends Exception {
public RangeException(String s){
super(s);
}
}

Programmazione OO in Java - Andrea Bei

Uso di eccezioni proprie


Le eccezioni proprie sono gestite come le eccezioni
predefinite. In altre parole possono essere:
generate
if (x>MAX_VALUE )

throw

new RangeException(x=+x)

catturate e gestite
try {
....
}catch(RangeException exc){
System.out.println( Errore di intervallo:
+ exc.getMessage());}

propagate
public boolean numeroPrimo(...) throws RangeException
Programmazione OO in Java - Andrea Bei

Eccezioni proprie: esempio

Il metodo isNumeroPrimo
restituisce true se n un
numero primo e false nel caso
contrario. Genera una
RangeException se il numero
negativo.

Leccezione
RangeException
eredita da Exception

Programmazione OO in Java - Andrea Bei

Eccezioni proprie: esempio

E obbligatorio gestire
leccezione RangeException
generata dal metodo
isNumeroPrimo

Programmazione OO in Java - Andrea Bei

Eccezioni proprie: esempio

Programmazione OO in Java - Andrea Bei

La clausola finally
La clausola finally inserito dopo il blocco try/catch
delimita una sezione di codice che deve essere
eseguita comunque a prescindere da ci che avviene
nel blocco try/catch

Programmazione OO in Java - Andrea Bei