Argomenti della lezione

270
1 Programmazione ad Oggetti Argomenti della lezione Programmare in Java Un esempio elementare Gli strumenti di Java Struttura di un programma Java Metodi statici Variabili Tipi elementari Istruzioni principali

description

Argomenti della lezione. Programmare in Java Un esempio elementare Gli strumenti di Java Struttura di un programma Java Metodi statici Variabili Tipi elementari Istruzioni principali. Il linguaggio Java. Formalismo ad alto livello... - PowerPoint PPT Presentation

Transcript of Argomenti della lezione

Page 1: Argomenti della lezione

1Programmazione ad Oggetti

Argomenti della lezione

Programmare in JavaUn esempio elementareGli strumenti di Java

Struttura di un programma JavaMetodi staticiVariabiliTipi elementari Istruzioni principali

Page 2: Argomenti della lezione

2Programmazione ad Oggetti

Il linguaggio Java

Formalismo ad alto livello...Permette di descrivere programmi basandosi su

concetti primitivi “sofisticati” (file, finestre, tabelle, liste, ecc.)

...basato su una notazione testuale familiareCodice sorgenteSimile, nella sintassi e nelle istruzioni al

linguaggio C

Page 3: Argomenti della lezione

3Programmazione ad Oggetti

Codice Sorgente

I programmi Java sono suddivisi in “classi” Le classi sono descritte all’interno di file di

testo con estensione “.java” Ogni file contiene una sola classe Il nome file deve coincidere con il nome

della classe

Page 4: Argomenti della lezione

4Programmazione ad Oggetti

Un esempio

public class Hello {

// Il programma più semplice

public static void main(String[] args) {

// Stampa un messaggio sul video

System.out.println(“Hello Java”);

}

}

public class Hello {

// Il programma più semplice

public static void main(String[] args) {

// Stampa un messaggio sul video

System.out.println(“Hello Java”);

}

}

Hello.javaHello.java

Page 5: Argomenti della lezione

5Programmazione ad Oggetti

Passi concettuali (1)

J

.javaCodice

sorgente

10010110110..

10010110110..

.classByteCode

Scrittura Compilazione

Page 6: Argomenti della lezione

6Programmazione ad Oggetti

I passi concettuali (2)

10010110110..

10010110110..

.classByteCode

Hello,

Java!

Hello,

Java!

Esecuzione

Page 7: Argomenti della lezione

7Programmazione ad Oggetti

Gli strumenti di Java

La macchina virtualeIl compilatore Gli ambienti di sviluppoLa documentazioneIl debugger

Page 8: Argomenti della lezione

8Programmazione ad Oggetti

Macchina virtuale (1)

Sistema OperativoSistema Operativo

HardwareHardware

Applicazionetradizionale

Applicazionetradizionale

MacchinaVirtuale

MacchinaVirtuale

ApplicazioneJava

ApplicazioneJava

Page 9: Argomenti della lezione

9Programmazione ad Oggetti

Macchina virtuale (2)

Astrazione di un elaboratore “generico” Ambiente di esecuzione delle applicazioni Java

Esempio: java Hello

Responsabilità:Caricamento classi dal discoVerifica consistenza codiceEsecuzione applicazione

Page 10: Argomenti della lezione

10Programmazione ad Oggetti

Il compilatore

Traduzione dei sorgenti testuali in bytecodeLinguaggio della macchina virtuale Java

Esempio:javac Hello.java

J 10010110110..

10010110110..

Page 11: Argomenti della lezione

11Programmazione ad Oggetti

Ambienti di sviluppo

Il codice sorgente Java è composto da testoUn editor qualsiasi è sufficiente

Si possono usare ambienti integrati per lo sviluppo (IDE)Offrono strumenti per la redazione, la

compilazione, l’esecuzione e la ricerca degli errori

Page 12: Argomenti della lezione

12Programmazione ad Oggetti

Esempi

Eclipsehttp://www.eclipse.org

JCreator http://www.jcreator.com

BlueJhttp://www.bluej.org

Page 13: Argomenti della lezione

13Programmazione ad Oggetti

Documentazione (1)

Strumento necessario alla sopravvivenza del programmatore Java!!

Raccolta di informazioni relative alle classi appartenenti alle librerie standard di Javahttp://java.sun.com/docs/

Page 14: Argomenti della lezione

14Programmazione ad Oggetti

Documentazione (2)

Per ogni classe:Descrizione funzionaleElenco di attributi:

funzionalità, caratteristicheElenco dei metodi:

funzionalità, parametri in ingresso, valori di ritorno, …

Page 15: Argomenti della lezione

15Programmazione ad Oggetti

Il debugger

Strumento ausiliarioal programmatoreMonitorare l’esecuzione

di una applicazioneAnalisi dei valori assunti dalle variabili, i metodi

della classe, …

Comando jdb.exe

Page 16: Argomenti della lezione

16Programmazione ad Oggetti

Cellulari ePC palmariCellulari ePC palmari

ElettrodomesticiElettrodomestici

PC clientPC client

ServerServer

Apparati di rete

Apparati di rete

Dove si usa Java?

Page 17: Argomenti della lezione

17Programmazione ad Oggetti

Java nei sistemi Client

VantaggiFacilità di realizzazione delle interfacce grafiche Indipendenza dalla piattaforma di sviluppo e di

utilizzoCiclo di sviluppo rapido Distribuzione immediata, a richiesta, tramite web

SvantaggiPrestazioni limitate rispetto ad applicazioni nativeAmbienti di esecuzione in forte evoluzione

Oggetto di questo corso

Page 18: Argomenti della lezione

18Programmazione ad Oggetti

Java nei sistemi Server

Varie tipologie di utilizzo:Servlet / Java Server Pages / Java Server FacesEnterpriseJavaBeanApplication server

È il contesto in cui Java sta ottenendo il massimo successo

Oggetto del corso “Programmazione in ambienti distribuiti”

Page 19: Argomenti della lezione

19Programmazione ad Oggetti

Java nei sistemi Embedded

Segmento di mercato in forte crescita:Milioni di PC connessi ad InternetCentinaia di milioni di telefoni cellulariMiliardi di elettrodomestici

Vengono usate librerie specificheJavaCard, Java Micro Edition, …

Page 20: Argomenti della lezione

20Programmazione ad Oggetti

Installare Java (1)

Java Software Development KIT (J2SE SDK) Versione utilizzata nel corso 1.4.xDisponibile gratuitamente:

http://java.sun.com/compilatore, librerie standard, macchina

virtuale, …

Page 21: Argomenti della lezione

21Programmazione ad Oggetti

Installare Java (2)

Necessario modificare la variabile d’ambientePATH= ... ;<JAVA_HOME>/binper invocare i comandi java (compilatore,

macchina virtuale, debugger, ...)

In Windows 2000/XPPannello di controllo

Sistema Avanzate Variabili d’ambiente

Page 22: Argomenti della lezione

24Programmazione ad Oggetti

Programmi Java

Java è un linguaggio ad oggettiL’unità minima di programmazione è la classeUn programma Java utilizza una o più classi

Per ora, consideriamo programmi formati dauna sola classeUn solo file sorgente Il nome del file coincide con il nome della classeL’estensione del file è “.java”

Page 23: Argomenti della lezione

25Programmazione ad Oggetti

Formato generale

public class Prova { /*

qui vengono riportati attributi emetodi della classe …

*/

}

public class Prova { /*

qui vengono riportati attributi emetodi della classe …

*/

}

Prova.javaProva.java

Stesso nome!

Page 24: Argomenti della lezione

26Programmazione ad Oggetti

main(…): la porta sul mondo Java

public static void main(String[] args){/* istruzioni ... */

}Punto di ingresso di ogni applicazione

Invocato automaticamente dalla VM Java

Page 25: Argomenti della lezione

27Programmazione ad Oggetti

Metodi statici

Sequenze di istruzioni che svolgono un determinato compitoHanno un nomePossono avere dei parametriPossono ritornare un valoreDovrebbero avere un commento!

Page 26: Argomenti della lezione

28Programmazione ad Oggetti

public class Test {

static int m1(int a, int b) { int c = a*a+b*b; return c; }

public static void main(String[] args) {

int i = m1(3,4); System.out.println(i);

}}

public class Test {

static int m1(int a, int b) { int c = a*a+b*b; return c; }

public static void main(String[] args) {

int i = m1(3,4); System.out.println(i);

}}

Page 27: Argomenti della lezione

29Programmazione ad Oggetti

Commenti

Servono a documentare un programma (o una sua parte)Racchiusi da “/*” e “*/” “//” inizia un commento che termina a fine riga

Usati sempre troppo poco!

Page 28: Argomenti della lezione

30Programmazione ad Oggetti

Variabili locali

I metodi possono utilizzare variabili:Servono a memorizzare

risultati intermediDichiarate nel corpo del metodoDurata temporanea: quando il metodo ritorna, la

variabile è distrutta

Page 29: Argomenti della lezione

31Programmazione ad Oggetti

Tipi: una forma per i dati

Variabili, parametri, valori ritornati hanno un tipo che ne precisa/limita l’usoPossono contenere solo valori conformi al proprio

tipoEsistono tipi

Semplici (primitivi)Composti (classi) – descritti nelle lezioni

successive

Page 30: Argomenti della lezione

32Programmazione ad Oggetti

Tipi primitivi

Numerici interibyte, short, int, long

Numerici reali float, double

Non numericiboolean, char

Page 31: Argomenti della lezione

33Programmazione ad Oggetti

Tipi numerici interi (1)

Valori ammissibilibyte {-128 ... 127}short {-32768 ... 32767}int {-2147483648 ... 2147483647}long {-9.22 E18 ... 9.22E18}

Page 32: Argomenti della lezione

34Programmazione ad Oggetti

Tipi numerici interi (2)

Operazioni consentitearitmetiche

+, -, *, /, %, ++, --, >>logiche (bit a bit)

^, &, |, ~, <<, >>>confronto

==, !=, >, >=, <, <=

Page 33: Argomenti della lezione

35Programmazione ad Oggetti

Tipi numerici reali

Valori float {±3.403E38}

6 cifre significativedouble {±1.798E308}

15 cifre significative

Operazioniaritmetiche (+, -, *, /)confronto (==, !=,

>, >=, <, <=)

Page 34: Argomenti della lezione

36Programmazione ad Oggetti

Tipi non numerici: boolean

Valori {false, true}

Operazioni logiche (&&, ||, !)confronto (==, !=)

Page 35: Argomenti della lezione

37Programmazione ad Oggetti

Tipi non numerici: char

Rappresentazione dei caratteri secondo lo standard UnicodeLettere di vari alfabeti

arabo, armeno, bengalese, cirillico,greco, latino, ...

Simbolidiacritici, punteggiatura, matematici, tecnici, ...

Page 36: Argomenti della lezione

38Programmazione ad Oggetti

Tipi non numerici: char

Rappresentazione su due byteLe costanti sono indicate tra apici semplici (‘a’) I valori non stampabili sono rappresentati nel

formato unicode (‘\u27AF’)

Operazioni confronto

(==, !=, >,>=, <, <=)

Page 37: Argomenti della lezione

39Programmazione ad Oggetti

Dichiarazioni

Introducono l’utilizzo di una variabileFormato generale

<Tipo> <Nome> ‘;’<Tipo> <Nome> ‘=’ <ValoreIniziale> ‘;’

Esempichar c; int i = 10; long l1, l2;

La mancata dichiarazione è un errore sintattico

Opzionale

Page 38: Argomenti della lezione

40Programmazione ad Oggetti

Usare le variabili (1)

Si può dichiarare una variabile ovunque nel codice di un metodoBisogna farlo, però, prima di usarlaVisibilità limitata al blocco di istruzioni in cui è

dichiarata

Le variabili devono essere inizializzate! int a; int b = a;

Errore!La variabile “a” non è statainizializzata, e il suo valoreè casuale

Errore!La variabile “a” non è statainizializzata, e il suo valoreè casuale

Page 39: Argomenti della lezione

41Programmazione ad Oggetti

Usare le variabili (2)

Ad una variabile può essere assegnato:Un valore costante Il risultato di una formula

Esempi int i = 1, j = 5; i = (5*j) % 10; long l = 10L;char c1 = ‘a’, c2 = ‘\u0062’;boolean b = false;

Page 40: Argomenti della lezione

42Programmazione ad Oggetti

Argomenti della lezione

Modellare la realtàLe classi: il modello

Attributi e metodi

Gli oggetti: il mattoneCostruzione e accessoRiferimentiCiclo di vita degli oggetti

Page 41: Argomenti della lezione

43Programmazione ad Oggetti

Convenzioni sui nomi

Le classi hanno nomi che iniziano con la lettera maiuscola

Metodi, attributi e variabili hanno l’iniziale minuscolaSe un nome è composto da più parole

giustapposte, l’iniziale di ogni parola successiva alla prima è maiuscola

int contatoreNumeroOccorrenze = 0;class CentraleTelefonica { }

Page 42: Argomenti della lezione

44Programmazione ad Oggetti

Modellare la realtà (1)

STATOvia1: verdevia2: rosso

STATOvia1: verdevia2: rosso

STATOmotore:accesovelocità: 0

STATOmotore:accesovelocità: 0

COMPORTAMENTOParti!Frena!Sterza!

COMPORTAMENTOParti!Frena!Sterza!

Page 43: Argomenti della lezione

45Programmazione ad Oggetti

Modellare la realtà (2)

StatoL’insieme dei parametri caratteristici che

contraddistinguono un oggetto in un dato istanteModellato come insieme di attributi

ComportamentoDescrive come si modifica lo stato a fronte degli

stimoli provenienti dal mondo esternoModellato come insieme di metodi

Page 44: Argomenti della lezione

46Programmazione ad Oggetti

