+ All Categories
Home > Documents > Programmazione ad oggetti in Java - Sal · In principio era sistema di processi (“Algoritmi +...

Programmazione ad oggetti in Java - Sal · In principio era sistema di processi (“Algoritmi +...

Date post: 15-Feb-2019
Category:
Upload: dangnhu
View: 216 times
Download: 0 times
Share this document with a friend
37
Programmazione ad oggetti in Java 1 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
Transcript

Programmazione ad oggetti in Java

1

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

Programmazione ad oggetti in Java

2

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

le persone, le auto, i palazzi, etc. ognuno di questi oggetti ha la capacità di eseguire certe azioni e

ognuna di queste azioni ha effetti su qualche altro oggetto nel mondo

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 focus sul sistema come “banca dati” sviluppo dei DBMS

4 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

3

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 interfaccia-

implementazione

... che porta alla: componibilità riusabilità manutenibilità

6 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

4

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: comandi invocabili dall’esterno (cioè da altri oggetti)

implementazione invisibile: variabili locali (attributi di istanza)

metodi (procedure) che eseguono comandi

8 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

5

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

10 Programmazione ad oggetti in Java

Mondo reale

Oggetti

Rappresentazione

Programmazione ad oggetti in Java

6

Le caratteristiche di un oggetto Un oggetto ha tre caratteristiche: stato, comportamento e

identità

stato: è una delle possibili condizioni in cui può trovarsi è dato dal valore dei suoi attributi

comportamento: determina come un oggetto risponde alle richieste di altri oggetti è 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 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

12 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

7

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 Es. due biciclette di marca, modello e colore uguali sono

comunque due entità a se stanti

Ogni oggetto ha un proprio OID (Object IDentifier) che è 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

Programmazione ad oggetti in Java

8

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

16 Programmazione ad oggetti in Java

Mondo reale

Oggetti

Rappresentazione

Classi

ClassificazioneIstanziazione

Programmazione ad oggetti in Java

9

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) nome, tipo ritornato parametri formali

definizione degli attributi “visibili”

implementa attributi interni

metodi interni

operazioni dei metodi

18 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

10

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

20 Programmazione ad oggetti in Java

Implementazioneinvisibile

Interfacciavisibile

Nome

attivazioni

metodo1

metodo2

metodoN

Metodi(implementazione)

attributo1

attributo2

attributoMAttributi (stato;

visibilità limitata)

manipolazionicomando1

comando2

comandi

Programmazione ad oggetti in Java

11

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

21 Programmazione ad oggetti in Java

public class NomeClasse {//Definizione Attributi di istanza o di classe

//Implementazione Costruttori

//Implementazione Metodi}

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

Programmazione ad oggetti in Java

12

Rappresentazione in UML La classe Punto in un diagramma delle classi di design è

rappresentata come in figura

Sintassi:

23 Programmazione ad oggetti in Java

Modificatore_di_visibilità:+ indica public (appartenente all’interfaccia della classe)

Modificatore_di_visibilità Identificatore_dell’attributo: tipo

Punto

+ x: int+ y: int

Esempio: la classe Punto

public class Punto {public int x;public int y;

}

24 Programmazione ad oggetti in Java

Il nome della classeDefinizione di classe

Definizione degli attributi di istanza

Modificatore di visibilità. public: appartiene all’interfaccia

Programmazione ad oggetti in Java

13

Come si crea un oggetto?

NomeClasse nomeReference;

nomeReference = new NomeClasse();

nomeReference.comando();nomeReference.attributo;

25 Programmazione ad oggetti in Java

dichiara, non crea

crea

accesso all’interfaccia pubblica

Esempio: utilizzo della classe Punto Ogni attributo di istanza possiede un tipo!

26 Programmazione ad oggetti in Java

Punto p1;

p1 = new Punto();

p1.x = 3;p1.y = 4;

int valoreX = p1.x;int valorey = p1.y;

Programmazione ad oggetti in Java

14

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

27 Programmazione ad oggetti in Java

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);}

}}

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 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!

28 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

15

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)

29 Programmazione ad oggetti in Java

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);

?

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

30 Programmazione ad oggetti in Java

p1 ?

p2 ?

p1

p2 ?

xy

p1

p2

xy

xy

Punto p1, p2;1)

p1 = new Punto();2)

p2 = new Punto();3)

Programmazione ad oggetti in Java

16

L’operatore =

31 Programmazione ad oggetti in Java

p1

p2

x=1y

xy

p1.x = 1;4)

p1

p2

x=1y=2

xy

p1.y = 2;5)

p2 = p1;6)

p1

p2

x=1y=2

xy

L’operatore == Permette di verificare se due reference referenziano lo stesso oggetto

