Classi e Oggetti

Transcript

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