Classi

La classe costituisce il “progetto” di un oggettoSpecifica gli attributiDescrive i metodi Indica lo stato iniziale

Ogni classe ha un nomeDeve essere univoco

Page 45: Argomenti della lezione

47Programmazione ad Oggetti

Oggetti

Data una classe, è possibile costruire uno o più oggettiGli oggetti vengono detti “istanze” della classe In Java si utilizza la notazione

new NomeClasse ( );

Ogni oggetto “vive” all’interno della memoria del calcolatoreQui viene memorizzato il suo statoOggetti differenti occupano posizioni differenti

Page 46: Argomenti della lezione

48Programmazione ad Oggetti

Oggetti

class Cerchio {

double r;

...

}

class Cerchio {

double r;

...

}

Memoria

r:??

new Cerchio()

Cerchio

r: double

Page 47: Argomenti della lezione

49Programmazione ad Oggetti

Stato di un oggetto

Ogni oggetto ha un proprio stato: Insieme dei valori assunti dagli attributi

dell’oggettoOperando sui metodi, si può modificare lo stato

All’atto della costruzione di un oggetto, occorre assegnare un valore ai diversi attributiÈ il compito di un metodo particolare, detto

costruttore

Page 48: Argomenti della lezione

50Programmazione ad Oggetti

Costruttore

Metodo che inizializza gli attributi di una classe

Sintassi particolare:Ha lo stesso nome della classeNon indica nessun tipo ritornato

class Cerchio {class Cerchio { double r;double r; Cerchio() { Cerchio() { r=1.0; r=1.0; }}}}

class Cerchio {class Cerchio { double r;double r; Cerchio() { Cerchio() { r=1.0; r=1.0; }}}}

Page 49: Argomenti della lezione

51Programmazione ad Oggetti

Costruire oggetti

class Cerchio { double r;

Cerchio() { r=1.0; } ...}

class Cerchio { double r;

Cerchio() { r=1.0; } ...}

Memoria

r:1.0

new Cerchio()

Cerchio

r: double

Page 50: Argomenti della lezione

52Programmazione ad Oggetti

Costruire oggetti

class Rettangolo { double b,h;

Rettangolo() { b=2.0; h=1.0; } ...}

class Rettangolo { double b,h;

Rettangolo() { b=2.0; h=1.0; } ...}

Memoria

r:1.0

new Rettangolo()

b:2.0h:1.0

Rettangolo

b: doubleh: double

Page 51: Argomenti della lezione

53Programmazione ad Oggetti

Costruttore e parametri

Normalmente un costruttore assegna valori “standard” agli attributi

Se ha dei parametri, può differenziare gli oggetti costruitiChi invoca il costruttore deve fornire

i parametri richiesti

Una classe può avere molti costruttoriOccorre che siano distinguibili attraverso il

numero ed il tipo di parametri richiesti

Page 52: Argomenti della lezione

54Programmazione ad Oggetti

Costruttore e parametriclass Poligono {class Poligono { double lato;double lato; int numeroLati;int numeroLati; PoligonoPoligono(int n) { (int n) { numeroLati=n; numeroLati=n; lato=1.0; lato=1.0; }}}}

class Poligono {class Poligono { double lato;double lato; int numeroLati;int numeroLati; PoligonoPoligono(int n) { (int n) { numeroLati=n; numeroLati=n; lato=1.0; lato=1.0; }}}} Poligono p;Poligono p;

p= new Poligono(p= new Poligono(33););

Poligono p;Poligono p;

p= new Poligono(p= new Poligono(33););

Page 53: Argomenti della lezione

55Programmazione ad Oggetti

Riferimenti

Si opera su un oggetto attraverso un riferimento Indica la posizione in memoria occupata

dall’oggettoAll’atto della costruzione, l’operatore new:

Alloca un blocco di memoria sufficiente a contenere l’oggetto

Invoca il costruttore, determinandone la corretta inizializzazione

Restituisce il riferimento (indirizzo) del blocco inizializzato

Page 54: Argomenti della lezione

56Programmazione ad Oggetti

Riferimenti

r:1.0

b:2.0h:1.0

Riferimento alcerchioRiferimento alrettangolo

Memorianew Cerchio();new Rettangolo();new Cerchio();new Rettangolo();

Gli oggetti vengono costruiti,ma dove finisce il loro riferimento?Gli oggetti vengono costruiti,ma dove finisce il loro riferimento?

Page 55: Argomenti della lezione

57Programmazione ad Oggetti

Variabili

I riferimenti possono essere memorizzati all’interno di variabili localiDevono avere un tipo compatibile con il tipo di

riferimento che si intende memorizzare al loro interno

Devono essere dichiarate prima di essere usate

{… Cerchio c; c= new Cerchio();…}

{… Cerchio c; c= new Cerchio();…}

Page 56: Argomenti della lezione

58Programmazione ad Oggetti

Variabili{ Cerchio c; c= new Cerchio();}

{ Cerchio c; c= new Cerchio();}

Memoria

r:1.0

c

Page 57: Argomenti della lezione

59Programmazione ad Oggetti

Variabili

{ Cerchio c; c= new Cerchio();}

{ Cerchio c; c= new Cerchio();}

Memoria

r:1.0

c

Page 58: Argomenti della lezione

60Programmazione ad Oggetti

Ciclo di vita delle variabili locali

Le variabili locali “esistono” finché il metodo (blocco di codice) che le definisce è in esecuzioneQuando si incontra la loro definizione, il sistema

riserva un’area di memoria per ospitarne il contenuto

Quando il metodo (blocco) termina, l’area viene rilasciata ed il contenuto della variabile perso

La memoria viene prelevata da una zona apposita detta “stack” (quella in cui si trovano gli oggetti, invece, si chiama “heap”)

Page 59: Argomenti della lezione

61Programmazione ad Oggetti

Ciclo di vita delle variabili locali

{ Cerchio c; c= new Cerchio();}

{ Cerchio c; c= new Cerchio();}

Memoria

r:1.0

c

Page 60: Argomenti della lezione

62Programmazione ad Oggetti

Riferimenti multipli

Uno stesso oggetto può essere denotato da più variabiliSuccede quando si assegna ad un variabile il

valore contenuto in un’altra variabileLe variabili condividono il riferimento allo stesso

oggetto

Se si opera sull’oggetto attraverso la prima variabile, le modifiche sono visibili da tutte le altre variabili coinvolte

Page 61: Argomenti della lezione

63Programmazione ad Oggetti

Riferimenti multipli

Cerchio c1,c2;c1= new Cerchio();c2= c1;

Cerchio c1,c2;c1= new Cerchio();c2= c1;

Memoria

r:1.0

c1

c2

Page 62: Argomenti della lezione

64Programmazione ad Oggetti

Variabili elementari

Non tutte le variabili contengono un riferimentoLe informazioni più semplici possono essere

memorizzate direttamente nella variabileÈ il caso delle variabili il cui tipo è elementare

(detto anche primitivo)

Page 63: Argomenti della lezione

65Programmazione ad Oggetti

Variabili elementari

int i;i= 3;int i;i= 3;

Memoria

i

Page 64: Argomenti della lezione

66Programmazione ad Oggetti

Variabili elementari

int i;i= 3;int i;i= 3;

Memoria

i 33

Page 65: Argomenti della lezione

67Programmazione ad Oggetti

Copia di variabili elementari

Se si assegna ad una variabile elementare il valore di un’altra variabile viene eseguita una copia del valore I due valori diventano disgiunti e potranno

evolvere indipendentemente

Page 66: Argomenti della lezione

68Programmazione ad Oggetti

Variabili elementari

int i, j;i= 3;j= i;

int i, j;i= 3;j= i;

Memoria

i 33

j 33

Page 67: Argomenti della lezione

69Programmazione ad Oggetti

Riferimenti nulli

Nel caso di variabili di tipo classe, a volte occorre indicare che non contengono nessun valoreSi usa la parola chiave null

Se una variabile vale null, non è possibile accedere ai metodi o agli attributi

Page 68: Argomenti della lezione

70Programmazione ad Oggetti

Riferimenti nulli

Cerchio c;c= new Cerchio();...c=null

Cerchio c;c= new Cerchio();...c=null

Memoria

r:1.0

c

Page 69: Argomenti della lezione

71Programmazione ad Oggetti

Riferimenti nulli

Cerchio c;c= new Cerchio();...c=null

Cerchio c;c= new Cerchio();...c=null

Memoria

r:1.0

c

Page 70: Argomenti della lezione

72Programmazione ad Oggetti

Accedere agli oggetti

Noto il riferimento ad un oggetto, è possibile invocarne i metodi Si usa la notazione

variabile.metodo(...); Nelle parentesi si indicano gli eventuali parametri

Se la variabile contiene un riferimento nullo si genera un errore di esecuzione

Il metodo è costituito da un insieme di istruzioni Il comportamento è simile ad una chiamata a procedura Il chiamante attende il completamento del metodo, poi

prosegue la propria elaborazione

Page 71: Argomenti della lezione

73Programmazione ad Oggetti

Parametri Un metodo può avere parametri

Internamente, appaiono come variabili locali Il loro valore, però, è fornito dal chiamante

Come le variabili, i parametri hanno un tipo Elementare Complesso

Nel caso di parametri di tipo elementare All’interno del parametro viene memorizzata una copia del valore indicato

dal chiamante Eventuali modifiche compiute dal metodo sul valore non si ripercuotono

sul chiamante Se il tipo è complesso

Il parametro contiene una copia del riferimento all’oggetto passato come parametro

Le eventuali modifiche sullo stato dell’oggetto sono visibili al chiamante

Page 72: Argomenti della lezione

74Programmazione ad Oggetti

Invocare metodi

Cerchio c;c= new Cerchio();c.setRaggio(2.0);

Cerchio c;c= new Cerchio();c.setRaggio(2.0);

Memoria

r:1.0

c

r:2.0

Page 73: Argomenti della lezione

75Programmazione ad Oggetti

Valori di ritorno

Alcuni metodi restituiscono un valore Il tipo del valore ritornato viene dichiarato prima del nome

del metodo double calcolaPerimetro() { … }

Il valore ritornato può essere assegnato ad una variabile Occorre che la variabile sia compatibile con il tipo del valore

ritornato

Altri metodi non ritornano nulla In questo caso dichiarano di ritornare il tipo predefinito void void setRaggio(double r) { … }

Page 74: Argomenti della lezione

76Programmazione ad Oggetti

Valori di ritorno

c.setRaggio(2.0);double p;p=c.calcolaPerimetro()

c.setRaggio(2.0);double p;p=c.calcolaPerimetro()

Memoria

r:1.0

c

r:2.0

p

Page 75: Argomenti della lezione

77Programmazione ad Oggetti

Valori di ritorno

c.setRaggio(2.0);double p;p=c.calcolaPerimetro()

c.setRaggio(2.0);double p;p=c.calcolaPerimetro()

Memoria

r:1.0

c

r:2.0

p 12.5612.56

Page 76: Argomenti della lezione

78Programmazione ad Oggetti

Tipologie di metodi

Un metodo, in generale, può operare liberamente sull’oggetto su cui viene invocato…Modificandone lo stato Invocando metodi su altri oggetti conosciutiEffettuando calcoliRestituendo risultati

Spesso, però, si progettano metodi specializzati in una delle funzioni citate

Page 77: Argomenti della lezione

79Programmazione ad Oggetti

Tipologie di metodi

Modificatori (mutator) Servono ad alterare, in modo controllato, lo stato

dell’oggetto (o una sua parte specifica) Di solito hanno parametri e non ritornano nulla Per convenzione, in Java, hanno un nome simile a

void setXyz(…); Lettori (accessor)

Permettono di conoscere lo stato (o una sua parte specifca) di un oggetto

Di solito, non hanno parametri, e ritornano il valore letto Per convenzione, in Java, hanno un nome simile a

<tipoRitornato> getXyz();

Page 78: Argomenti della lezione

80Programmazione ad Oggetti

Attributi

Come le variabili, anche gli attributi possono avere tipiElementariComplessi (riferimenti ad oggetti)

Un attributo di tipo elementare Contiene direttamente il valore

Un attributo di tipo complessoContiene il riferimento ad un oggetto (oppure

null)

Page 79: Argomenti della lezione

81Programmazione ad Oggetti

class Disegno{class Disegno{int x;int x;int y;int y;

Cerchio c;Cerchio c;……

}}

class Disegno{class Disegno{int x;int x;int y;int y;

Cerchio c;Cerchio c;……

}}

Tipo elementareTipo elementare

Tipo compostoTipo composto

Esempio

Page 80: Argomenti della lezione

82Programmazione ad Oggetti

Attributi e costruttore

All’atto dell’invocazione del costruttore, tutti gli attributi hanno un valore di defaultGli attributi semplici valgono 0 (false, nel caso dei

valori booleani)Quelli complessi, valgono null

È compito del costruttore assegnare valori opportuni se quelli di default non sono adattiQuesto può comportare anche la creazione di

oggetti

Page 81: Argomenti della lezione

83Programmazione ad Oggetti

Attributi e costruttore

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

DisegnoDisegno

x, y: doublec: Cerchiox, y: doublec: Cerchio

……

Memoria

x:0y:0

c:

7

Page 82: Argomenti della lezione

84Programmazione ad Oggetti

Attributi e costruttore

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

DisegnoDisegno

x, y: doublec: Cerchiox, y: doublec: Cerchio

……

Memoria

x:7y:0

c: 3

Page 83: Argomenti della lezione

85Programmazione ad Oggetti

Attributi e costruttore

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

class Disegno { double x,y; Cerchio c;

Disegno() { x=7.0; y=3.0; c= new Cerchio() } ...}

DisegnoDisegno