Esempio:

La prima stampa stampa false, la seconda true

32 Programmazione ad oggetti in Java

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);

p2 = p1;System.out.println(p1 == p2);

p1

p2

x=1x=2

x=4y=3

p1

p2

x=1x=2

x=4y=3

Programmazione ad oggetti in Java

17

La keyword instanceof Permette di verificare se un oggetto è stato istanziato a

partire dalla classe specificata

Sintassi: reference instanceof NomeClasse

Esempio:

33 Programmazione ad oggetti in Java

Punto p1;p1 = new Punto();if (p1 instanceof Punto)

System.out.println(“p1 referenzia un oggetto” +“ di tipo Punto”);

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:

34 Programmazione ad oggetti in Java

Punto p1 = null;if (p1 == null) {

p1 = new Punto();} else {

System.out.println(“oggetto già istanziato”); }

Programmazione ad oggetti in Java

18

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

Programmazione ad oggetti in Java

19

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

38 Programmazione ad oggetti in Java

Oggetto : classe = link : associazione

Classe

Associazione

Classe

Fra le classi Auto e Motore c’è un’associazione: questo significa che fraogni istanza della classe auto e ogni istanza della classe motore c’è un link

La navigabilità specifica in quale classe verrà codificata l’associazione

Auto

+ marca: String+ modello: String+ velocitaMassima: int+ targa: String

Motore

+ numeroCilindri: int+ potenza: int 1

+ilMotore

1

Programmazione ad oggetti in Java

20

Il codice

39 Programmazione ad oggetti in Java

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;...

}}

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: quelli che eseguono esclusivamente istruzioni quelli che eseguono istruzioni e restituiscono un valore

40 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

21

Metodi: definizione dell’intestazione Intestazione o signature per metodi che esclusivamente eseguono

operazioni:

41 Programmazione ad oggetti in Java

[modificatore/i] void nomeMetodo([lista parametri formali])

Intestazione o signature per metodi che eseguono operazioni e ritornano valori:

[modificatore/i] tipoRitorno nomeMetodo([lista parametri formali])

Esempi: public void variaVelocita(int nuovoValore)private void controllaPressione()

Esempi: public int calcolaArea()public boolean areaUguale(int valore)

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

Programmazione ad oggetti in Java

22

Metodi: definizione del body esempi

43 Programmazione ad oggetti in Java

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;

}}

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 potrebbe fornire dei risultati non attesi

le postcondizioni 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,

44 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

23

Esempio descrizione Esempio:

Sorgente (directory slide 45)

45 Programmazione ad oggetti in Java

LineaTelefonica

+ numero: String+ prefissoNazionale: String+ prefissoInternazionale: String

+ isInterurbana(String) : boolean+ componiNumero(String) : void

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: Sorgente (directory slide 46) per generare la documentazione: javadoc Sorgente.java LineaTelefonica.html (directory slide 46)

46 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

24

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 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!!!!)

Possibilità di modificare l’implementazione (ad esempio per rendere la classe più efficiente) senza che le classi che utilizzano quella modificata se ne accorgano 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

48 Programmazione ad oggetti in Java

public class LineaTelefonica{public String numero;

public String restituisciPrefissoInternazionale() {String nazione = numero.substring(0, 4);return nazione;

}}

In blu ciò che appartiene all’interfacciaIn nero ciò che apprtiene all’implementazione

public class LineaTelefonica{public String numero;

public String restituisciPrefissoInternazionale() {String nazione = "";for(int i=0; i<4; i++) {

nazione = nazione + numero.charAt(i);}return nazione;

}}

tutto ciò che dichiaro public appartiene all’interfaccia

LineaTelefonica

+ numero: String

+ restrituisciPrefissoInternazionale() : String

Programmazione ad oggetti in Java

25

Esempio La classe Semaforo rappresenta un semaforo di un

incrocio stradale

49 Programmazione ad oggetti in Java

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

Esempio

L’implementazione di Semaforo è incapsulata? Posso modificare l’implementazione senza che la classe TestSemaforo debba

moficarla? No! Cambio il tipo di colore da String a int e il main non funziona piu’!

Posso ignorare i dettagli implementativi in fase di utilizzo della classe Semaforo? No! Avendo la possibilità di accedere a colore, devo sapere di che tipo è

L’oggetto s1 rimane sempre in uno stato consistente? No! Posso assegnare il colore blu senza alcun problema. Ma si è mai visto un semaforo

blu?

50 Programmazione ad oggetti in Java

public class Semaforo{

public static void main(String a[]) {Semaforo s1 = new Semaforo();s1.colore = "rosso";s1.cambiaColore();s1.cambiaColore();s1.colore = "blu"; //Errore

}}

