Upload
others
View
14
Download
1
Embed Size (px)
Citation preview
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 1
Il linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 2
Sgomberiamo il campo dai dubbi
• Cosa non è Java:– Non è un linguaggio per “animare” il WWW
– Non è una versione ridotta del C++
– Non è lo strumento che segnerà la fine di Microsoft
• Cosa è Java– Un moderno linguaggio di programmazione OO…
– Orientato alla programmazione di applicazioni “network-centric”
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 3
Perché Java
• Il problema:– L’inadeguatezza dello schema di sviluppo tradizionale
(binary distribution) in ambienti distribuiti e multi-piattaforma
• La soluzione:– Java, un linguaggio O.O. per lo sviluppo di
applicazioni “architecture independent” , robuste, adattabili , scalabili ed eff icienti
Gianpaolo Cugola 4
Java: caratteristiche generali - 1
• Familiare:– La sintassi di Java ricalca la sintassi del C++
– Un programmatore C++ non incontra grosse diff icoltà ad imparare il li nguaggio Java
• Semplice:– Programmare usando Java è molto più semplice di
programmare usando altri linguaggi OO (C++) • Un buon programmatore Java è più produttivo di un buon
programmatore C++
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 5
Java: caratteristiche generali - 2
• Object-oriented:– Java è un linguaggio OO “puro” con ereditarietà, binding
dinamico ed oggetti gestiti tramite riferimenti
– Il costrutto delle “ interfaces” fornisce le potenzialità dell’ereditarietà multipla senza alcun problema di duplicazione di codice
• Portabile:– La specifica del linguaggio non contiene componenti
“ implementation dependent”
Gianpaolo Cugola 6
Java: caratteristiche generali - 3
• Architecture neutral:– L’applicazione viene compilata in un linguaggio intermedio
(Java ByteCode) che viene interpretato
– L’interprete nasconde le caratteristiche peculiari dell’hardwaree del sistema operativo
– Lo stesso codice “oggetto” può essere eseguito su tutte le piattaforme per le quali venga fornito un interprete Java (attualmenteSolaris, WindowsNT/ 95, MacOS, OS/ 2, AIX, eLinux)
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 7
Java: caratteristiche generali - 4
• Dinamico:– Le fasi di loading e linking avvengono arun-time
• Robusto:– Java è un linguaggio fortemente tipizzato con numerose
caratteristiche che diminuiscono la possibili tà di introdurre errori nelle applicazioni, tra le quali:
• assenza di puntatori
• abbondanza di controlli run-time (rispetto dei limiti degli array, controlli di tipo, controlli sul codice caricato dinamicamente,ecc.)
• gestione automatica della memoria (garbage collecting)
Gianpaolo Cugola 8
Java: caratteristiche generali - 5
• Multi-threaded:– Java supporta la gestione dei “ thread” a livello di linguaggio,
oltre che di macchina virtuale, fornendo la possibili tà di creare facilmente applicazioni concorrenti
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 9
L’ambiente Java
Java Source
Java Compiler
Java ByteCode
Byte Code movesthrough network
or file system
Byte codeLoader
Byte codeVerifier
Interpreter
Run time
Machine CodeGenerator (JIT)
Hardware/OS
Gianpaolo Cugola 10
Java - il primo programma
fil e: HelloWorld.java
public class HelloWorld {
public static void main ( String args []){
System .out. println (“ Hello world !”);
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 11
Compilazione ed esecuzione
c: \ classes >ja vac HelloW or ld . java
c: \ classes >ja va HelloWo rl d
HelloWorld !
c: \ classes >
Gianpaolo Cugola 12
La struttura di un programma Java -nozioni preliminari
• Un programma Java è organizzato come un insieme di classi
• Classi diverse possono essere raggruppate all’interno della stessa “Compilation unit”
• I l programma principale è rappresentato da un metodo speciale della classe il cui nome coincide con il nome del programma
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 13
Java - il primo programma grafico
File: HelloWorldWindow.java
i mpor t j ava. awt . * ;
package ex ample s,
c l ass H ell oWorl dWi ndow {
publ i c st at ic v oid ma i n( St r i ng ar gs[ ] ) {
Fr ame f =new Fr ame(" Hel lo Wor ld Wi ndow" );
f . add( new Label ( " Hel l oWor l d!" , Label . CENTER) , " Cent er " ) ;
f . pack ( ) ;
f . setV i si bl e( t ru e) ;
}
}
Gianpaolo Cugola 14
Compiliazione ed esecuzione
c: \ classes >cd examples
c: \ classes \ examples >javac HelloWorldWindow . java
c: \ classes \ examples >cd ..
c: \ classes >java examples . Hel loWor l dWindow
c: \ classes >
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 15
La struttura di un programma Java
• Package– Ogni packagecontiene una o più compilation unit
– Il package introduce un nuovo ambito di visibilità dei nomi
• Compilation unit– Ogni compilation unit contiene una o più classi o interfaccie
delle quali una sola pubblica
• Classi e interfaccie
• Relazioni con il filesystem– package⇔ directory
– compilation unit ⇔ file
Gianpaolo Cugola 16
Il linguaggio Java in dettaglio
• Costrutti per la programmazione “ in the small”– Il type system di Java
• Tipi predefiniti e relative costanti ed operatori
• Tipi definiti dall’utente
– Dichiarazione di variabili
– Istruzioni per il controllo di flusso
• Costrutti per la programmazione “ in the large”– Classi
– Interfaccie
– Packages
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 17
I commenti in Java
/ / qu est o è u n commento c he t er mina co n l a f i ne de l l a l i nea
/ * qu est o è u n commento c he può
spazi ar e s u pi ù l i nee * /
Gianpaolo Cugola 18
Identificatori
• Gli identificatori (nomi di classi, variabili, attributi, metodi ecc.) sono sequenze alfanumeriche che: – Devono iniziare con una lettera o con il carattere '_'
– Il resto dell’identificatorepuò contenere sia lettere che numeri, o il carattere '_'
– Non devono coincidere con una delle parole riservate
• EsempiOk: HelloWorld helloWorld h ello _world __prova _ _PROVA prova1
prova1a prova2
Errati: 2prova +prova prova + hello - world hello ? pr ova - 1
• Java è “case sensitive”
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 19
Le costanti
• Costanti intere:123 256789L 0xff34d 0xcafebabeL 03477 07352367L
• Costanti reali:123.75 0.12375e+3 1.0E - 5 123.75f 123.75F 123.75D
12375.0e - 2f
• Costanti boolean:true false
• Costanti carattere:’a’ ’%’ ’ \ t’ ’ \ n’ ’ \ \ ’ ’ \ ’’ ’ \ 123’
• Costanti di tipo stringa:”prova” ”prova \ n” ”prova( \ ” aaa \ ” )”
Gianpaolo Cugola 20
Il tipe system di Java
• Java è un linguaggio fortemente tipizzato
• Distinguiamo tra:– tipi primitivi
– tipi “ riferimento”
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 21
I tipi primitivi
• Tipi numerici:– byte : 8 bit– short : 16 bit– int : 32 bit– long : 64 bit– float : 32 bit, secondo specifica IEEE754– double : 64 bit, secondo specifica IEEE754
• Altri tipi:– boolean : trueo false– char : 16 bit, carattereUnicode
Gianpaolo Cugola 22
Operatori per i tipi numerici - 1
• Operatori unari– operatori “di segno”
+x - x
– incremento e decremento (prefissi e/ o postfissi)++x -- x x++ x --
– operatore di complemento binario (valido per soli tipi “ interi” ): ~x
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 23
Operatori per i tipi numerici - 2
• Operatori binari– validi per tutti i tipi numerici
x+y x - y x*y x/y x%y
– validi per i soli tipi “ interi”x<<y x>>y x>>>y x&y x|y x^y
• Operatori di confrontox==y x!=y x<y x>y x <=y x>=y
Gianpaolo Cugola 24
Operatori per il tipo boolean
• Operatoreunario– negazione logica: !x
• Operatori binari– operatori standard
x&y x|y x^y
– operatori con semantica condizionalex&&y x||y
– operatori di confrontox==y x!=y
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 25
Operatori per il tipo char
• Operatori di confrontox==y x!=y x<y x> y x<=y x>=y
Gianpaolo Cugola 26
Gli operatori di auto assegnamento
• E` possibile usare l’operatore:x ?= y
al posto di un qualsiasi operatore ? che sia lecito utili zzare nell’espressione:x=x?y
• Tale espressione equivale alla precedente x?=y
• Esempi:x+=5 equivale a x=x+5
x*= 2 equivale a x=x*2
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 27
Altri operatori
• Operatore condizionale– si applica a tutti i tipi
<condizione> ? <valore1> : <valor e2>
• L’assegnamento come operatorex=y=3 (y=3) ==3
• L’operatore di concatenazione tra stringhe– si applica a tutti i tipi
” pippo ”+2 ” pippo ”+2.54
Gianpaolo Cugola 28
I tipi riferimento
• Tipi array
• Tipi definiti dall’utente
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 29
Tipo array
• Dato un tipo T (predefinito o definito dall’utente) un array di T è definito come:T[]
• Similmente sono dichiarati gli array multidimensionali:T[][] T[][] [ ] …
• Esempi:int [] float [ ] [] Pers ona[]
Gianpaolo Cugola 30
Tipi definiti dall’utente
• Classi
• Interfaccie
... i dettagli nel seguito
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 31
Dichiarazione e inizializzazione di variabili
• Dichiarazioneint i;
int i,j;
Persona p;
float f1,f2;
double d;
• Inizializzazioneint i=0;
int i=0, j=4;
Persona p= new Persona();
float f1=1.23f, f2=127.2f;
double d=1.23;
Gianpaolo Cugola 32
Dichiarazione e inizializzazione di variabili: gli array
• Dichiarazione:int [] ai1, ai2;
float [] af1;
double ad[];
Persona[][] ap;
• Inizializzazione:int [] ai={1,2,3};
double [][] ad={{1.2, 2.5}, { 1.0, 1.5}}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 33
Dichiarazione di array ed allocazione di memoria
• La dichiarazione di un array non alloca spazio per gli elementi dell’array
• L’allocazione si realizza dinamicamente tramite l’operatorenewi nt [] i =new i nt [ 10], j ;
f l oat [ ] [ ] f =new f l oat [1 0] [ 10];
Per sona[ ] p=new Pers ona[ 30] ;
j =new i nt [ 30] ;
che alloca però solo lo spazio per l’array, non per i suoi elementi (tranne nel caso di tipi predefiniti).
Gianpaolo Cugola 34
Istruzioni per il controllo del flusso
• Sequenza di istruzioni
• Blocco di istruzioni
• Istruzione condizionale
• Cicli– Ciclo con uscita all’inizio
– Ciclo con uscita alla fine
– Ciclo con uscita in mezzo
– Ciclo con contatore
• Istruzione switch
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 35
Sequenza e blocco
• Una sequenza di istruzioni è composta da una serie di istruzioni separate dal carattere ‘;’
a=3; b=4; c=a*b+3;
• Un blocco di istruzioni è composto da una sequenza di istruzioni racchiuse da parentesi graffe
{a=1; b=3; c=a+128;}
– Un blocco di istruzioni èequivalente ad una singola istruzione
Gianpaolo Cugola 36
Istruzione condizionale
• Permette la scelta tra due diversi percorsi del flusso di controllo
• Sintassiif (<condizione>) < istruz .1>
[else < istruz .2>]
• Il ramo else si lega all’istruzione if più vicina
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 37
Istruzione condizionale: esempi
• Esempio 1:i f ( x==5) Syst em. out. pri nt l n( “ x va l e 5” );
Syste m. out . pr in t l n(“ f at t o! ”) ;
• Esempio 2:i f ( x>0 & & y>0) Syste m.o ut . pr i nt ln ( “ x ed y posi t i vi ” ) ;
el se i f ( x>0) Syst em. out . pr in t l n(“ x p os i t i vo ” ) ;
el se i f ( y>0) Syst em. out . pr in t l n(“ y p os i t i vo ” ) ;
el se Syste m. out . pr in t ln ( “ nessuno dei due po si t i v i” );
Syste m. out . pr in t l n(“ f at t o! ”) ;
Gianpaolo Cugola 38
Istruzione condizionale: esercizio
• Si scriva un programma che legge un intero su riga di comando corrispondente ad un mese e restituisce il numero di giorni in quel mese– Si faccia uso dell’istruzione:
Integer . parseInt (< string >)
che restituisce un intero a partire da una stringa
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 39
Ciclo con condizione all’inizio
• Sintassi:while (<condiz i one>) <i struzi one> ;
• Esempioint r=5;
while (r>0) {
System .out. println (“ HelloWo r ld !”) ;
r -- ;
}
Gianpaolo Cugola 40
Ciclo con condizione all’inizio: esercizio
• Si scriva un programma per il calcolo del fattoriale
• Si scriva un programma che legge un intero da riga di comando e stampa a video un “ triangolo” formato da ‘*’ con base di lunghezza pari all’intero letto– Si osservi che l’istruzione:
System .out. print (< string >)
stampa la stringa passata come parametro senza andare a capo
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 41
Ciclo con condizione alla fine
• Sintassi:do <istruzion e> while ( <condi zione>)
• Esempio:int r=5;
do {
System .out. println (" Hello World ! " );
r -- ;
} while (r>0);
Gianpaolo Cugola 42
Ciclo con condizione alla fine: esercizio
• Si scriva un programma che esegue il prodotto tra due numeri secondo l’algoritmo delle somme ripetute. Si faccia uso del ciclo con condizione alla fine
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 43
Ciclo con condizione in mezzo
• E` possibile uscire da un ciclo tramite l’istruzione break
– Sfruttando questo fatto è possibile creare cicli con condizione di terminazione in mezzo
• Esempio:java .io. FileInputStream s=new FileInputStream (“a”);
while ( true ) {
b=s. read ();
if (b==0) break;
System .out. println (b);
}
Gianpaolo Cugola 44
Ciclo con condizione in mezzo: esercizio
• Si scriva un programma che legge un file byte a byte salvando il contenuto in un array di 500 byte. I l programma deve terminare quando la fine del file è stata raggiunta o quando si sono letti 500 byte– Si osservi che l’istruzione:
s. read ()
applicata ad un File I nputStrea m s restituisce -1 quando si è raggiunta la fine del file.
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 45
Ciclo con contatore
• Sintassi:for (<istr1>; < condiz >; <ist r 2>) < i str3>
• Equivalente a:<istr1>;
while (< condiz >) {
<istr3>
<istr2>
}
Gianpaolo Cugola 46
Ciclo con contatore: esempi
• Esempio 1:i nt r ;
f or (r =0; r <5; r ++)
Sys t em.o ut . pr i nt ln ( “ Hel l oWor l d! ” ) ;
• Esempio 1 bis:f or ( i nt r= 0; r< 5; r+ +)
Sys t em.o ut . pr i nt ln ( “ Hel l oWor l d! ” ) ;
• Esempio 2:f or ( i nt r= 0; r< 10; r +=2)
Sys t em.o ut . pr i nt ln ( “r =” +r) ;
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 47
Ciclo con contatore: esercizio
• Si scriva un programma che stampa a video le tabelline (da 1 a 10). Si faccia uso del ciclo con contatore
Gianpaolo Cugola 48
Ancora sull’istruzione break
• Sintassi completa di un istruzione break :– break [< label >]
• Significato:– restituisce il controllo all’istruzione che include quella con il break e che è
marcata con l’identificatore specificato
• Esempio:ciclo1 : while ( true ) {
ciclo2 : while ( true ) {
leggi(x);
if (x==1) break ciclo1;
else break ciclo2;
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 49
Istruzione switch
• Sintassi:switch (<espressione>) {
case < espr _cost _1> : [< is t r _1>; ] *
case < espr _cost _2> : [< is t r _2>; ] *
...
case < espr _cost _n> : [< is t r _n>; ] *
[ default : [< istr >;]* ]
}
• L’espressione all’interno dello swit ch deve essere di tipo char , byte , short , o int
Gianpaolo Cugola 50
Istruzione switch : esempio
publi c c la ss Pr ova {
sta t i c publ ic void ma i n( St r i ng[ ] arg s) {
i nt x=I nt eger . par se I nt ( ar gs[0 ] ) ;
swi t ch( x) {
case 1 :
case 2 :
case 3 : Syst em. out . pri nt l n( “ x pa r i a 1, 2 o 3” ) ;
br eak;
case 4 : Syst em. out . pri nt l n( “ x pa r i a 4” );
br eak;
defa ul t : Syste m.o ut . pr i nt ln ( “ x di vers o d a 1, 2, 3 o 4 ” ) ;
}
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 51
Istruzione switch : esercizio
• Si scriva un programma che legge un intero su riga di comando corrispondente ad un mese e restituisce il numero di giorni in quel mese. Si usi l’istruzione switch
Gianpaolo Cugola 52
Conversioni automatiche di tipo
• Promozionibyte - > short, int , long, float , double
short - > int , long, float , double
int - > long, float , double
long - > float or double
float - > double
char - > int , long, float , double
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 53
Conversioni forzate: casting
• È possibile forzare una conversione di tipo attraverso l’operatore di casting:(<tipo>)<espressione>
• Tra tipi semplici sono consentite le seguenti conversioni (con perdita di informazione)short - > byt e, char
char - > byt e, s hor t
i nt - > byt e, s hor t , char
l ong - > byt e, s hor t , char , i nt
f l oat - > byt e, s hor t , char , i nt , l ong
doubl e - > byt e, s hor t , char , i nt , l ong, f lo at
byt e - > char
Gianpaolo Cugola 54
I costrutti OO per la programmazione “in the large”
• Classi
• Interfaccie
• Ereditarietà
• Polimorfismo e binding dinamico
• Packages
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 55
Definizione di una nuova classe
• Una nuova classe viene definita nel seguente modo:class <nome classe> {
<lista di definizioni di attributi e metodi>
}
• Esempio:class Automobile {
...
}
Gianpaolo Cugola 56
Definizione di attributi
• Gli attributi di una classe definiscono la struttura dello stato degli oggetti che vi appartengono
• Ogni attributo è definito usando la stessa sintassi usata per la definizione delle variabili l ocali
• Esempioclass Automobile {
String colore, marca, modello;
int cilindrata, numPorte ;
boolean accesa;
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 57
Definizione di metodi
• I metodi di una classe definiscono il comportamento degli oggetti che vi appartengono
• Ogni metodo è definito come segue:<tipo val . rit .> <nome.>([<dic. par. formali>])
<corpo>
• I l tipo void viene utili zzato per metodi che non ritornano alcun valore
Gianpaolo Cugola 58
Definizione di metodi: esempio
class Automobile {
String colore, marca, modello;
int cilindrata, numPorte ;
boolean accesa;
void accendi() {accesa= true ;}
boolean puoPartire () { return accesa;}
void dipingi( String col) {colore=col;}
void trasforma( String ma, String mo ) {
marca=ma;
modello= mo;
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 59
Visibilità dei nomi
• I nomi degli attributi e dei metodi sono visibili all’interno di tutta la classe
• Le variabili dichiarate in un blocco sono visibili solo all’interno del blocco
• Le variabili l ocali ad un metodo (o i parametri formali) possono mascherare gli attributi
• Le variabili dichiarate all’interno di un blocco possono mascherare le variabili dichiarate all’interno di blocchi più esterni
Gianpaolo Cugola 60
Oggetti
• Ogni variabile il cui tipo sia una classe (o un interfaccia) contiene un riferimento ad un oggetto
• Nuovi oggetti sono costruiti usando l’operatore new
• Esempio:Automobile a= new Automobile ( );
• Ad una variabile di tipo riferimento può essere assegnato il riferimento null
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 61
Accesso ad attributi e metodi di un oggetto
• L’accesso ad attributi e metodi di un oggetto per il quale si abbia un riferimento si effettua tramite la “notazione punto”
• Esempio:Automobile a= new Automobile();
a.accendi();
a.dipingi(“Blu”);
System .out. println (“ Num. porte: “+a. numPorte );
Gianpaolo Cugola 62
Accesso ad attributi e metodi di un oggetto da metodi dello stesso oggetto
• Nella definizione di un metodo ci si riferisce ad attributi e metodi dell’oggetto sul quale il metodo sia stato invocato direttamente(senza notazione punto)
• Esempiocl ass Auto mobil e {
. . .
bool ean puoPar t i re ( ) { r etu r n accesa; }
voi d dip i ngi( St r in g col ) { col or e=col ;}
. . .
}
• La pseudo-variabile this contiene un riferimento all’oggetto corrente e può essere utilizzata per aggirare eventuali mascheramenti
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 63
La pseudo-variabile this : esempio
class Automobile {
String colore, marca, modello;
int cilindrata, numPorte ;
boolean accesa;
void accendi() {accesa= true ;}
boolean puoPartire () { return accesa;}
void dipingi( String col) { this .colore=col;}
void trasforma( String marca, String modello) {
this .marca=marca;
this .modello=modello;
}
}
Gianpaolo Cugola 64
Classi: esercizio
• Si definisca l’insieme di classi necessarie per descrivere un computer (Monitor, Tastiera, Mouse, Case, Scheda)
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 65
Passaggio parametri
• I parametri il cui tipo sia uno dei tipi semplici sono passati per copia
• I parametri il cui tipo sia un tipo riferimento (classi, interfacce e array) sono passati per copia del riferimento– ovvero, gli oggetti sono passati per riferimento
Gianpaolo Cugola 66
Overloading
• All’interno di una stessa classe possono esservi più metodi con lo stesso nome purché si distinguano per numero e/ o tipo dei parametri– Il tipo del valore di ritorno non basta a distinguere due metodi
• Esempio:class C {
int f() {...}
int f( int x) {...} // corretto
void f( int x) {...} // errato
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 67
Creazione e distruzione di oggetti
• La creazione di un oggetto comporta due operazioni:– l’allocazione della memoria necessaria a contenere l’oggetto e
– l’inizializzazione dello spazio allocato
Quest’ultima operazione è svolta dal costruttore
• A differenza del C++ in Java non è necessario deallocare esplicitamente gli oggetti creati con una operazione new. Di ciò si occupa il garbage collector
Gianpaolo Cugola 68
Costruttori
• Nella definizione di una classe è possibile specificare uno o più costruttori
• I l costruttore è un metodo particolare che ha lo stesso nome della classe– Nel caso ci siano più costruttori, essi si distinguono perché
differiscono per numero e/ o tipo dei parametri
– Per i costruttori non viene indicato il tipo del risultato (è implicito nel nome del costruttore)
• I l costruttore di default (senza parametri) viene fornito dal compilatore a meno che non si definiscano altri costruttori
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 69
Costruttori: esempio
class Automobile {
String colore, marca, mod ello;
int cilindrata, numPorte ;
boolean accesa;
Automobile() {
colore=marca=modello= nul l ;
cilindrata= numPorte =0;
}
Automobile( String colore, String marca, Strin g modello) {
this .colore=colore; thi s .marca=marca;
this .modello=modello;
}
void accendi() {accesa= tr ue;}
boolean puoPartire () { ret urn accesa;}
void dipingi( String col) { this .colore=col;}
}
Gianpaolo Cugola 70
Ancora sui costruttori
• È possibile invocare un costruttore dall’interno di un altro tramite la notazione:this (<elenco di parametri a t tuali >);
• Esempio:cl ass Pers ona {
Str i ng nome;
i nt e t a;
Per sona( St r in g nome) { t his . nome=nome; eta =0;}
Per sona( St r in g nome, i nt et a) {
t hi s(n ome); t his . et a=eta ;
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 71
Classi e costruttori: esercizio
• Esercizio 1:– Si costruisca una classe che implementa uno stack di interi di
dimensione fissa (stabili ta in fase di costruzione)
• Esercizio 2:– Si modifichi la classe precedente (introducendone altre se
necessario) per implementare uno stack di dimensione variabile (allocazione dinamica di memoria)
• Esercizio 3:– Si usi la classe precedente per realizzare un programma che
legge un file byte a byte e lo inverte
Gianpaolo Cugola 72
Metodi e attributi di classe
• Sintassi:static <definizione dell’attributo o metodo>
• Un attributo di classe è condiviso da tutti gli oggetti della classe
• Si può accedere ad un attributo di classe senza bisogno di creare un oggetto tramite la notazione:
<nome classe>.<nome attributo>
• Un metodo di classe può essere invocato senza bisogno di creare un oggetto tramite la notazione:<nome classe>.<nome metodo>(<par. attuali>)
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 73
Metodi e attributi di classe: vincoli
• Un metodo static può accedere ai soli attributi e metodi static
• Un metodo convenzionale può accedere liberamente a metodi ed attributi sta t ic
Gianpaolo Cugola 74
Metodi e attributi di classe: esempio
cl ass S hape {
sta t i c Scr een s cre en=new Scr een( ) ; / / s i not i l’ i ni z.
s ta t i c voi d set Scr een( Scre en s) { scr een=s; }
voi d show( Scr een s) { set Scr een( s) ; . . . }
}
. . .
Shape. setS cr een( new Scr een() ) ; // c orr et to
Shape. show( ) ; / / e rr ato , s how è un met odo nor mal e
Shape s1=newShape( ), s2 =new Shape( ) ;
Scr een s =new Scr een( );
s1. se t Scre en( s) ; // co r r ett o, si p oss ono chi amare
/ / met odi st at ic su oggett i
/ / in q ues t o pu nt o s2.s cr een==s1. scr een==s
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 75
Attributi costanti
• È possibile definire attributi costanti tramite la notazione:final <definizione di attributo>=<valore>
• Esempiocl ass Auto mobil e {
i nt colo r e;
f in al in t BLU=0, GI ALLO=1, . . .;
voi d dip i ngi( i nt colo r e) { t hi s. col or e=col or e; }
}
. . .
Aut omobi le a =new Aut omobi l e( );
a. BLU=128; / / er r at o
Syste m. out . pr in t l n(“ BLU=“ +a. BLU); / / cor r et t o
Gianpaolo Cugola 76
Esercizio
• È corretto affermare che tramite attributi e metodi di classe e attributi costanti è possibile definire funzioni, variabili e costanti globali?
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 77
La gerarchia di ereditarietà
• Le classi di un sistema OO sono legate in una gerarchia di ereditarietà
• Data una classe C, una sottoclasse di C si definisce tramite la notazione:class K extends C {
<definiz . di attr . e metodi>
}
• La sottoclasse eredita tutti gli attributi ed i metodi della sopraclasse
• Java supporta solo ereditarietà semplice
Gianpaolo Cugola 78
La classe Object
• In mancanza di una differente indicazione, una classe Java estende la classe Object
• La classe Object fornisce alcuni metodi tra i quali vale la pena citare i seguenti:public boolea n equals ( Object ) ;
protected voi d finaliz e();
public String toString ( );
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 79
Overriding
• Una sottoclasse può aggiungere nuovi attributi e metodi ma anche ...
• ridefinire i metodi delle sue sopraclassi
• Esempio:cl ass A uto mobil eEl et t ri ca ex t ends Auto mobil e {
bool ean bat te r i eCar ic he;
voi d r ic ar i ca ( ) { batt er i eCar i che=t ru e; }
voi d acc endi( ) {
i f ( bat t er ie Car ic he) a ccesa=tr ue;
el se accesa=f als e;
}
}
Gianpaolo Cugola 80
La pseudo variabile super
• All’interno di un metodo che ridefinisce un metodo della sopraclasse diretta ci si può riferire al metodo che si sta ridefinendo tramite la notazione:super.<nome metodo>(<lista par. a t tuali>)
• Esempio:cl ass A uto mobil eEl et t ri ca ex t ends Auto mobil e {
. . .
voi d acc endi( ) {
i f ( bat t er ie Car ic he) s uper . acc endi( );
el se Syst em. out. pri nt l n( “ Batt er i e scari che” ) ;
}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 81
Ereditarietà e costruttori
• I costruttori non vengono ereditati
• All’interno di un costruttore è possibile richiamare il costruttore della sopraclasse tramite la notazione:super(<lista di par. attuali>)
posta come prima istruzione del costruttore
• Se il programmatore non chiama esplicitamente un costruttore della sopraclasse, il compilatore inserisce automaticamente il codice che invoca il costruttore di default della sopraclasse
Gianpaolo Cugola 82
Ereditarietà: esercizio
• Si definisca una classe Persona e due sottoclassi Uomoe Donna. La classe Personadeve avere un metodo chiSei () che stampa il nome della persona. Nelle sottoclassi tale metodo deve essere ridefinito perché stampi anche il sesso
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 83
Information hiding in Java
• Attributi e metodi di una classe possono essere:– pubblic
• sono visibili a tutti
• vengono ereditati
– protected
• sono visibili solo alle sottoclassi
• vengono ereditati
– private
• sono visibili solo all’interno della stessa classe
• non sono visibili nelle sottoclassi
Gianpaolo Cugola 84
Information hiding: esempio
cl ass Auto mobil e {pri vat e St r in g col ore , m ar ca, modell o;pri vat e i nt ci l i ndr at a, numPort e;pri vat e boole an accesa;publ i c Aut omobi l e( ) {
col ore =marc a=modell o=nul l ;ci l i ndr at a=numPor te =0;
}publ i c Aut omobi l e( Str i ng col , St r i ng ma, St r i ng mo)
{ col or e=col ; m ar ca=ma; modell o=mo; }publ i c voi d accendi () { acc esa=t r ue; }publ i c bool ean p uoPar t i r e( ) { re t ur n accesa; }publ i c voi d di pi ngi ( St r i ng col) { col or e=col ;}
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 85
Information hiding: esercizio
• Si modifichi l’esercizio precedente introducendo le dichiarazioni di visibilità per i membri delle classi
Gianpaolo Cugola 86
Classi e metodi astratti
• Un metodo astratto è un metodo per il quale non viene specificata alcuna implementazione
• Una classe è astratta se contiene almeno un metodo astratto
• Non è possibile creare istanze di una classe astratta
• Le classi astratte sono molto utili per introdurre della astrazioni di alto livello
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 87
Classi e metodi astratti: esempio
abstract class Shape {
static Screen screen;
Shape(Screen s) {screen=s;}
abstract void show();
}
class Circle extends Shape {
void show() {
...
}
}
...
Shape s=new Shape (); // errato
Circle c=new Circle (); // corretto
Gianpaolo Cugola 88
Classi astratte: esercizio
• Nell’esercizio precedente si introduca una classe astratta OggettoConNome , sopraclasse di Persona
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 89
Classi e metodi final
• Se vogliamo impedire che sia possibile creare sottoclassi di una certa classe la definiremo final
• Esempio:f i nal c l ass C { . . . }
c l ass C1 ext ends C / / er r at o
• Similmente, se vogliamo impedire l’overriding di un metodo dobbiamo definirlo final
• Esempio:cl ass C { f i nal v oid f( ) { .. . } }
c l ass C1 ext ends C {
voi d f () { . .. } / / err at o
}
Gianpaolo Cugola 90
Ereditarietà ed array
• Se X è una sopraclassedi Y alloral’array X[] è “sopra-array” dell’array Y[]– Lo stesso vale per gli array multidimensionali
• Tale scelta non è type safe
• Esempio:void f(X[] ax ) {
ax [0]= new X();
}
...
f( new Y[10]);
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 91
I limiti dell’ereditarietà semplice
• L’ereditarietà semplice non permette la descrizione di numerose situazioni reali
• Esempio:– Supponiamo di avere una classe Giocattolo ed
una classe Automobile . In assenza di ereditarietà multipla non posso definire la classe AutomobileGio cattolo
Gianpaolo Cugola 92
I problemi dell’ereditarietà multipla
• In presenza di ereditarietà multipla è possibile ereditare due o più metodi con la stessa “signature” da più sopraclassi. Ciò determina un conflitto tra implementazioni diverse
C1
f (int i) : int
C2
f (int i) : int
C
C1 C2
C
K
f (int i) : int
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 93
Ereditarietà semplice vs. ereditarietà multipla: la soluzione di Java
• Distinguere tra una gerarchia di ereditarietà (semplice) ed una gerarchia di implementazione (multipla) ...
• introducendo il costrutto delle interfacce
• In tal modo è possibile distinguere tra l’uso dell’ereditarietà al fine di riutili zzare il codice e l’uso al fine di descrivere una gerarchia di tipi
Gianpaolo Cugola 94
Interfacce
• Una interfaccia è una classe priva di attributi non costanti ed i cui metodi sono tutti pubblici ed astratti
• Sintassi:interface <nome> {
<lista di d efinizion e di m etodi privi di corp o>
}
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 95
Interfacce ed ereditarietà
• Una interfaccia può ereditare da una o piùinterfacce
• Sintassi:interface <nome> extends <nome1>,..,< nomen> {...}
• La gerarchia di ereditarietà tra interfacce definisce una gerarchia di tipi
Gianpaolo Cugola 96
Interfacce: esercizio
• In che senso una interfaccia descrive un tipo meglio di una classe?
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 97
La gerarchia di implementazione
• Una classe può implementare una o più interfacce– se la classe non è astratta deve fornire una
implementazione per tutti i metodi presenti nelle interfacce che implementa
– altrimenti la classe è astratta
• Sintassi:class <nome> implements <nome1>,..,< nomen> {...}
Gianpaolo Cugola 98
Polimorfismo
• Polimorfismo è la capacità per un elemento sintattico di riferirsi a elementi di diverso tipo
• In Java una variabile di un tipo riferimento T può riferirsi ad un qualsiasi oggetto il cui tipo sia T o un sottotipo di T
• Similmente un parametro formale di un tipo riferimento T può riferirsi a parametri attuali il cui tipo sia T o un sottotipo di T
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 99
Polimorfismo: esempio
cl ass Auto mobil e { .. .}c l ass A uto mobil eEl et t ri ca ext ends Auto mobil e { . . . }c l ass Parc heggi o {
pri vat e Aut omobi le buf [ ];pri vat e i nt nAut o;publ i c Par cheggi o( i nt di m) { buf =new Aut omobi l e[d i m] ; }publ i c voi d aggi ungi( Aut omobi le a ) { buf [ nAut o++] =a; }
}. . .Aut omobi le a =new Aut omobi l eEl et tr i ca() ;Par cheggio p =new Par cheggi o( 100) ;p. aggi ungi ( new Aut omobi l eEle t t r ic a( ) ) ;
Gianpaolo Cugola 100
Polimorfismo ed interfacce
• Una interfaccia può essere utilizzata come tipo di una variabile
• Una siffatta variabile potrà riferirsi ad un qualsiasi oggetto che implementi l’interfaccia (polimorfismo)
• Esempio:i nt er f ace Ogget t oCheSpar a {
spar a( ) ;
}
c l ass Pi st ol a i mpl ement s O gget t oCheSpar a {. . . }
Ogget t oCheSpara o=new Pi st ol a( );
o. spar a( ) ;
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 101
Polimorfismo: tipo statico e tipo dinamico
• In presenza di polimorfismo distinguiamo tra il tipo statico ed il tipo dinamico di una variabile (o di un parametro formale)– La regola del polimorfismo prima enunciata obbliga il
tipo dinamico ad essere un sottotipo (proprio o meno) del tipo dinamico
Gianpaolo Cugola 102
Polimorfismo e binding dinamico
• In Java, a fronte della invocazione x.f(x1,..., xn ) , l’implementazione scelta per il metodo f dipende dal tipo dinamico di x e non dal suo tipo statico
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 103
Binding dinamico: esempio
class Persona {
private String nome;
public Persona( String nome) { this .nome=nome;}
public void chiSei () {
System .out. println (“Cia o, io sono “+nome);
}
}
class Uomo extends Persona {
public Uomo( String nome) { super(nome);}
public void chiSei ()
{super. chiSei (); System . out. println (“sono u n maschio”);}
}
...
Persona p= new Uomo(“Giovann i ”); p. chiSei ();
OUTPUT: Ciao, io sono Giov anni
sono un maschio
Gianpaolo Cugola 104
Polimorfismo e binding dinamico: esercizio
• Si costruisca uno stack di persone e lo si usi per conservarvi tanto uomini quanto donne. Al termine si verifichi l’effetto del binding dinamico richiamando il metodo chiSei () su tutti gli oggetti conservati
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 105
Conversioni forzate tra tipi riferimento: casting
• È possibile forzare esplicitamente la conversione da un tipo riferimento T ad un sottotipo T1 purché:– Il tipo dinamico dell’espressione che convertiamo sia
un sottotipo di T1
• Esempio:Object o=new AutomobileElettrica ();
Automobile a=o; // errato, Object non è un
// sottotipo di Automobile
Automobile a=(Automobile) o; // corretto ( casting )
Gianpaolo Cugola 106
Casting: esercizio
• Si spieghi perché il casting è fondamentale per implementare contenitori generici (stack di Object ecc.)
I l linguaggio Java
Gianpaolo Cugola
Gianpaolo Cugola 107
Package ed information hiding
• Packagee visibilità degli attributi e dei metodi– Attributi e metodi di una classe C per i quali non sia dichiarato alcun tipo di
visibilità sono visibili solo all’interno di classi che appartengano allo stesso package di C
– Tale costrutto gioca un ruolo analogo alla dichiarazione di friendship in C++
• Packageed importazione di classi– Un packagecontiene un insieme di classi pubbliche ed un insieme di classi
private
– Solo le classi pubbliche si possono importare in altri package
• Packagee compilation unit– Ogni compilation unit contiene classi appartenenti allo stesso package
– Una compilation unit contiene una sola classe pubblica (per default la prima) ed eventualmente altre classi private
Gianpaolo Cugola 108
Il package java . lang
• Il package java . lang contiene classi di uso molto frequente (String , Object , ecc.)
• Non è necessario importare le classi appartenenti al package java . lang prima di utili zzarle