x, y: doublec: Cerchiox, y: doublec: Cerchio

……

Memoria

x:7y:0

c:

r:1.0

Page 84: Argomenti della lezione

86Programmazione ad Oggetti

Ciclo di vita di un oggetto

L’operatore new, su richiesta del programmatore, alloca la memoria necessaria a contenere un oggettoD1: quando viene rilasciata?R1: quando l’oggetto non serve più!D2: chi decide che non serve più?R2: l’ambiente di esecuzione (!?!)

Page 85: Argomenti della lezione

87Programmazione ad Oggetti

Accessibilità

Un oggetto è accessibile fino a che ne esiste un riferimento

Nel momento in cui non esistano più riferimenti, l’oggetto può essere eliminatoRilasciando la memoria che occupa

I riferimenti sono memorizzati in variabili e attributiSi cancellano quando la variabile cessa di

esistere (fine del blocco) Oppure assegnando esplicitamente il valore null

Page 86: Argomenti della lezione

88Programmazione ad Oggetti

Cerchio c;Cerchio c;c= new Cerchio();c= new Cerchio();......c=null;c=null;

Cerchio c;Cerchio c;c= new Cerchio();c= new Cerchio();......c=null;c=null;

cc

Memoria

r:1.0

Riferimenti nulli

Cerchio c;Cerchio c;c= new Cerchio();c= new Cerchio();......c=null;c=null;

Cerchio c;Cerchio c;c= new Cerchio();c= new Cerchio();......c=null;c=null;

cc

Memoria

r:1.0

Page 87: Argomenti della lezione

89Programmazione ad Oggetti

Conteggio dei riferimenti

All’interno di ogni oggetto, Java mantiene un contatore nascosto Indica il numero di riferimenti esistenti a quello specifico

oggetto Quando il suo valore scende a 0, indica che l’oggetto può

essere eliminato, rilasciando la memoria che occupa

Un particolare sottosistema, il garbage collector, si occupa, periodicamente, di riciclare la memoria degli oggetti eliminati Viene eseguito automaticamente dalla macchina virtuale

Java

Page 88: Argomenti della lezione

90Programmazione ad Oggetti

Cerchio c1,c2;Cerchio c1,c2;c1= new Cerchio();c1= new Cerchio();c2=c1;c2=c1;

Cerchio c1,c2;Cerchio c1,c2;c1= new Cerchio();c1= new Cerchio();c2=c1;c2=c1;

c1c1

Memoria

Conteggio dei riferimenti

c2c2

11

r:1.0

Page 89: Argomenti della lezione

91Programmazione ad Oggetti

Cerchio c1,c2;Cerchio c1,c2;c1= new Cerchio();c1= new Cerchio();c2=c1;c2=c1;

Cerchio c1,c2;Cerchio c1,c2;c1= new Cerchio();c1= new Cerchio();c2=c1;c2=c1;

c1c1

Memoria

Conteggio dei riferimenti

c2c2

11

r:1.022

Page 90: Argomenti della lezione

92Programmazione ad Oggetti

……c2= null;c2= null;……

……c2= null;c2= null;……

c1c1

Memoria

Conteggio dei riferimenti

c2c2

11

r:1.022

……c2= null;c2= null;……

……c2= null;c2= null;……

c1c1

Memoria

c2c2

11

r:1.0

Page 91: Argomenti della lezione

93Programmazione ad Oggetti

……c1= null;c1= null;……

……c1= null;c1= null;……

c1c1

Memoria

Conteggio dei riferimenti

11

r:1.011

……c1= null;c1= null;……

……c1= null;c1= null;……

c1c1

Memoria

Page 92: Argomenti della lezione

94Programmazione ad Oggetti

Costrutti di programmazione

Istruzioni sempliciSceltaRipetizioneSalto strutturato

Invocazione di metodiTrattata più in dettaglio

successivamenteBlocchi di istruzioni

Racchiusi tra parentesi graffe {...}

Page 93: Argomenti della lezione

95Programmazione ad Oggetti

Istruzioni di scelta (1)

Verifica della condizioneVera si esegue l’istruzione o il blocco di istruzioni

successivoFalsa si salta all’istruzione successiva oppure

viene eseguito il blocco “else”

if (condizione)...

if (condizione)... else ...

if (condizione)...

if (condizione)... else ...

Page 94: Argomenti della lezione

96Programmazione ad Oggetti

Istruzioni di scelta (2)

Struttura di selezione multiplaValutazione del valore di una variabileval1, …, valN:

espressioni costanti (interi o caratteri)

switch (var) {case val1: … break;case valN: … break;default: …

}

switch (var) {case val1: … break;case valN: … break;default: …

}

Page 95: Argomenti della lezione

97Programmazione ad Oggetti

Istruzioni di ripetizione (1)

espr1: inizializzazione variabile/i di controlloespr2: condizione di continuazioneespr3: modifica della/e variabili di controllo

for(espr1; espr2; espr3){… //istruzioni da ripetere

}

for(espr1; espr2; espr3){… //istruzioni da ripetere

}

Page 96: Argomenti della lezione

98Programmazione ad Oggetti

Istruzioni di ripetizione (2)

Esecuzione di un blocco di istruzioni finché la condizione rimane vera

do/while garantisce almeno una iterazione

while (cond ){…

}

while (cond ){…

}

do {…

} while(cond );

do {…

} while(cond );

Page 97: Argomenti della lezione

99Programmazione ad Oggetti

Salto strutturato

Istruzioni che permettono di alterare il flusso di esecuzione:break : provoca l’uscita immediata dal bloccocontinue: salto delle rimanenti istruzioni del

blocco, procede con l’interazione successiva del ciclo

Usati nei costrutti while, do/while, for, switch (quest’ultimo, solo break)

Page 98: Argomenti della lezione

100Programmazione ad Oggetti

Oggetti e utilizzatori

Non tutte le caratteristiche di un oggetto devono essere visibili dall’esterno Rischio di manomissioni indebite Occorre separare l’interfaccia

dall’implementazione Si realizza l’incapsulamento utilizzando un

modificatore di visibilità Metodi e attributi possono preceduti da una

parola chiave che indica il livello di privilegio loro associato

Page 99: Argomenti della lezione

101Programmazione ad Oggetti

Modificatori di visibilità

Private Indica che si può accedere all’elemento solo da

altri metodi appartenenti alla stessa classePublic

Indica che l’elemento può essere utilizzato da metodi di qualsiasi classe

[Nulla] In assenza di indicazioni, l’elemento è accessibile

alle altre classi dello stesso “gruppo” (package)

Page 100: Argomenti della lezione

102Programmazione ad Oggetti

Visibilità delle classi

Anche le classi possono essere precedute da un modificatore di visibilità In questo caso, “private” non ha senso

Se una classe è dichiarata pubblica, può essere utilizzata da classi appartenenti a qualsiasi gruppo (package)Altrimenti, può essere usata solo nell’ambito del

gruppo in cui è stata definita

Page 101: Argomenti della lezione

103Programmazione ad Oggetti

Incapsulamento

Per massimizzare il riuso, solo l’informazione minima necessaria al funzionamento deve essere accessibile

Di solito:Attributi privatiMetodi pubbliciCostruttori pubblici

Page 102: Argomenti della lezione

104Programmazione ad Oggetti

publicpublic class Cerchio { class Cerchio { privateprivate double r; double r; publicpublic Cerchio() { Cerchio() { ...... } } publicpublic void setRaggio(double val) void setRaggio(double val) { { r=val;r=val; }}}}

publicpublic class Cerchio { class Cerchio { privateprivate double r; double r; publicpublic Cerchio() { Cerchio() { ...... } } publicpublic void setRaggio(double val) void setRaggio(double val) { { r=val;r=val; }}}}

Incapsulamento

Page 103: Argomenti della lezione

105Programmazione ad Oggetti

Metodi e attributi statici

Oggetti appartenenti ad una stessa classe hanno lo stesso insieme di attributi Ogni oggetto ha però i propri valori, indipendenti

dagli altri Un metodo opera sui valori dell’oggetto su cui è

invocato L’evoluzione dello stato di un oggetto è

indipendente da quella di altri oggetti della stessa classe

Page 104: Argomenti della lezione

106Programmazione ad Oggetti

Attributi statici

Talora, si vuole memorizzare un’informazione comune a tutti gli oggetti di una data classe Si utilizzano gli attributi “statici” Il loro valore viene conservato in un blocco di

memoria separato, relativo alla classe Sono analoghi a variabili globali in altri

linguaggi (C, C++)

Page 105: Argomenti della lezione

107Programmazione ad Oggetti

Esempio

class Cerchio {class Cerchio { staticstatic double pi=3.14;double pi=3.14; double r;double r;......}}

class Cerchio {class Cerchio { staticstatic double pi=3.14;double pi=3.14; double r;double r;......}}

MemoriaMemoria

pi:3.14

Page 106: Argomenti della lezione

108Programmazione ad Oggetti

Esempio

Cerchio c1= Cerchio c1= new Cerchio(1.0);new Cerchio(1.0);

Cerchio c2=Cerchio c2=new Cerchio(2.5);new Cerchio(2.5);

Cerchio c1= Cerchio c1= new Cerchio(1.0);new Cerchio(1.0);

Cerchio c2=Cerchio c2=new Cerchio(2.5);new Cerchio(2.5);

MemoriaMemoria

pi:3.14

r:2.5

r:1.0

Page 107: Argomenti della lezione

109Programmazione ad Oggetti

Esempio

class Cerchio {class Cerchio { … … double calcolaArea() { double calcolaArea() { double a;double a;

a = r*r*a = r*r*pipi;;return a; return a;

}}}}

class Cerchio {class Cerchio { … … double calcolaArea() { double calcolaArea() { double a;double a;

a = r*r*a = r*r*pipi;;return a; return a;

}}}}

Page 108: Argomenti della lezione

110Programmazione ad Oggetti

Uso degli attributi statici

Si può fare accesso ad un attributo statico anche in mancanza di un oggetto specificodouble d= Cerchio.pi/2;

Gli attributi statici devono essere inizializzatiNon si può fare nel costruttore!Occorre farlo all’atto della dichiarazionestatic double pi = 3.14 ;

Page 109: Argomenti della lezione

111Programmazione ad Oggetti

Metodi statici

Non fanno riferimento a nessun attributo specifico di un oggetto Preceduti dal modificatore “static” Equivalenti a procedure e funzioni di altri

linguaggi Possono essere invocati a partire dal nome

della classe

Page 110: Argomenti della lezione

112Programmazione ad Oggetti

Esempi

La classe “Math” contiene metodi statici per le principali operazioni matematichedouble d1,d2;d1 = Math.sqrt( 2.0 );d2 = Math.sin( Math.PI / 2.0 );

La classe “System” contiene, sotto forma di attributi statici, oggetti che modellano le interazioni con la console di sistemaSystem.out //output su schermoSystem.in //input da tastiera

Page 111: Argomenti della lezione

113Programmazione ad Oggetti

System.out

PrintStreamPrintStreampublicvoid print(…)

publicvoid println(…)

Page 112: Argomenti della lezione

114Programmazione ad Oggetti

System.in

InputStreamInputStreampublicint read()

Restituisce il codice ASCII del tasto successivo!

Restituisce il codice ASCII del tasto successivo!

Page 113: Argomenti della lezione

115Programmazione ad Oggetti

Il metodo main()

Quando un programma inizia, non può esistere ancora nessun oggetto Il punto di ingresso deve essere un metodo

statico e pubblico Perché?

Convenzione Java: public static void

main(String[ ] args)

Page 114: Argomenti della lezione

116Programmazione ad Oggetti

Esempio

public class Hello {public class Hello { public static void public static void main(String[] args) {main(String[] args) { System.out.println(“Hello Java”);System.out.println(“Hello Java”); }}}}

public class Hello {public class Hello { public static void public static void main(String[] args) {main(String[] args) { System.out.println(“Hello Java”);System.out.println(“Hello Java”); }}}}

Page 115: Argomenti della lezione

117Programmazione ad Oggetti

La classe String

Classe che modella sequenze immutabili di caratteri

Sintassi semplificata String s1= “Hello” ; String s2 = s1+ “ Java”

Offre molti metodi Confronto, ricerca, derivazione di nuove

stringhe, informazioni generali, …

Page 116: Argomenti della lezione

118Programmazione ad Oggetti

Confronto e ricerca

public boolean equals(String s) Restituisce true se il parametro contiene gli

stessi caratteri dell’oggetto corrente public boolean equalsIgnoreCase(String s)

Idem, trascurando la differenza tra maiuscole e minuscole

public int indexOf(String s) Restituisce la posizione, all’interno della

sequenza di caratteri, in cui inizia la stringa indicata come parametro (-1 se non esiste)

Page 117: Argomenti della lezione

119Programmazione ad Oggetti

Derivazione e informazioni

public String toUpperCase() Restituisce una nuova stringa contenente gli stessi caratteri

in versione maiuscola public String replace(char oldChar, char newChar)

Restituisce una nuova stringa in cui tutte le occorrenze di oldChar sono sostituite con newChar

public String substring(int beginIndex, int endIndex) Restituisce una nuova stringa formata dai caratteri che

iniziano alla posizione beginIndex fino a endIndex escluso public int length()

Restituisce la lunghezza in caratteri della stringa corrente

Page 118: Argomenti della lezione

120Programmazione ad Oggetti

Esempi

String s1=“ciao”;String s1=“ciao”;

String s2= s1.toUpperCase();String s2= s1.toUpperCase();

boolean b= s2.equals (s1);boolean b= s2.equals (s1);

int i= s2.length();int i= s2.length();

int j= s2.indexOf(“AO”);int j= s2.indexOf(“AO”);

String s3=s1.substring(j,i);String s3=s1.substring(j,i);