Programmazione ad oggetti in Java

26

Realizzare l’incapsulamento Distinguere fra interfaccia e implementazione Gli attributi di istanza sono un dettaglio implementativo, il significato

è dato dalle operazioni che le manipolano 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

Soluzione: modificatori di visibilità per impedire a chi usa oggetti acceda direttamente agli attributi in scrittura 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

esempio: “blu” non è un valore valido per il colore di un Semaforo Soluzione: controllare tutte le modifiche dello stato attraverso

metodi

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: Sorgente (directory slide 52)

52 Programmazione ad oggetti in Java

Automobile

+ velocitaCorrente: int+ proprietario: String

+ toString() : String

Programmazione ad oggetti in Java

27

Gli attributi private Dichiarare un’attributo d’istanza private comporta che è

accessibile esclusivamente all’interno della classe in cui è definito

Esempio corretto: Sorgente (directory slide 53)

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

Automobile

- velocitaCorrente: int- proprietario: String

+ setVelocitaCorrente(velocita :int) : void+ setProprietario(proprietario :String) : void+ toString() : String

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 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

54 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

28

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)

55 Programmazione ad oggetti in Java

Automobile

- velocitaCorrente: int- proprietario: String

+ setVelocitaCorrente(velocita :int) : void+ setProprietario(proprietario :String) : void+ toString() : String+ getVelocita() : int+ getProprietario() : String

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

56 Programmazione ad oggetti in Java

public void setProprietario(String proprietario){this.proprietario = proprietario;

}

Programmazione ad oggetti in Java

29

Naming rispettata sempre? Non è sempre conveniente utilizzare la convenzione

Si utilizza esclusivamente quando ha senso!

Guardiamo questo esempio:

57 Programmazione ad oggetti in Java

Luce

- boolean accesa

+ void accendi()+ void spegni()+ boolean isAccesa()

Luce

- boolean accesa

+ void setAccesa(boolean valore)+ boolean getAccesa()

Riassumendo Quando si definiscono classi usare sempre le seguenti regole:

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()

58 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

30

Overloading Definizione formale: operare overloading di un metodo vuol dire assegnare lo stesso nome

a due o più definizioni differenti all’interno della stessa classe

Come fa Java a sapere quale definizione deve eseguire? 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

Sorgente (directory slide 60)

60 Programmazione ad oggetti in Java

LineaTelefonica

- numero: String- prefissoNazionale: String- prefissoInternazionale: String- ultimoNumeroComposto: String

+ isInterurbana(String) : boolean+ componiNumero(String) : void+ componiNumero() : void

Programmazione ad oggetti in Java

31

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

Programmazione ad oggetti in Java

32

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:

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

Sintassi: new NomeClasse()Esempio: new Automobile()

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:

64 Programmazione ad oggetti in Java

public NomeClasse([lista parametri formali]) {//inizializzazioni

}

NomeClasse ref = new NomeClasse([argomenti])

Programmazione ad oggetti in Java

33

Con la “vecchia” modalità

65 Programmazione ad oggetti in Java

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à 100Automobile a = new Automobile();a.setVelocita(100);a.setProprietario(“Paperino”);

}}

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à 100Automobile a = new Automobile(100, “Paperino”);

}}

66 Programmazione ad oggetti in Java

Programmazione ad oggetti in Java

34

... Se ho vincoli sui valoripublic 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à 100Automobile 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è? 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:

68 Programmazione ad oggetti in Java

Automobile a = new Automobile();

public class Automobile {...public Automobile() {}

}

Programmazione ad oggetti in Java

35

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

70 Programmazione ad oggetti in Java

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;

}

...}

Programmazione ad oggetti in Java

36

Esempio: uso classe Automobile

71 Programmazione ad oggetti in Java

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 130Automobile a3 = new Automobile(130);

//Voglio creare una auto con valori di defaultAutomobile a2 = new Automobile();

...

}}

Richiamare un costruttore da un’altro Come notato, i costruttori visti nell’esempio compiono le

stesse azioni: inizializzare il valore di velcoitaCorrente e di proprietario

È comodo invocare da un costruttore un’altro costruttore passando i giusti argomenti 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

Programmazione ad oggetti in Java

37

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)

73 Programmazione ad oggetti in Java

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);

}

...}

Esercizi Individuare metodi di incapsulamento e costruttori per una classe che rappresenta un’automobile caratterizzata

da: velocitaCorrente velocitaMassima

numeroDiTelaio

una classe che rappresenta una videocassetta. La videocassetta è caratterizzata da un titolo,

una durata il fatto che sia protetta o meno in registrazione

74 Programmazione ad oggetti in Java


Recommended