char c=s1.charAt(0);char c=s1.charAt(0);

String s1=“ciao”;String s1=“ciao”;

String s2= s1.toUpperCase();String s2= s1.toUpperCase();

boolean b= s2.equals (s1);boolean b= s2.equals (s1);

int i= s2.length();int i= s2.length();

int j= s2.indexOf(“AO”);int j= s2.indexOf(“AO”);

String s3=s1.substring(j,i);String s3=s1.substring(j,i);

char c=s1.charAt(0);char c=s1.charAt(0);

Page 119: Argomenti della lezione

121Programmazione ad Oggetti

Argomenti della lezione

Raggruppare le classi in package

Struttura dei packagedelle API Java

Il packagejava.lang

Page 120: Argomenti della lezione

122Programmazione ad Oggetti

Nomi delle classi

La metodologia ad oggetti favorisce il riuso delle classi Il nome della classe dovrebbe suggerirne la

semanticaA volte bisogna utilizzare nello stesso progetto

classi già esistenti, di provenienza diversa ed aventi lo stesso nome

Occorre poter differenziare ulteriormente tali classi

Page 121: Argomenti della lezione

123Programmazione ad Oggetti

Package: un cognome per le classi

Le classi possono essere raggruppate in “package”Ogni package ha un nomeViene scelto in modo da essere univoco

Una classe è denotata:Dal nome proprioDal package di appartenenza

Page 122: Argomenti della lezione

124Programmazione ad Oggetti

Package: appartenenza

Le classi che appartengono ad uno stesso package formano un gruppo

Come nel caso di una famiglia, c’è un rapporto privilegiato: Accessibilità a tutti i componenti non privati

(public, protected, <vuoto>)

Page 123: Argomenti della lezione

125Programmazione ad Oggetti

Il nome dei package

Sequenza di parole separate da ‘.’ Dovrebbe suggerire lo scopo comune del

gruppo di classi Per evitare collisioni, spesso inizia con il nome

DNS in ordine inverso it.polito.didattica.esempi

Page 124: Argomenti della lezione

126Programmazione ad Oggetti

Sintassi

La parola chiave “package” denota il gruppo di appartenenzaÈ seguita dal nome del packageDeve essere posta all’inizio del file sorgente

Page 125: Argomenti della lezione

127Programmazione ad Oggetti

Sintassi

Le classi dello stesso package si “conoscono”Basta usare il nome proprio della classe

Tra package diversi occorre usare il nome completoAnche nei costruttori

Page 126: Argomenti della lezione

128Programmazione ad Oggetti

packagepackage formeforme;;

public class Cerchio {public class Cerchio {//…//…

}}

packagepackage formeforme;;

public class Cerchio {public class Cerchio {//…//…

}} packagepackage provaprova;;class Esempio {class Esempio {

forme.Cerchioforme.Cerchio c;c;

Esempio () {Esempio () { c=newc=new forme.Cerchioforme.Cerchio();(); }}}}

packagepackage provaprova;;class Esempio {class Esempio {

forme.Cerchioforme.Cerchio c;c;

Esempio () {Esempio () { c=newc=new forme.Cerchioforme.Cerchio();(); }}}}

Cerchio.javaCerchio.javaCerchio.javaCerchio.java

Esempio.javaEsempio.javaEsempio.javaEsempio.java

Esempio

Page 127: Argomenti della lezione

129Programmazione ad Oggetti

Importare riferimenti

L’uso di nomi completi è scomodo Gli amici si chiamano per nome

Il costrutto “import” permette di definire le classi note Queste vengono indicate solo per nome Serve solo in fase di compilazione!

Page 128: Argomenti della lezione

130Programmazione ad Oggetti

Esempio

package prova;package prova;importimport forme.Cerchio;forme.Cerchio;

class Esempio {class Esempio { CerchioCerchio c;c;

Esempio () {Esempio () { c=newc=new CerchioCerchio();(); }}}}

package prova;package prova;importimport forme.Cerchio;forme.Cerchio;

class Esempio {class Esempio { CerchioCerchio c;c;

Esempio () {Esempio () { c=newc=new CerchioCerchio();(); }}}}

Esempio.javaEsempio.javaEsempio.javaEsempio.java

Page 129: Argomenti della lezione

131Programmazione ad Oggetti

Importare riferimenti

Si possono includere un numero qualsiasi di clausole import Devono sempre precedere la definizione della

classe

Per importare tutte le classi di un package, si usa la sintassi import NomePackage.* ;

Page 130: Argomenti della lezione

132Programmazione ad Oggetti

Gerarchia di package

Il nome di un package può essere formato da molti segmenti Package che condividono lo stesso prefisso,

possono avere funzionalità “collegate”o java.awto java.awt.event

Per Java, sono gruppi totalmente separati

Page 131: Argomenti della lezione

133Programmazione ad Oggetti

Package anonimo

Le classi che non dichiarano in modo esplicito il proprio package appartengono al package “anonimo” A partire dalla versione 1.4, le classi del

package anonimo non possono essere utilizzate da classi appartenenti ad altri package

Page 132: Argomenti della lezione

134Programmazione ad Oggetti

Compilare ed eseguire

Per poter utilizzare una classe all’interno di un’altra non basta “risolverne” il nome Occorre localizzare il codice ad essa

associato Altrimenti viene lanciato l’errore

“NoClassDefFoundError”

Page 133: Argomenti della lezione

135Programmazione ad Oggetti

Rappresentazione su disco

Ad ogni classe, corrisponde un file “.class” che contiene il codice eseguibileQuesto deve risiedere in una (gerarchia di)

cartella il cui nome coincide con quello del package

Le classi del package anonimo si trovano nella cartella radice

Page 134: Argomenti della lezione

136Programmazione ad Oggetti

packagepackage geom.forme;geom.forme;

public class Cerchio {public class Cerchio {//…//…

}}

packagepackage geom.forme;geom.forme;

public class Cerchio {public class Cerchio {//…//…

}}

public class Test {public class Test {//…//…

}}

public class Test {public class Test {//…//…

}}

TestTest.class.classTestTest

.class.class

......

geomgeom

CerchioCerchio.class.class

CerchioCerchio.class.class

formeforme

Rappresentazione su disco

Page 135: Argomenti della lezione

137Programmazione ad Oggetti

La variabile CLASSPATH

Variabile d’ambiente del sistema operativoSpecifica un insieme di cartelle radice in cui

cercare i file “.class” o le sottocartelle dei package

Può contenere direttori compressi (file “.jar”)

set CLASSPATH=set CLASSPATH= . ; c:\a.jar; c:\classes . ; c:\a.jar; c:\classes

set CLASSPATH=set CLASSPATH= . ; c:\a.jar; c:\classes . ; c:\a.jar; c:\classes

Cerca i file .class, in ordine:Nella cartella in cui viene eseguita la JVM (“.”)Nella cartella compressa c:\a.jarNella cartella c:\classes

Page 136: Argomenti della lezione

138Programmazione ad Oggetti

File Jar

Gerarchie di cartelle e file compressiAnaloghi a file “.zip”Possono essere manipolati con il comando “jar”

Facilitano la distribuzione di interi package

Page 137: Argomenti della lezione

139Programmazione ad Oggetti

API Java

Application Programming Interface Insieme di meccanismi per interagire con il

sistema ospitanteProgettati interamente ad oggetti

Offrono Funzioni di libreria Interfaccia verso il sistema operativo

Versione 1.4.2:135 packageOltre 2700 classi

Page 138: Argomenti della lezione

140Programmazione ad Oggetti

Package principali

java.awt Abstract Windowing Toolkit Classi per creare interfacce utente di tipo

grafico

java.io Input/Output Classi per accedere a a flussi di dati, file e altri

meccanismi di comunicazione

Page 139: Argomenti della lezione

141Programmazione ad Oggetti

Package principali

java.langContiene le classi fondamentali del linguaggio

java.mathEstensioni matematicheClassi per modellare numeri interi e reali con

precisione illimitata

java.netMeccanismi di accesso alla rete Socket, URL, connessioni HTTP, …

Page 140: Argomenti della lezione

142Programmazione ad Oggetti

Package principali

java.nio New Input/Output Meccanismi di basso livello per interfacciarsi

con il mondo esterno

java.security Classi che implementano il modello di

sicurezza di Java

java.sql Accesso a basi dati relazionali

Page 141: Argomenti della lezione

143Programmazione ad Oggetti

Package principali

java.textTrattamento multiculturale di numeri, date, testo

java.util Insieme variegato di classi ad uso generale

Page 142: Argomenti della lezione

144Programmazione ad Oggetti

java.lang: l’ABC delle applicazioni Java

Fornisce le classi fondamentali per la programmazione Java Importato automaticamente dal compilatore in

tutti i programmi

Contiene – tra le altre – le classi Object, Throwable, String

Page 143: Argomenti della lezione

145Programmazione ad Oggetti

java.lang.StringBuffer

Analoga alla classe String Ma permette di modificare i caratteri contenuti

Principali operazioni append(…) insert(…) replace(…) toString()

Page 144: Argomenti della lezione

146Programmazione ad Oggetti

Classi “wrapper”

Utilizzate per trasformare in oggetti dati elementari Il dato contenuto è immutabile

Pattern generaledell’ingegneriadel software oggettooggetto

risorsarisorsanon ad oggettinon ad oggetti

risorsarisorsanon ad oggettinon ad oggetti

Page 145: Argomenti della lezione

147Programmazione ad Oggetti

Classi “wrapper”

ByteByteByteByte

ShortShortShortShort

IntegerIntegerIntegerInteger

LongLongLongLong

FloatFloatFloatFloat

DoubleDoubleDoubleDouble

NumberNumberNumberNumber

ObjectObjectObjectObject

BooleanBooleanBooleanBoolean CharCharCharChar

Page 146: Argomenti della lezione

148Programmazione ad Oggetti

Wrapper numerici

Sottoclassi di Number Metodi per

Trasformare una stringa in un numero e viceversa

Trasformare un numero in formati diversi (con possibile troncamento)

Rappresentazione testuale ottale, esadecimale, binaria

Page 147: Argomenti della lezione

149Programmazione ad Oggetti

Character, Boolean

Character Maiuscolo / minuscolo Valore Unicode Confronto …

Boolean Conversione da/verso stringa Confronto …

Page 148: Argomenti della lezione

150Programmazione ad Oggetti

java.lang.System

Contiene attributi e metodi statici, utilizzati per: Interazione con il sistema Acquisizione di informazioni Caricamento di librerie Accesso a standard input e output …

Non può essere istanziata

Page 149: Argomenti della lezione

151Programmazione ad Oggetti

System: i metodi (1)

exit(…) terminazione della JVM

currentTimeMillis() Numero di millisecondi trascorsi dal 1 gennaio

1970

setProperties(…)/getProperties(…) assegnazione e acquisizione delle proprietà di

sistema

Page 150: Argomenti della lezione

152Programmazione ad Oggetti

System: i metodi (2)

gc() invocazione del garbage collector

load(…) / loadLibrary(…) carica dinamicamente un file o una libreria

setIn(…), setOut(…), setErr(…) riassegnazione dei flussi standard

Page 151: Argomenti della lezione

153Programmazione ad Oggetti

java.lang.Math

Mette a disposizione glistrumenti necessari per le operazioni matematiche base Contiene solo metodi e attributi statici valore assoluto, logaritmo, potenza,

trigonometrici, minimo, massimo, …

Math.pow(2,10); //210

Page 152: Argomenti della lezione

154Programmazione ad Oggetti

java.lang.Runtime

Singola istanza per ogni applicazione Consente di interfacciarsi con il sistema

operativo

Metodi Alcuni analoghi a System: exit, gc, … Esecuzione di un processo, memoria

disponibile,…

Page 153: Argomenti della lezione

155Programmazione ad Oggetti

Array

All’interno di un programma può essere necessario gestire collezioni di dati: Il modo più semplice per organizzarli, se sono di

tipo omogeneo, è attraverso il concetto di array o vettore

Array in Java: oggetti che incapsulano sequenze ordinate di datiHanno dimensione fissa, definita all’atto della

creazioneSintassi semplificata per accedere ai singoli

elementi

Page 154: Argomenti della lezione

156Programmazione ad Oggetti

MemoriaMemoriaint[] valori;int[] valori;valori = new int[3];valori = new int[3];for (int i=0; i< valori.length; i++)for (int i=0; i< valori.length; i++)

valori[i]= i*i;valori[i]= i*i;

int[] valori;int[] valori;valori = new int[3];valori = new int[3];for (int i=0; i< valori.length; i++)for (int i=0; i< valori.length; i++)

valori[i]= i*i;valori[i]= i*i;

valorivalori

lengthlength

0000

0000

0000

3333

Page 155: Argomenti della lezione

157Programmazione ad Oggetti

MemoriaMemoriaint[] valori;int[] valori;valori = new int[3];valori = new int[3];for (int i=0; i< valori.length; i++)for (int i=0; i< valori.length; i++)

valori[i]= i*i;valori[i]= i*i;

int[] valori;int[] valori;valori = new int[3];valori = new int[3];for (int i=0; i< valori.length; i++)for (int i=0; i< valori.length; i++)

valori[i]= i*i;valori[i]= i*i;

valorivalori

lengthlength

0000

1111

4444

3333

Page 156: Argomenti della lezione

158Programmazione ad Oggetti

Tipologie di array

Esistono due gruppi di arrayQuelli che modellano sequenze di tipi

elementari (interi, reali, caratteri, booleani)Quelli che modellano sequenze di oggetti

Qualunque sia il gruppo di appartenenza, gli array sono sempre oggetti complessiVengono creati tramite l’operatore newSi accede ad essi attraverso un riferimento in

memoria

Page 157: Argomenti della lezione

159Programmazione ad Oggetti

Inizializzare un arrayNel caso di array di tipi elementari, all’atto

della creazione vengono assegnati valori di default0 per i numeri (interi e reali) false per i valori logici ‘\000’ per i caratteri

A volte si conosce a priori l’intero contenuto dell’arrayJava offre una sintassi semplificata per la sua

inizializzazione

integer[] valori = new integer[] valori = new integerinteger[] [] {{44,, 00,, 77,, 99};};

integer[] valori = new integer[] valori = new integerinteger[] [] {{44,, 00,, 77,, 99};};

Page 158: Argomenti della lezione

160Programmazione ad Oggetti

Uso degli array

Per accedere ad un singolo elemento, si utilizza la sintassi nome_array [ indice ] L’indice deve essere compreso tra 0 e il numero di

elementi presenti nell’array

Un array può contenere anche tipi complessi (oggetti) In questo caso, nelle singole posizioni sono memorizzati i

riferimenti agli oggetti specifici All’atto della creazione del vettore, tutti i riferimenti

contenuti valgono null String[] nomi= String[] nomi=

new String[10];new String[10]; String[] nomi= String[] nomi=

new String[10];new String[10];

Page 159: Argomenti della lezione

161Programmazione ad Oggetti

String[] nomi;String[] nomi;nomi = new String[3];nomi = new String[3];nomi[1]=“Mario”nomi[1]=“Mario”

nominomi

MemoriaMemoria

lengthlength 33

nullnull

nullnull

nullnull

Page 160: Argomenti della lezione

162Programmazione ad Oggetti

String[] nomi;String[] nomi;nomi = new String[3];nomi = new String[3];nomi[1]=“Mario”nomi[1]=“Mario”

nominomi

MemoriaMemoria

lengthlength 33

nullnull

nullnull

nullnull

““Mario”Mario”

Page 161: Argomenti della lezione

163Programmazione ad Oggetti

Array a più dimensioni

È anche possibile creare matrici int [ ] [ ] matrice= new int [3] [3];

Si tratta di “array di array” Il primo indice si riferisce alla riga, il secondo alla

colonna

Non c’è limite al numero di dimensioni dell’arraySe non la memoria disponibile…

Page 162: Argomenti della lezione

164Programmazione ad Oggetti

int[][] matrice = new int[3][3];int[][] matrice = new int[3][3];matrice[2][0]= 1;matrice[2][0]= 1;

int[][]int[][]int[][]int[][]

lengthlengthlengthlength 3333

nullnullnullnull nullnullnullnull nullnullnullnullmatricematrice

int[]int[]int[]int[]

lengthlengthlengthlength 3333

0000 0000 0000

int[]int[]int[]int[]

lengthlengthlengthlength 3333

0000 0000 0000

int[]int[]int[]int[]

lengthlengthlengthlength 3333

0000 0000 000011

Page 163: Argomenti della lezione

165Programmazione ad Oggetti

Argomenti della lezione

I concetti principaliEreditarietà in JavaLa classe ObjectClassi astratte

e interfacce

Page 164: Argomenti della lezione

166Programmazione ad Oggetti

Riusare il software

A volte si incontrano classi con funzionalità simili In quanto sottendono concetti semanticamente “vicini” Una mountain bike assomiglia ad una bicicletta tradizionale

È possibile creare classi disgiunte replicando le porzione di stato/comportamento condivise L’approccio “Taglia&Incolla”, però, non è una strategia

vincente Difficoltà di manutenzione correttiva e perfettiva

Meglio “specializzare” codice funzionante Sostituendo il minimo necessario

Page 165: Argomenti della lezione

167Programmazione ad Oggetti

Ereditarietà

Meccanismo per definire una nuova classe (classe derivata) come specializzazione di un’altra (classe base) La classe base modella un concetto generico La classe derivata modella un concetto più specifico

La classe derivata: Dispone di tutte le funzionalità (attributi e metodi) di quella

base Può aggiungere funzionalità proprie Può ridefinirne il funzionamento di metodi esistenti

(polimorfismo)

Page 166: Argomenti della lezione

168Programmazione ad Oggetti

Esempio BiciclettaBiciclettacoppiarapportoPosteriore…

coppiarapportoPosteriore…

pedala(coppia)cambiaRapporto(n)frena(intensità)…

pedala(coppia)cambiaRapporto(n)frena(intensità)…

MountainBikeMountainBikerapportoAnteriorerapportoAnteriore

cambiaRapportoAnt(n)cambiaRapportoAnt(n)

TandemTandemcoppia2coppia2

pedala2(coppia)pedala2(coppia)

Page 167: Argomenti della lezione

169Programmazione ad Oggetti

Terminologia

BiciclettaBicicletta

MountainBikeMountainBike TandemTandem

Classe base,superclasseClasse base,superclasse

Classi derivate,sottoclassi

Classi derivate,sottoclassi

Page 168: Argomenti della lezione

170Programmazione ad Oggetti

Astrazione

Il processo di analisi e progettazione del software di solito procede per raffinamenti successivi Spesso capita che le similitudini tra classi non siano colte

inizialmente In una fase successiva, si coglie l’esigenza/opportunità di

introdurre un concetto più generico da cui derivare classi specifiche

Processo di astrazione Si introduce la superclasse che “astrae” il concetto comune

condiviso dalle diverse sottoclassi Le sottoclassi vengono “spogliate” delle funzionalità

comuni che migrano nella superclasse

Page 169: Argomenti della lezione

171Programmazione ad Oggetti

VeicoloVeicolodouble getVelocità()double getVelocità()double getAccelerazione()double getAccelerazione()……

double getVelocità()double getVelocità()double getAccelerazione()double getAccelerazione()……

BiciclettaBiciclettavoid pedala()void pedala()void pedala()void pedala()

AutomobileAutomobilevoid avvia()void avvia()void spegni()void spegni()void avvia()void avvia()void spegni()void spegni()

Page 170: Argomenti della lezione

172Programmazione ad Oggetti

Tipi ed ereditarietà

Ogni classe definisce un tipo: Un oggetto, istanza di una sotto-classe, è formalmente

compatibile con il tipo della classe base Il contrario non è vero!

Esempio Un’automobile è un veicolo Un veicolo non è (necessariamente) un’automobile

La compatibilità diviene effettiva se I metodi ridefiniti nella sotto-classe rispettano la semantica

della superclasse L’ereditarietà gode delle proprietà transitiva

Un tandem è un veicolo (poiché è una bicicletta, che a sua volta è un veicolo)

Page 171: Argomenti della lezione

173Programmazione ad Oggetti

Vantaggi dell’ereditarietà

Evitare la duplicazione di codice

Permettere il riuso di funzionalità

Semplificare la costruzione di nuove classi

Facilitare la manutenzioneGarantire la consistenza delle interfacce

Page 172: Argomenti della lezione

174Programmazione ad Oggetti

Ereditarietà in Java

Si definisce una classe derivata attraverso la parola chiave “extends”Seguita dal nome della classe base

Gli oggetti della classe derivata sono, a tutti gli effetti, estensioni della classe baseAnche nella loro rappresentazione in memoria

Page 173: Argomenti della lezione

175Programmazione ad Oggetti

Ereditarietà in Java

public class Veicolo {private double velocità;private double accelerazione;

public double getVelocità() {…} public double getAccelerazione() {…}}

public class Veicolo {private double velocità;private double accelerazione;

public double getVelocità() {…} public double getAccelerazione() {…}}

public class Automobile extends Veicolo {

private boolean avviata;public void avvia() {…}

}

public class Automobile extends Veicolo {

private boolean avviata;public void avvia() {…}

}

Veicolo.javaVeicolo.java

Automobile.javaAutomobile.java

Page 174: Argomenti della lezione

176Programmazione ad Oggetti

Ereditarietà in Java

MemoriaAutomobile a= new Automobile();Automobile a= new Automobile();

velocità: 0.0accelerazione: 0.0

avviata: falseaa

Page 175: Argomenti della lezione

177Programmazione ad Oggetti

Meccanismi

Costruzione di oggetti di classi derivate

Accesso alle funzionalità della superclasse

Ri-definizione di metodi

Page 176: Argomenti della lezione

178Programmazione ad Oggetti

Costruzione

Per realizzare un’istanza di una classe derivata, occorre – innanzi tutto – costruire l’oggetto baseDi solito, provvede automaticamente il

compilatore, invocando – come prima operazione di ogni costruttore della classe derivata – il costruttore anonimo della superclasse

Si può effettuare in modo esplicito, attraverso il costrutto super(…)

Eventuali ulteriori inizializzazioni possono essere effettuate solo successivamente

Page 177: Argomenti della lezione

179Programmazione ad Oggetti

Esempioclass class ImpiegatoImpiegato { { String nome;String nome; double stipendio; double stipendio;

Impiegato(String n) {Impiegato(String n) { nome = n;nome = n; stipendio= 1500;stipendio= 1500; }}}}

class class ImpiegatoImpiegato { { String nome;String nome; double stipendio; double stipendio;

Impiegato(String n) {Impiegato(String n) { nome = n;nome = n; stipendio= 1500;stipendio= 1500; }}}}

class class FunzionarioFunzionario extendsextends ImpiegatoImpiegato { {

Funzionario(String n) {Funzionario(String n) { super(n)super(n);; stipendio = 2000;stipendio = 2000; }}}}

class class FunzionarioFunzionario extendsextends ImpiegatoImpiegato { {

Funzionario(String n) {Funzionario(String n) { super(n)super(n);; stipendio = 2000;stipendio = 2000; }}}}

Page 178: Argomenti della lezione

180Programmazione ad Oggetti

Accedere alla superclasse

L’oggetto derivato contiene tutti i componenti (attributi e metodi) dell’oggetto da cui derivaMa i suoi metodi non possono operare

direttamente su quelli definiti privati

La restrizione può essere allentata:La super-classe può definire attributi e metodi

con visibilità “protected” Questi sono visibili alle sottoclassi

Page 179: Argomenti della lezione

181Programmazione ad Oggetti

Ridefinire i metodi

Una sottoclasse può ridefinire metodi presenti nella superclasse

A condizione che abbianoLo stesso nomeGli stessi parametri (tipo, numero, ordine)Lo stesso tipo di ritorno (La stessa semantica!)

Per le istanze della sottoclasse, il nuovo metodo nasconde l’originale

Page 180: Argomenti della lezione

182Programmazione ad Oggetti

Ridefinire i metodi

class Base {class Base {

int m() {int m() {

return 0; return 0;

}}}}

class Base {class Base {

int m() {int m() {

return 0; return 0;

}}}}

class Derivata class Derivata extends Base {extends Base {

int m() {int m() {

return 1; return 1;

}}}}

class Derivata class Derivata extends Base {extends Base {

int m() {int m() {

return 1; return 1;

}}}}

Base b= new Base();System.out.println(b.m()b.m());Derivata d= new Derivata();System.out.println(d.m()d.m());

Base b= new Base();System.out.println(b.m()b.m());Derivata d= new Derivata();System.out.println(d.m()d.m());

Page 181: Argomenti della lezione

183Programmazione ad Oggetti

Ridefinire i metodi

A volte, una sottoclasse vuole “perfezionare” un metodo ereditato, non sostituirlo in totoPer invocare l’implementazione presente nella

super-classe, si usa il costrutto super.<nomeMetodo> ( … )

class Base {class Base {

int int mm() {() {

return 0; return 0;

}}}}

class Base {class Base {

int int mm() {() {

return 0; return 0;

}}}}

class Derivata class Derivata extendsextends Base { Base {

int int mm() {() {

return return super.m()super.m()+ 1;+ 1;

}}}}

class Derivata class Derivata extendsextends Base { Base {

int int mm() {() {

return return super.m()super.m()+ 1;+ 1;

}}}}

Page 182: Argomenti della lezione

184Programmazione ad Oggetti

Compatibilità formale

Un’istanza di una classe derivata è formalmente compatibile con il tipo della super-classeBase b = new Derivata( );

Il tipo della variabile “b” (Base) limita le operazioni che possono essere eseguite sull’oggetto contenutoAnche se questo ha una classe più specifica

(Derivata), in grado di offrire un maggior numero di operazioni

Altrimenti viene generato un errore di compilazione

Page 183: Argomenti della lezione

185Programmazione ad Oggetti

Compatibilità formale

CCCC

print()print()print()print()

DDDD

print()print()reset()reset()print()print()reset()reset()

C v1= new C();C v2= new D();D v3= new D();

C v1= new C();C v2= new D();D v3= new D();

v1.print() v2.print() v2.reset() v3.reset()

v1.print() v2.print() v2.reset() v3.reset()

Page 184: Argomenti della lezione

186Programmazione ad Oggetti

Polimorfismo

class Base {class Base {

int m() {int m() {

return 0; return 0;

}}}}

class Base {class Base {

int m() {int m() {

return 0; return 0;

}}}}

class Derivata class Derivata extends Base {extends Base {

int m() {int m() {

return 1; return 1;

}}}}

class Derivata class Derivata extends Base {extends Base {

int m() {int m() {

return 1; return 1;

}}}}

Base b= new Base b= new DerivataDerivata();();System.out.println(System.out.println(b.m()b.m()););Base b= new Base b= new DerivataDerivata();();System.out.println(System.out.println(b.m()b.m()););

Page 185: Argomenti della lezione

187Programmazione ad Oggetti

Polimorfismo

Java mantiene traccia della classe effettiva di un dato oggettoSeleziona sempre il metodo più specifico……anche se la variabile che lo contiene

appartiene ad una classe più generica!Una variabile generica può avere “molte

forme” Contenere oggetti di sottoclassi differenti In caso di ridefinizione, il metodo chiamato

dipende dal tipo effettivo dell’oggetto

Page 186: Argomenti della lezione

188Programmazione ad Oggetti

Polimorfismo

Per sfruttare questa tecnica:Si definiscono, nella super-classe, metodi con

implementazione generica……sostituiti, nelle sottoclassi, da implementazioni

specificheSi utilizzano variabili aventi come tipo quello della

super-classeMeccanismo estremamente potente e

versatile, alla base di molti “pattern” di programmazione

Page 187: Argomenti della lezione

189Programmazione ad Oggetti

Esempio

FormaForma f1 = f1 = newnew Cerchio()Cerchio();;

Forma Forma f2 = newf2 = new Rettangolo()Rettangolo();;

double d1,d2;double d1,d2;

d1=f1.area();d1=f1.area();d2=f2.area();d2=f2.area();

CerchioCerchioCerchioCerchio

area()area()perimetro()perimetro()area()area()perimetro()perimetro()

FormaFormaFormaForma

area()area()perimetro()perimetro()area()area()perimetro()perimetro()

RettangoloRettangoloRettangoloRettangolo

area()area()perimetro()perimetro()area()area()perimetro()perimetro()

Page 188: Argomenti della lezione

190Programmazione ad Oggetti

La classe java.lang.Object

In Java:Gerarchia di ereditarietà sempliceOgni classe ha una sola super-classe

Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita ObjectObject non ha super-classe!

Page 189: Argomenti della lezione

191Programmazione ad Oggetti

Metodi di Object

Object definisce un certo numero di metodi pubblici Qualunque oggetto di qualsiasi classe li eredita La loro implementazione base è spesso minimale La tecnica del polimorfismo permette di ridefinirli

public boolean equals(Object o) Restituisce “vero” se l’oggetto confrontato è identico (ha lo

stesso riferimento) a quello su cui viene invocato il metodo Per funzionare correttamente, ogni sottoclasse deve fornire

la propria implementazione polimorfica

Page 190: Argomenti della lezione

192Programmazione ad Oggetti

Metodi di Object

public String toString() Restituisce una rappresentazione stampabile dell’oggetto L’implementazione base fornita indica il nome della classe

seguita dal riferimento relativo all’oggetto (java.lang.Object@10878cd)

public int hashCode() Restituisce un valore intero legato al contenuto dell’oggetto Se i dati nell’oggetto cambiano, deve restituire un valore

differente Oggetti “uguali” devono restituire lo stesso valore, oggetti

diversi possono restituire valori diversi Utilizzato per realizzare tabelle hash

Page 191: Argomenti della lezione

193Programmazione ad Oggetti

Controllare l’ereditarietà

In alcuni casi, si vuole impedire esplicitamente l’utilizzo della tecnica del polimorfismo Ad esempio, per motivi di sicurezza o per garantire il

mantenimento di una data proprietà del sistema Si utilizza la parola chiave “final”

Un metodo “final” non può essere ridefinito da una sottoclasse

Una classe “final” non può avere sottoclassi Un attributo “final” non può essere modificato

Non c’entra nulla con l’ereditarietà!

Page 192: Argomenti della lezione

194Programmazione ad Oggetti

Controllare l’ereditarietà

In altri casi si vuole obbligare l’utilizzo del polimorfismoSi introducono metodi privi di implementazioneFacendoli precedere dalla parola chiave

“abstract”Una classe che contiene metodi astratti

Deve essere, a sua volta, dichiarata abstractNon può essere istanziata direttamenteOccorre definire una sottoclasse che fornisca

l’implementazione dei metodi mancanti

Page 193: Argomenti della lezione

195Programmazione ad Oggetti

Classi astratte

abstractabstract class class BaseBase { {

abstractabstract int m();int m();

}}

abstractabstract class class BaseBase { {

abstractabstract int m();int m();

}}

class class DerivataDerivata extends extends BaseBase { {

int m() {int m() {

return 1; return 1;

}}}}

class class DerivataDerivata extends extends BaseBase { {

int m() {int m() {

return 1; return 1;

}}}}

Base b= new Derivata();Base b= new Derivata();System.out.println(b.m());System.out.println(b.m());Base b= new Derivata();Base b= new Derivata();System.out.println(b.m());System.out.println(b.m());

Page 194: Argomenti della lezione

196Programmazione ad Oggetti

Interfacce

Una classe astratta può contenere metodi non astratti A beneficio delle proprie sottoclassi

In alcuni casi, si vogliono definire metodi astratti senza vincolare la gerarchia di ereditarietà delle classi che li implementeranno

Si utilizzano le interfacce: Insiemi di metodi astratti e costanti (attributi static final) Pubblici per definizione

Una classe può implementare un’interfaccia Fornendo il codice relativo a tutti i metodi dichiarati

nell’interfaccia

Page 195: Argomenti della lezione

197Programmazione ad Oggetti

Esempio

public interface public interface ComparableComparable { {public int public int compareTocompareTo(Object o);(Object o);

}}

public interface public interface ComparableComparable { {public int public int compareTocompareTo(Object o);(Object o);

}}

public class public class RettangoloRettangolo extends extends FormaFormaimplements implements ComparableComparable { {

public int public int compareTocompareTo(Object o) {(Object o) { //codice relativo…//codice relativo… }}

//altri attributi e metodi…//altri attributi e metodi…}}

public class public class RettangoloRettangolo extends extends FormaFormaimplements implements ComparableComparable { {

public int public int compareTocompareTo(Object o) {(Object o) { //codice relativo…//codice relativo… }}

//altri attributi e metodi…//altri attributi e metodi…}}

Page 196: Argomenti della lezione

198Programmazione ad Oggetti

Interfacce e tipi

Analogamente alle classi, ogni interfaccia definisce un tipoUn oggetto che implementa una data interfaccia

ha come tipo anche il tipo dell’interfaccia Un oggetto può implementare molte interfacceDi conseguenza può avere molti tipi

Si può verificare se un oggetto ha un dato tipo con l’operatore “instanceof” if (myObject instanceof Comparable) …

Page 197: Argomenti della lezione

199Programmazione ad Oggetti

Interfacce vuote

Alcune interfacce non hanno metodiServono solo come “marcatori” o indicatori di

tipo Indicano che gli oggetti delle classi che le

implementano godono di qualche proprietà

Page 198: Argomenti della lezione

200Programmazione ad Oggetti

Interfacce vuote

public interface public interface ClonableClonable { { //indica che è lecito usare, //indica che è lecito usare, // sulle istanze di questa classe// sulle istanze di questa classe // il metodo Object.clone()// il metodo Object.clone()}}

public interface public interface ClonableClonable { { //indica che è lecito usare, //indica che è lecito usare, // sulle istanze di questa classe// sulle istanze di questa classe // il metodo Object.clone()// il metodo Object.clone()}}

public class public class RettangoloRettangolo extends extends FormaFormaimplements implements ComparableComparable , , ClonableClonable { {

public int public int compareTocompareTo(Object o) {(Object o) { //codice relativo…//codice relativo… }}

//altri attributi e metodi…//altri attributi e metodi…}}

public class public class RettangoloRettangolo extends extends FormaFormaimplements implements ComparableComparable , , ClonableClonable { {

public int public int compareTocompareTo(Object o) {(Object o) { //codice relativo…//codice relativo… }}

//altri attributi e metodi…//altri attributi e metodi…}}

Page 199: Argomenti della lezione

201Programmazione ad Oggetti

Percorso

Eventi eccezionali Identificazione,

descrizione e segnalazione

Eccezioni in Java I meccanismi offertiLe classi principali

Modellare le eccezioni

Page 200: Argomenti della lezione

202Programmazione ad Oggetti

Affidabilità di un programma

Un programma esegue una sequenza di operazioni su un calcolatoreAlcune direttamente, altre attraverso le

funzionalità offerte dal sistema operativo

Talvolta qualche operazione non può essere effettuata Il programma deve accorgersene e reagire di

conseguenza

Page 201: Argomenti della lezione

203Programmazione ad Oggetti

Le ragioni del fallimento

Mancanza di risorseMemoria esaurita, disco pieno, autorizzazioni

insufficienti, …

Parametri erratiDivisione per 0, riferimenti a risorse inesistenti

(file, URL), …

Sequenza illecita di operazioniUtilizzo di riferimenti nulli, scrittura su file

chiuso, …

Page 202: Argomenti della lezione

204Programmazione ad Oggetti

Le ragioni del fallimento

Alcune dipendono dal programmatoreAltre, dal contesto di esecuzione

In ogni caso, quando si rileva un’anomaliaNon è possibile concludere l’operazione in corso Il programma, nel suo complesso, viene a

trovarsi in uno stato incoerente

Per garantire l’affidabilità del sistema, occorre mettere in atto una strategia di rilevazione e gestione delle eccezioni

Page 203: Argomenti della lezione

205Programmazione ad Oggetti

Strategie

Tutte le operazioni che possono fallire, devono indicare:Se sono terminate con successo o menoL’eventuale anomalia riscontrata

Alcuni linguaggi si basano su valori di ritornoOccorre verificarli Il diagramma di flusso si complica notevolmenteSe si omette un test, si compromette la capacità

di valutare l’integrità del sistema

Page 204: Argomenti della lezione

206Programmazione ad Oggetti

Esempio

Semplice procedura:Tre operazioni

in successioneCiascuna può fallire

Apri il fileApri il fileApri il fileApri il file

ScriviScriviScriviScrivi

Chiudi il fileChiudi il fileChiudi il fileChiudi il file

Page 205: Argomenti della lezione

207Programmazione ad Oggetti

Esempio

Apri il fileApri il fileApri il fileApri il file ScriviScriviScriviScrivi Chiudi il fileChiudi il fileChiudi il fileChiudi il file

OK?OK?OK?OK?sisinono

OK?OK?OK?OK?sisinono

OK?OK?OK?OK?sisinono

Page 206: Argomenti della lezione

208Programmazione ad Oggetti

Complessità

Rapidamente, il codice associato ad una procedura semplice diventa ingestibileLa reazione comune

consiste nell’omettere i test

Cosa fare quando si rileva un malfunzionamento?

Page 207: Argomenti della lezione

209Programmazione ad Oggetti

Contesto

Spesso, ci si accorge dei fallimenti all’interno di procedure genericheNon si sa quali contromisure prendere

Occorrerebbe segnalare il malfunzionamento al chiamanteFornendo la descrizione più accurata possibile di

quanto successo Il chiamante può gestire l’eccezione o

rimandarne la gestione al proprio chiamante, ricorsivamente…

Page 208: Argomenti della lezione

210Programmazione ad Oggetti

La risposta di Java

Un’insieme di classi per modellare l’anomalia riscontrataFa capo alla classe Throwable

Meccanismi perSegnalareGestirePropagare

un’anomalia, attraverso la catena di invocazione dei metodi

Page 209: Argomenti della lezione

211Programmazione ad Oggetti

Sintassi

Un metodo che può fallire deve segnalarlo nella propria dichiarazione Attraverso la parola chiave “throws” Seguita dal tipo (o dai tipi) di eccezione che si può

verificare durante l’esecuzione

Chi invoca tale metodo deve: Cercare di gestire la possibile anomalia attraverso il

costrutto “try” / “catch” Oppure, segnalare che a propria volta può generare la

stessa anomalia: l’eccezione si propaga al chiamante del chiamante

Page 210: Argomenti della lezione

212Programmazione ad Oggetti

Esempio

double div(int num, int den)double div(int num, int den)

throwsthrows Exception {Exception {

if (den==0)if (den==0)

throw throw

newnew Exception(“div 0”);Exception(“div 0”);

return num/den;return num/den;

}}

double div(int num, int den)double div(int num, int den)

throwsthrows Exception {Exception {

if (den==0)if (den==0)

throw throw

newnew Exception(“div 0”);Exception(“div 0”);

return num/den;return num/den;

}}

Segnala che Segnala che puo’ fallirepuo’ fallire

Segnala che Segnala che puo’ fallirepuo’ fallireVerifica la Verifica la coerenzacoerenza

Verifica la Verifica la coerenzacoerenza

Descrive Descrive l’anomalial’anomaliaDescrive Descrive l’anomalial’anomalia

Interrompe Interrompe l’esecuzionel’esecuzionedel metododel metodo

Interrompe Interrompe l’esecuzionel’esecuzionedel metododel metodo

Page 211: Argomenti della lezione

213Programmazione ad Oggetti

Try/Catch

Costrutto utilizzato per il controllo delle eccezioni Isola le parti di codice che possono provocare

anomalie

trytry{{ … … // codice da controllare// codice da controllare}} catchcatch((…Exception e…Exception e){){ … … // gestione anomalia// gestione anomalia}}

trytry{{ … … // codice da controllare// codice da controllare}} catchcatch((…Exception e…Exception e){){ … … // gestione anomalia// gestione anomalia}}

Page 212: Argomenti della lezione

214Programmazione ad Oggetti

Try/Catch

È possibile reagire in modo differente a tipi diversi di eccezioni mettendo più clausole “catch” in sequenzaAvendo cura di indicare dapprima le anomalie più

specifiche

trytry{{ … …}} catchcatch((ExceptionA e1ExceptionA e1){ …){ …}} catchcatch((ExceptionB e2ExceptionB e2){ …){ …}}

trytry{{ … …}} catchcatch((ExceptionA e1ExceptionA e1){ …){ …}} catchcatch((ExceptionB e2ExceptionB e2){ …){ …}}

Page 213: Argomenti della lezione

215Programmazione ad Oggetti

La clausola “finally”

finally indica le istruzioni che devono essere eseguite comunque Tanto nel caso in cui il codice controllato sia stato eseguito

correttamente Quanto nel caso in cui si sia verificata un’eccezione

trytry{{ … … // codice da controllare// codice da controllare}} catchcatch((Exception eException e){){ … … // gestione dell’anomalia// gestione dell’anomalia}} finallyfinally {{ … … // istruzioni da eseguire// istruzioni da eseguire // in ogni caso // in ogni caso}}

trytry{{ … … // codice da controllare// codice da controllare}} catchcatch((Exception eException e){){ … … // gestione dell’anomalia// gestione dell’anomalia}} finallyfinally {{ … … // istruzioni da eseguire// istruzioni da eseguire // in ogni caso // in ogni caso}}

Page 214: Argomenti della lezione

216Programmazione ad Oggetti

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

Qualunque Qualunque anomalia in anomalia in

questo bloccoquesto bloccodetermina determina

l’interruzione l’interruzione dell’esecuzionedell’esecuzione

Qualunque Qualunque anomalia in anomalia in

questo bloccoquesto bloccodetermina determina

l’interruzione l’interruzione dell’esecuzionedell’esecuzione

1)1)1)1)

Page 215: Argomenti della lezione

217Programmazione ad Oggetti

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

Si confrontaSi confrontail tipo segnalatoil tipo segnalato

con quelli indicaticon quelli indicatinelle clausolenelle clausole

““catch”:catch”:

si selezionasi selezionala primala prima

corrispondenzacorrispondenzatrovatatrovata

Si confrontaSi confrontail tipo segnalatoil tipo segnalato

con quelli indicaticon quelli indicatinelle clausolenelle clausole

““catch”:catch”:

si selezionasi selezionala primala prima

corrispondenzacorrispondenzatrovatatrovata

2)2)2)2)

Page 216: Argomenti della lezione

218Programmazione ad Oggetti

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

Si esegueSi esegueil bloccoil bloccodi codicedi codice

corrispondente:corrispondente:

la segnalazionela segnalazionedell’anomaliadell’anomaliaviene rimossaviene rimossa

Si esegueSi esegueil bloccoil bloccodi codicedi codice

corrispondente:corrispondente:

la segnalazionela segnalazionedell’anomaliadell’anomaliaviene rimossaviene rimossa

3)3)3)3)

Page 217: Argomenti della lezione

219Programmazione ad Oggetti

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

trytry{{ … … … …}} catchcatch((ExcA e1ExcA e1){){ … …} } catchcatch((ExcB e2ExcB e2){){ … …} } finallyfinally {{ … …}}

ComunqueComunquesiano andatesiano andatele cose, vienele cose, viene

eseguito il bloccoeseguito il blocco““finally”,finally”,

se presentese presente

ComunqueComunquesiano andatesiano andatele cose, vienele cose, viene

eseguito il bloccoeseguito il blocco““finally”,finally”,

se presentese presente

4)4)4)4)

Page 218: Argomenti della lezione

220Programmazione ad Oggetti

Problemi

Il codice del blocco catch selezionato dovrebbe ripristinare la coerenza nel sistemaNon è detto sia possibile!

È possibile che si verifichi un’eccezione durante l’esecuzione del blocco catchPuò dare origine ad una struttura di

programmazione alquanto complessaPuò essere indice di cattiva progettazione

Page 219: Argomenti della lezione

221Programmazione ad Oggetti

Gestire le eccezioni

Stampare un messaggio di erroreNon risolve nulla, ma aiuta il debugging

trytry{{ … …}} catchcatch((Exception e1Exception e1){){

e1.e1.printStackTraceprintStackTrace();();}}

trytry{{ … …}} catchcatch((Exception e1Exception e1){){

e1.e1.printStackTraceprintStackTrace();();}}

Page 220: Argomenti della lezione

222Programmazione ad Oggetti

Gestire le eccezioni

Generare una nuova eccezionePermette di aggiungere informazioni sul contesto

in cui si è verificata l’anomalia originale

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ throwthrow new new MyExcMyExc(e1,new Date());(e1,new Date());}}

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ throwthrow new new MyExcMyExc(e1,new Date());(e1,new Date());}}

Page 221: Argomenti della lezione

223Programmazione ad Oggetti

Gestire le eccezioni

Rilanciare la stessa eccezioneAvendo compiuto qualche azione a margine

trytry{{ … …}} catchcatch((Exception Exception e1e1){){ Logger.log(e1.getMessage());Logger.log(e1.getMessage()); throwthrow e1e1;;}}

trytry{{ … …}} catchcatch((Exception Exception e1e1){){ Logger.log(e1.getMessage());Logger.log(e1.getMessage()); throwthrow e1e1;;}}

Page 222: Argomenti della lezione

224Programmazione ad Oggetti

Gestire le eccezioni

Correggere l’anomalia… ...e riprovare l’azione Facendo attenzione ai cicli infiniti

boolean done = false;boolean done = false;do do {{ trytry{ … ; done = true; }{ … ; done = true; } catchcatch((Exception e1Exception e1){){ //correggi l’anomalia …//correggi l’anomalia … } }whilewhile (! done);(! done);

boolean done = false;boolean done = false;do do {{ trytry{ … ; done = true; }{ … ; done = true; } catchcatch((Exception e1Exception e1){){ //correggi l’anomalia …//correggi l’anomalia … } }whilewhile (! done);(! done);

Page 223: Argomenti della lezione

225Programmazione ad Oggetti

Gestire le eccezioniRipristinare uno stato precedente…

…disfacendo eventuali azioni non terminate (rollback)

ContoCorrente a,b; //…ContoCorrente a,b; //…int stato =0;int stato =0;double somma;double somma;try try { {

a.preleva(somma); a.preleva(somma); stato = 1;stato = 1;b.deposita(somma);b.deposita(somma);stato = 2;stato = 2;

}}catchcatch((Exception e1Exception e1){){

if (stato if (stato ==== 1) 1)a.deposita(somma);a.deposita(somma);

}}

ContoCorrente a,b; //…ContoCorrente a,b; //…int stato =0;int stato =0;double somma;double somma;try try { {

a.preleva(somma); a.preleva(somma); stato = 1;stato = 1;b.deposita(somma);b.deposita(somma);stato = 2;stato = 2;

}}catchcatch((Exception e1Exception e1){){

if (stato if (stato ==== 1) 1)a.deposita(somma);a.deposita(somma);

}}

Page 224: Argomenti della lezione

226Programmazione ad Oggetti

Gestire le eccezioni

Interrompere l’esecuzioneDisastro irreparabile!

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ System.System.exitexit(0);(0);}}

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ System.System.exitexit(0);(0);}}

Page 225: Argomenti della lezione

227Programmazione ad Oggetti

Gestire le eccezioni

Non fare nullaLa peggior scelta possibile!Da non fare mai

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ //nessuna azione!//nessuna azione!}}

trytry{{ … …}} catchcatch((Exception e1Exception e1){){ //nessuna azione!//nessuna azione!}}

Page 226: Argomenti della lezione

228Programmazione ad Oggetti

Modellare le eccezioni

Java prevede che un’anomalia sia descritta da un oggetto di tipo ThrowableClasse radice della gerarchia delle eccezioniOffre vari metodi per la gestione dell’anomaliaLe sue sottoclassi modellano diversi tipi di

malfunzionamenti

Page 227: Argomenti della lezione

229Programmazione ad Oggetti

La classe Throwable

String getMessage()Restituisce la stringa che descrive l’anomalia Inizializzata nel costruttore a partire da un

parametrovoid printStackTrace()

Stampa la posizione in cui si è verificata l’eccezione e la sequenza dei metodi chiamanti ad essa relativi

Riporta anche, se disponibili, i riferimenti alle righe, nei file sorgente, in cui si sono verificate le successive invocazioni

Page 228: Argomenti della lezione

230Programmazione ad Oggetti

Tipologie di anomalie

Errori della macchina virtuale Fanno capo alla classe Error Non possono essere recuperati Memoria esaurita, stack overflow, …

Errori di programma Fanno capo alla classe Exception Per lo più, devono essere gestiti in modo esplicito,

dichiarandone l’eventualità nei metodi che li possono generare e utilizzando costrutti di tipo “try”

Alcuni possono capitare pressoché sempre (RuntimeException): non occorre dichiarare esplicitamente la possibilità che si verifichino

Page 229: Argomenti della lezione

231Programmazione ad Oggetti

unrecoverableproblems

‘unchecked’exceptions

‘checked’exceptions

Gerarchia delle eccezioni

ThrowableThrowableThrowableThrowable

ErrorErrorErrorError ExceptionExceptionExceptionException

StackStackOverflowOverflowStackStack

OverflowOverflow

IOExceptionIOExceptionIOExceptionIOException NullPointerNullPointerExceptionException

NullPointerNullPointerExceptionException

RuntimeExceptionRuntimeExceptionRuntimeExceptionRuntimeException

Page 230: Argomenti della lezione

232Programmazione ad Oggetti

Definire nuove eccezioni

È possibile creare classi di eccezioni personalizzateSpesso non contengono nessun metodo né

attributoDi solito, hanno un costruttore anonimo, che

associa all’oggetto una descrizione generica ed un costruttore che accetta una stringa, che permette di dettagliare l’anomalia verificatasi

Page 231: Argomenti della lezione

233Programmazione ad Oggetti

public class MyException public class MyException extends Exception {extends Exception {public public MyExceptionMyException() {() {

super(“MyException”);super(“MyException”);}}public public MyExceptionMyException(String (String ss){){

super(“MyException: ”+s);super(“MyException: ”+s);}}

}}……

throw new MyException(“message”);throw new MyException(“message”);……

public class MyException public class MyException extends Exception {extends Exception {public public MyExceptionMyException() {() {

super(“MyException”);super(“MyException”);}}public public MyExceptionMyException(String (String ss){){

super(“MyException: ”+s);super(“MyException: ”+s);}}

}}……

throw new MyException(“message”);throw new MyException(“message”);……

Esempio

Page 232: Argomenti della lezione

234Programmazione ad Oggetti

Argomenti della lezione

Flussi di datiLettura e scritturaInteragire con

il file systemFile ad accesso

casuale

Page 233: Argomenti della lezione

235Programmazione ad Oggetti

Flussi di dati

Sequenze continue e monodirezionali di informazioni che transitano da un’entità ad un’altra

Attraverso un flusso possono scorrere dati di qualsiasi tipo: Omogenei / eterogenei Semplici / composti

Un programma costituisce la sorgente o la destinazione di un flusso L’altra estremità può essere un altro

programma, il disco, lo schermo o la tastiera, …

Page 234: Argomenti della lezione

236Programmazione ad Oggetti

Classi Java per I/O

Modellano l’interazione di un programma con flussi dati Ingresso o uscita Binari o testuali

Organizzate in una struttura di ereditarietà Le sottoclassi estendono e specializzano le

funzionalità base Fanno capo al package java.io

Page 235: Argomenti della lezione

237Programmazione ad Oggetti

Struttura generale

InputStreamInputStreamInputStreamInputStream OutputStreamOutputStreamOutputStreamOutputStream

ReaderReaderReaderReader WriterWriterWriterWriter

IngressoIngressoIngressoIngresso UscitaUscitaUscitaUscita

BinarioBinarioBinarioBinario

TestualeTestualeTestualeTestuale

Page 236: Argomenti della lezione

238Programmazione ad Oggetti

InputStream

Modella le operazioni di lettura da un flusso binarioOpera su sequenze di byteClasse astratta

Offre metodi per leggere i singoli byteTutti i metodi possono lanciare IOException

Page 237: Argomenti della lezione

239Programmazione ad Oggetti

Metodi principali

int read()Attende il prossimo byte, dopodiché ne

restituisce il valore (0-255)Ritorna -1 se il flusso è terminato

int available()Ritorna il numero di byte leggibili senza attesa

Page 238: Argomenti della lezione

240Programmazione ad Oggetti

Metodi principali

long skip(long n) Scarta i prossimi “n” byte dal flusso, se

esistono Ritorna il numero di caratteri scartati

void close() Chiude il flusso e rilascia le risorse di sistema

associate Occorre ricordarsi di chiamarlo!

Page 239: Argomenti della lezione

241Programmazione ad Oggetti

Sorgenti

InputStream offre funzionalità minimali: Non indica da dove provengano i dati letti

Sottoclassi “sorgente” Modellano la lettura di byte da supporti specifici File, array di byte, StringBuffer, …

Page 240: Argomenti della lezione

242Programmazione ad Oggetti

FileInputStream

Permette di leggere il contenuto di un fileParametro del costruttoreDeve esistere ed essere leggibile

Lettura sequenzialeDall’inizio alla fine

Page 241: Argomenti della lezione

243Programmazione ad Oggetti

FileInputStream fis;FileInputStream fis;

String filename= “prova.dat”;String filename= “prova.dat”;

try {try {

fisfis= new= new FileInputStreamFileInputStream(filename);(filename);

int i;int i;

while ( (i=while ( (i=fis.read()fis.read()) != ) != -1-1) {) {

byte b= (byte) i; byte b= (byte) i;

//Opera sul dato…//Opera sul dato…

}}

} finally {} finally { fis.close(); fis.close(); }}

FileInputStream fis;FileInputStream fis;

String filename= “prova.dat”;String filename= “prova.dat”;

try {try {

fisfis= new= new FileInputStreamFileInputStream(filename);(filename);

int i;int i;

while ( (i=while ( (i=fis.read()fis.read()) != ) != -1-1) {) {

byte b= (byte) i; byte b= (byte) i;

//Opera sul dato…//Opera sul dato…

}}

} finally {} finally { fis.close(); fis.close(); }}

Esempio

Page 242: Argomenti della lezione

244Programmazione ad Oggetti

Filtri

InputStream offre funzionalità minimali: Permette solo di leggere byte

Classi “filtro” Arricchiscono le funzionalità o le prestazioni,

interponendosi ad altre sorgenti o filtri

Page 243: Argomenti della lezione

245Programmazione ad Oggetti

Classi filtro

Richiedono un InputStream da cui prelevare i dati Deve essere passato nel costruttore

Trasformano i dati letti da tale flusso Conversione di formato, memoria tampone,

reinserimento, …

Page 244: Argomenti della lezione

246Programmazione ad Oggetti

BufferedInputStream bis;BufferedInputStream bis;bis=new BufferedInputStream(bis=new BufferedInputStream(

new FileInputStream(“file.dat”)new FileInputStream(“file.dat”) ););byte b=bis.read(); b=bis.read();byte b=bis.read(); b=bis.read();

BufferedInputStream bis;BufferedInputStream bis;bis=new BufferedInputStream(bis=new BufferedInputStream(

new FileInputStream(“file.dat”)new FileInputStream(“file.dat”) ););byte b=bis.read(); b=bis.read();byte b=bis.read(); b=bis.read();

FileFileInputStreamInputStream

FileFileInputStreamInputStream

read()read()……read()read()……

FileFile

Classi filtro

Page 245: Argomenti della lezione

247Programmazione ad Oggetti

BufferedInputStream bis;BufferedInputStream bis;bis=new BufferedInputStream(bis=new BufferedInputStream(

new FileInputStream(“file.dat”)new FileInputStream(“file.dat”) ););byte b=bis.read(); b=bis.read();byte b=bis.read(); b=bis.read();

BufferedBufferedInputStreamInputStreamBufferedBuffered

InputStreamInputStream

read()read()……read()read()……

FileFileInputStreamInputStream

FileFileInputStreamInputStream

read()read()……read()read()……

byte[]byte[]byte[]byte[]

FileFileisis

bufbuf

countcount

Classi filtro

Page 246: Argomenti della lezione

248Programmazione ad Oggetti

BufferedInputStream bis;BufferedInputStream bis;bis=new BufferedInputStream(bis=new BufferedInputStream(

new FileInputStream(“file.txt”)new FileInputStream(“file.txt”) ););byte b=bis.read(); b=bis.read();byte b=bis.read(); b=bis.read();

BufferedBufferedInputStreamInputStreamBufferedBuffered

InputStreamInputStream

read()read()……read()read()……

FileFileInputStreamInputStream

FileFileInputStreamInputStream

read()read()……read()read()……

byte[]byte[]byte[]byte[]

FileFileisis

bufbuf

countcount

Classi filtro

Page 247: Argomenti della lezione

249Programmazione ad Oggetti

BufferedInputStream bis;BufferedInputStream bis;bis=new BufferedInputStream(bis=new BufferedInputStream(

new FileInputStream(“file.txt”)new FileInputStream(“file.txt”) ););byte b=bis.read(); b=bis.read();byte b=bis.read(); b=bis.read();

BufferedBufferedInputStreamInputStreamBufferedBuffered

InputStreamInputStream

read()read()……read()read()……

FileFileInputStreamInputStream

FileFileInputStreamInputStream

read()read()……read()read()……

byte[]byte[]byte[]byte[]

FileFileisis

bufbuf

countcount

Classi filtro

Page 248: Argomenti della lezione

250Programmazione ad Oggetti

Composizione

Il meccanismo dei filtri è molto flessibilePiù filtri possono essere concatenati (in che

ordine?)Si possono costruire oggetti con tutte e sole le

funzionalità richieste

Page 249: Argomenti della lezione

251Programmazione ad Oggetti

InputInputStreamStreamInputInput

StreamStream

ByteArrayByteArrayInputStreamInputStreamByteArrayByteArrayInputStreamInputStream

FileFileInputStreamInputStream

FileFileInputStreamInputStream

FilterFilterInputStreamInputStream

FilterFilterInputStreamInputStream

BufferedBufferedInputStreamInputStreamBufferedBuffered

InputStreamInputStream

SequenceSequenceInputStreamInputStreamSequenceSequenceInputStreamInputStream

StringBufferStringBufferInputStreamInputStream

StringBufferStringBufferInputStreamInputStream

DataDataInputStreamInputStream

DataDataInputStreamInputStream

PushbackPushbackInputStreamInputStreamPushbackPushbackInputStreamInputStream

Gerarchia di ereditarietà

Page 250: Argomenti della lezione

252Programmazione ad Oggetti

OutputStream

Modella le operazioni di scrittura su un flusso binarioClasse astratta

Offre metodi per scrivere i singoli byteTutti i metodi possono lanciare IOException

Page 251: Argomenti della lezione

253Programmazione ad Oggetti

Metodi principali

void write(int b)Scrive il valore b (troncato ad 8 bit) sul flusso

void flush()Forza l’invio effettivo di byte temporaneamente

accodati all’interno dell’oggettovoid close()

Chiude il flusso e rilascia le risorse di sistema associate

Una volta chiuso, il flusso non può essere riaperto né può ricevere ulteriori dati

Occorre ricordarsi di chiamarlo

Page 252: Argomenti della lezione

254Programmazione ad Oggetti

Destinazioni

Anche OutputStream offre funzionalità minimali: Non indica dove scrivere i dati letti

Sottoclassi “destinazione” Modellano la scrittura di byte su supporti

specifici File, array di byte, …

Page 253: Argomenti della lezione

255Programmazione ad Oggetti

FileOutputStream

Permette di scrivere un file Parametro del costruttore Può non esistere Occorre poterlo creare / modificare (diritto di

scrittura)

Scrittura sequenziale Dall’inizio alla fine Il contenuto precedente viene cancellato

Page 254: Argomenti della lezione

256Programmazione ad Oggetti

FileOutputStream fos;FileOutputStream fos;

String filename= “prova.dat”;String filename= “prova.dat”;

try {try {

fosfos= new= new FileOutputStreamFileOutputStream(filename);(filename);

//Esempio di scrittura…//Esempio di scrittura…

for (int i=0; i<=255; i++) for (int i=0; i<=255; i++)

fos.write( (byte) i);fos.write( (byte) i);

} finally {} finally { fos.close(); fos.close(); }}

FileOutputStream fos;FileOutputStream fos;

String filename= “prova.dat”;String filename= “prova.dat”;

try {try {

fosfos= new= new FileOutputStreamFileOutputStream(filename);(filename);

//Esempio di scrittura…//Esempio di scrittura…

for (int i=0; i<=255; i++) for (int i=0; i<=255; i++)

fos.write( (byte) i);fos.write( (byte) i);

} finally {} finally { fos.close(); fos.close(); }}

Esempio

Page 255: Argomenti della lezione

257Programmazione ad Oggetti

Filtri

Insieme di classi che estendono le capacità di OutputStream Inserimento di un buffer Scrittura di dati elmentari ed oggetti Scrittura di sequenze di caratteri ASCII

Page 256: Argomenti della lezione

258Programmazione ad Oggetti

OutputOutputStreamStreamOutputOutputStreamStream

ByteArrayByteArrayOutputStreamOutputStreamByteArrayByteArray

OutputStreamOutputStream

FileFileOutputStreamOutputStream

FileFileOutputStreamOutputStream

FilterFilterOutputStreamOutputStream

FilterFilterOutputStreamOutputStream

BufferedBufferedOutputStreamOutputStream

BufferedBufferedOutputStreamOutputStream

ObjectObjectOutputStreamOutputStream

ObjectObjectOutputStreamOutputStream

PipedPipedOutputStreamOutputStream

PipedPipedOutputStreamOutputStream

DataDataOutputStreamOutputStream

DataDataOutputStreamOutputStream

PrintPrintStreamStreamPrintPrint

StreamStream

Gerarchia di ereditarietà

Page 257: Argomenti della lezione

259Programmazione ad Oggetti

Reader & Writer

Classi duali di InputStream e OutputStream Modellano operazioni su flussi di caratteri

UNICODE Classi astratte Rispetto ai flussi binari, cambiano i tipi dei

parametri

Page 258: Argomenti della lezione

260Programmazione ad Oggetti

ReaderReaderReaderReader

CharArrayCharArrayReaderReader

CharArrayCharArrayReaderReader

BufferedBufferedReaderReader

BufferedBufferedReaderReader

InputStreamInputStreamReaderReader

InputStreamInputStreamReaderReader

FilterFilterReaderReaderFilterFilterReaderReader

StringStringReaderReaderStringStringReaderReader

FileFileReaderReaderFileFile

ReaderReader

Gerarchia di ereditarietà

Page 259: Argomenti della lezione

261Programmazione ad Oggetti

WriterWriterWriterWriter

CharArrayCharArrayWriterWriter

CharArrayCharArrayWriterWriter

BufferedBufferedWriterWriter

BufferedBufferedWriterWriter

OutputStreamOutputStreamWriterWriter

OutputStreamOutputStreamWriterWriter

PrintPrintWriterWriterPrintPrintWriterWriter

StringStringWriterWriter

StringStringWriterWriter

FileFileWriterWriterFileFile

WriterWriter

Gerarchia di ereditarietà

Page 260: Argomenti della lezione

262Programmazione ad Oggetti

Codifica dei caratteri

Un carattere UNICODE è rappresentato su 16 bit Esistono vari modi per trasformarlo in una

sequenza di byte InputStreamReader e OutputStreamWriter

hanno, all’interno, il codice necessario alla conversione in byte Nel costruttore si può indicare la codifica da

adottare

Page 261: Argomenti della lezione

263Programmazione ad Oggetti

Leggere da console

BufferedReader br;BufferedReader br;

try {try {

brbr= new= new BufferedReaderBufferedReader((

newnew InputStreamReaderInputStreamReader(System.in)(System.in)

););

String s=String s=brbr..readLinereadLine();();

… …

} finally {} finally { brbr..closeclose(); }(); }

BufferedReader br;BufferedReader br;

try {try {

brbr= new= new BufferedReaderBufferedReader((

newnew InputStreamReaderInputStreamReader(System.in)(System.in)

););

String s=String s=brbr..readLinereadLine();();

… …

} finally {} finally { brbr..closeclose(); }(); }

Page 262: Argomenti della lezione

264Programmazione ad Oggetti

La classe File

Modella il nome di file e cartelle in modo indipendente dal sistema operativo: Il file corrispondente può non esistere Permette di creare, cancellare, rinominare, … file e

cartelle

Page 263: Argomenti della lezione

265Programmazione ad Oggetti

Creazione e cancellazione

boolean createNewFile();boolean mkdir();boolean renameTo(File dest);boolean delete();void deleteOnExit();

Page 264: Argomenti della lezione

266Programmazione ad Oggetti

Proprietà di un file

boolean canRead(); boolean canWrite(); boolean isDirectory(); boolean isFile(); File getParentFile(); long length(); String[] list();

Page 265: Argomenti della lezione

267Programmazione ad Oggetti

Ulteriori funzionalità

static File[] listRoots(); Elenca le possibili radici del filesystem corrente

(“a:”, “c:”, …)

static String separator; Indica il carattere che separa il nome di cartelle

e file (‘\’ o ‘/’)

Page 266: Argomenti della lezione

268Programmazione ad Oggetti

Esempio

File dir= new File(“c:\”, “temp”);File dir= new File(“c:\”, “temp”);boolean b;boolean b;if (!dir.exists())if (!dir.exists())

b=dir.mkdir();b=dir.mkdir();else else

b=dir.isDirectory();b=dir.isDirectory();if (b) {if (b) {

String[] nomi= dir.list();String[] nomi= dir.list();//…//…

}}

File dir= new File(“c:\”, “temp”);File dir= new File(“c:\”, “temp”);boolean b;boolean b;if (!dir.exists())if (!dir.exists())

b=dir.mkdir();b=dir.mkdir();else else

b=dir.isDirectory();b=dir.isDirectory();if (b) {if (b) {

String[] nomi= dir.list();String[] nomi= dir.list();//…//…

}}

Page 267: Argomenti della lezione

269Programmazione ad Oggetti

File ad accesso casuale

In alcune situazioni occorre operare su un file, procedendo in modo non sequenziale Lettura e scrittura possono avvenire in qualsiasi posizione

del file indipendentemente dall’operazione precedente

La classe RandomAccessFile modella il file come fosse un array di byte Memorizzato su disco, invece che in memoria Mantiene un puntatore di posizione interno che tiene

traccia del prossimo byte a cui accedereo Modificabile dal programmatore

È possibile operare sia in lettura che in scritturao Si specifica in fase di costruzione

Page 268: Argomenti della lezione

270Programmazione ad Oggetti

File ad accesso casuale

File

RandomAccessFileRandomAccessFile

FileFile

pospos

Posizione in cui avverràla prossima operazione

read( )write( )seek( pos )…

DataInput DataOutput

Page 269: Argomenti della lezione

271Programmazione ad Oggetti

Operare in lettura void seek(long pos)

Posiziona il puntatore interno a pos byte dall’inizio del file long getFilePointer( )

Restituisce la posizione corrente del puntatore interno rispetto all’inizio del file

String readLine( ) Legge una sequenza di caratteri ASCII terminata da newline e la

converte in formato Unicode String readUTF( )

Legge una sequenza di caratteri Unicode codificati nel formato UTF-8 (che contiene la lunghezza della stringa)

Altri metodi dell’interfaccia DataInput Permettono di leggere tipi elementari (numeri interi, numeri in

virgola mobile, caratteri e booleani)

Page 270: Argomenti della lezione

272Programmazione ad Oggetti

Operare in scrittura

void writeBytes(String s) Scrive la sequenza di byte meno significativi corrispondenti

ai caratteri contenuti in “s”

void writeChars(String s) Scrive la sequenza di caratteri (due byte ciascuno)

contenuti in “s”

void writeUTF(String s) Scrive la rappresentazione della stringa “s” nel formato

UTF-8

Altri metodi dell’interfaccia DataOutput Permettono la scrittura di dati elementari