Professional Documents
Culture Documents
Roadmap
0. Primi passi con Java
1. Buone abitudini
2. Tipi di dati primitivi
3. Uso di classi
Fondamenti di Programmazione
Uso di classi
Le classi, in quanto tipi di dato strutturati,
prevedono usi e regole pi complessi rispetto
ai tipi semplici
Abbiamo gi visto alcuni aspetti nelle lezioni
precedenti, in questa serie di lucidi
completiamo e sistematizziamo la trattazione
Per farlo, esaminiamo luso di classi per due
problemi molto comuni: linterazione con
lutente e il trattamento di sequenze di
caratteri
Fondamenti di Programmazione
Uso di classi
Classi gi pronte
Come la maggior parte dei linguaggi di
programmazione, Java dotato di una libreria
(library) di classi pronte alluso che coprono
molte esigenze comuni (e anche meno
comuni)
Usare classi gi definite da altri la norma
per non sprecare tempo a risolvere problemi
gi risolti o a reinventare la ruota
Fondamenti di Programmazione
Fondamenti di Programmazione
Uso di classi
Roadmap
3. Uso di classi
Come identificarla ? Dove cercarla ?
La classe istanziabile o non istanziabile ?
Se istanziabile, come creo le istanze ?
Quali metodi mi servono e come li uso ?
Fondamenti di Programmazione
Classi e documentazione
La libreria Java standard accompagnata da
documentazione che illustra lo scopo e lutilizzo di
ciascuna classe presente
La documentazione molto ampia, non ha scopo
didattico (non sempre chiarissima) ma piuttosto di
Reference manual
Pertanto non pensabile e non molto utile studiare
estensivamente o memorizzare la documentazione
prima di programmare
Al contrario, leggere la documentazione una delle
attivit pi tipiche durante la programmazione
Fondamenti di Programmazione
Uso di classi
Esempi di package
java.lang
java.io
java.util
java.text
Fondamenti di Programmazione
Uso di classi
I package
Allatto pratico un package un insieme di file .class
tipicamente archiviati in un file compresso .zip o .jar
Ogni classe appartiene ad un package: la
dichiarazione di appartenenza pu essere effettuata
allinizio del codice della classe usando la parola
riservata package seguita dal nome del package
Se non si dichiara esplicitamente il package la classe
viene assegnata ad un package anonimo che
contiene, oltre ad essa, tutte le classi senza package
presenti nella stessa directory
Fondamenti di Programmazione
Uso di classi
Roadmap
3. Uso di classi
Come identificarla ? Dove cercarla ?
La classe istanziabile o non istanziabile ?
Se istanziabile, come creo le istanze ?
Se istanziabile, come uso le istanze ?
Quali metodi mi servono e come li uso ?
Fondamenti di Programmazione
Uso di classi
Classi istanziabili
Una classe istanziabile fornisce il prototipo di
una famiglia di oggetti (istanze della classe) che
hanno struttura simile ma propriet distinte a
livello individuale (valori diversi degli attributi e
quindi risultati diversi prodotti dai metodi)
Luso tipico la costruzione di istanze (tramite
new) e quindi linvocazione di metodi su di esse
Esempi: Ossequioso, Valuta, Anno, String, . . .
Fondamenti di Programmazione
Uso di classi
Una precisazione
La distinzione tra classi istanziabili e non istanziabili
riguarda il senso logico del loro utilizzo
Il termine classe non istanziabile sar utilizzato per
indicare una classe che non ha senso istanziare, date
le sue caratteristiche
Tecnicamente sarebbe possibile usare loperatore
new su classi non istanziabili (composte di metodi
e attributi tutti static) ma non avrebbe senso pratico
Vedremo nella parte finale del corso classi di altra
natura (astratte) sulle quali non tecnicamente
possibile usare loperatore new
Fondamenti di Programmazione
Uso di classi
Uso di classi
In memoria
Math
E
2.7182
PI 3.1415
public
. . .
public
. . .
public
a)
. . .
public
Fondamenti di Programmazione
Uso di classi
10
Classi istanziabili
Una classe istanziabile rappresenta qualcosa
che esiste in molteplici versioni individuali che
hanno una struttura comune ma ciascuna con
una propria identit:
esistono molte sequenze di caratteri (la classe
String istanziabile)
esistono molte valute (la classe Valuta
istanziabile)
esistono molte persone (unipotetica classe
Persona istanziabile)
Fondamenti di Programmazione
Uso di classi
11
In memoria (1)
Persona
String nome;
String cognome;
. . .
public Persona (String _nome, String _cognome)
. . .
public String codiceFiscale()
. . .
Fondamenti di Programmazione
In memoria (2)
Persona
String nome;
String cognome;
. . .
public Persona (String _nome, String _cognome)
. . .
public String codiceFiscale()
. . .
String nome= Mario;
String cognome Rossi;
. . .
String nome= Ugo;
String cognome Neri;
. . .
Fondamenti di Programmazione
Uso di classi
12
Il modificatore static
La parola riservata static viene usata per
indicare il livello di definizione di un attributo
o metodo
Se la parola static presente lattributo o
metodo definito a livello di classe
Se la parola static non presente lattributo o
metodo definito a livello di istanza
Fondamenti di Programmazione
Uso di classi
13
Il modificatore static
La parola riservata static viene usata per
indicare ilIl
livello
di definizione del
di un attributo
significato
o metodo
Uso di classi
14
Tirando le somme
Una classe non istanziabile (come Math o
BuongiornoMain)
non contiene nessun costruttore esplicito
dovrebbe contenere solo attributi e metodi static
Uso di classi
15
Propriet a livello
di classe e di istanza
Propriet collettive a
livello di classe,
referenziabili
indipendentemente
dall'esistenza di istanze
Propriet individuali:
esistono concretamente
solo a livello di istanze
Def. classe
metodi static
Una classe
istanziabile
pura ha solo
questa parte
istanza1
istanzaN
attributi static
Fondamenti di Programmazione
Accesso a metodi e
attributi static
Essendo definiti a livello di classe, attributi e metodi
static sono acceduti/invocati tramite il nome della
classe:
NomeClasse.nomeMetodoStatic(...)
NomeClasse.nomeAttributoStatic
P.e.
Math.sqrt(2);
String.valueOf(Math.PI);
In caso di classe istanziabile ibrida equivalente, ma
sconsigliabile, accedere tramite una qualunque istanza
della classe:
nomeIstanza.nomeMetodoStatic(...)
nomeIstanza.nomeAttributoStatic
Fondamenti di Programmazione
Uso di classi
16
Accesso ad attributi e
metodi della propria classe
All'interno del corpo di un metodo si possono riferire in
modo abbreviato attributi e metodi definiti nella stessa
classe
Se nel corpo di un metodo appare il nome di un metodo
o attributo static della sua classe sottinteso che sia
preceduto dal nome della classe stessa
P.e. nel corpo del metodo main di BuongiornoMain
= new Ossequioso(SALUTO_ITA);
Forma estesa
equivalente
= new Ossequioso(BuongiornoMain
.SALUTO_ITA);
Ossequioso(BuongiornoMain.SALUTO_ITA);
Fondamenti di Programmazione
Uso di classi
17
Accesso ad attributi e
metodi della propria classe
Se nel corpo di un metodo (non static) appare il nome
di un metodo o attributo non static della sua classe
sottinteso che sia riferito allistanza su cui stato
invocato il metodo
P.e. nel corpo del metodo tassoConversione di Valuta
return tassoRif /
Incroci vietati
Nel corpo di un metodo static non si pu accedere
ad attributi e metodi non static della stessa classe
Infatti il metodo static deve poter essere invocato a
livello di classe (anche in assenza di istanze) mentre
attributi e metodi non static esistono solo se c
almeno unistanza
Nel corpo di un metodo non static si pu accedere a
qualunque attributo e metodo della stessa classe (se
esiste listanza ovviamente esiste la classe)
Fondamenti di Programmazione
Uso di classi
18
Errori subdoli
Eventuali mescolanze improprie di static e
non static causano errori di compilazione
Si pu accontentare il compilatore facendo
grossi errori concettuali (p.e. aggiungendo
static dove non deve stare)
Modificare il codice per accontentare il
compilatore senza pensare al significato della
modifica pu solo peggiorare le cose
Fondamenti di Programmazione
Errori subdoli
NON modificare
MAI il codice per
accontentare il compilatore
senza pensare al significato
della modifica
Fondamenti di Programmazione
Uso di classi
19
Errori subdoli
Luso improprio
del modificatore static
causa errori DISASTROSI
talvolta ritenuti MISTERIOSI
Fondamenti di Programmazione
Errori subdoli
public class Valuta
{
private String nome;
static
private double tassoRif;
tassoRif;
public Valuta(String
Valuta(String _nome, double _tassoRif)
tassoRif)
{
Si intrufola uno static di troppo
nome = _nome;
per distrazione o come
tassoRif = _tassoRif
;
_tassoRif;
}
residuo di un copia/incolla
public static double tassoConversione (Valuta altraValuta)
altraValuta)
{
return tassoRif/
tassoRif/altraValuta.
altraValuta.tassoRif;
tassoRif;
}
}
Fondamenti di Programmazione
Uso di classi
20
Fondamenti di Programmazione
. . . ma il risultato s !
Fondamenti di Programmazione
Uso di classi
21
Roadmap
3. Uso di classi
Come identificarla ? Dove cercarla ?
La classe istanziabile o non istanziabile ?
Se istanziabile, come creo le istanze ?
Se istanziabile, come uso le istanze ?
Quali metodi mi servono e come li uso ?
Fondamenti di Programmazione
Due esempi
Come primi esempi di classi pronte istanziabili
useremo le classi String e StringBuffer del package
java.lang
La classe String ha lo scopo di rappresentare
stringhe (sequenze) di caratteri che non devono
essere modificate dopo essere state costruite
(oggetti immutabili)
La classe StringBuffer ha lo scopo di rappresentare
stringhe (sequenze) di caratteri che possono essere
modificate dopo essere state costruite (in Java 6 c
anche una classe molto simile di nome StringBuilder)
Fondamenti di Programmazione
Uso di classi
22
Definizione di variabili
tipo nome; oppure
tipo nome1,...,nomeN;
String nome;
StringBuffer risultato;
Ossequioso maggiordomoIta, maggiordomoFra;
Dopo la definizione esiste solo il
riferimento, non un oggetto di tipo
nome
null
String !
Il valore speciale null il valore
iniziale di default per qualunque
nome non un oggetto di tipo String
variabile di tipo strutturato.
solo un riferimento utilizzabile per
Esso indica che il riferimento nullo e
accedere ad un oggetto String
non c'e' nessun oggetto riferito
Fondamenti di Programmazione
Operatore new
L'operatore new NomeClasse crea un nuovo oggetto
con le propriet definite in NomeClasse (istanza della
classe) e ritorna il riferimento ad esso
L'operatore new d luogo allinvocazione di un metodo
costruttore passandogli gli argomenti necessari
Il costruttore invocato deve essere di una classe
uguale o "compatibile" con la definizione della variabile
Ogni classe pu avere pi costruttori che si
differenziano per la lista degli argomenti
Fondamenti di Programmazione
Uso di classi
23
Costruttori
La classe String ha 15 costruttori alternativi in Java 6
(erano 11 in Java 2)
La classe StringBuffer ha 4 costruttori alternativi in
Java 6 (erano 3 in Java 2)
La scelta del costruttore da invocare avviene tramite
gli argomenti attuali che vengono passati
Il modo pi tipico di costruire un oggetto String o
StringBuffer quello di passargli una sequenza di
caratteri tra doppie virgolette (che di fatto un
oggetto String creato automaticamente)
Fondamenti di Programmazione
Ciao ciao
saluto
null
Fondamenti di Programmazione
Uso di classi
24
Fondamenti di Programmazione
Costruzioni diverse
String saluto = new String("Ciao ciao");
StringBuffer salutino = new StringBuffer("Bye");
StringBuffer saluto2 = new StringBuffer(saluto);
saluto
salutino
saluto2
Ciao ciao
Bye
Ciao ciao
metodi classe
String
metodi classe
StringBuffer
metodi classe
StringBuffer
Fondamenti di Programmazione
Uso di classi
25
Roadmap
3. Uso di classi
Come identificarla ? Dove cercarla ?
La classe istanziabile o non istanziabile ?
Se istanziabile, come creo le istanze ?
Se istanziabile, cosa posso fare con le istanze ?
Quali metodi mi servono e come li uso ?
Fondamenti di Programmazione
Operazioni su istanze
Le principali operazioni che si possono
effettuare sulle variabili che riferiscono
istanze di una classe sono:
assegnamento
confronto
invocazione di metodi
Fondamenti di Programmazione
Uso di classi
26
Operazioni su istanze
Le principali operazioni che si possono
effettuare sulle variabili che riferiscono
istanze di una classe sono:
assegnamento
confronto
invocazione di metodi
Fondamenti di Programmazione
saluto1
null
Ciao ciao
saluto2=saluto1;
metodi classe
String
saluto1=saluto3;
saluto2
saluto3
Buongiorno
Buongiorno
metodi
metodi classe
classe
String
String
null
Fondamenti di Programmazione
Uso di classi
27
Assegnamenti tra
variabili di tipi strutturati
PRIMA
v2
v1
v2
v1
null
null
DOPO
v1 = v2;
null
null
v1
v1
null
v2
v2
Fondamenti di Programmazione
DOPO
v1 = v2;
v1
null
v2
null
v2
null
v1
v1
v2
v2
Fondamenti di Programmazione
Uso di classi
28
Il valore il riferimento !
Il valore di una variabile di tipo strutturato il
riferimento ad un oggetto (istanza di una
classe)
Una stessa variabile pu riferire oggetti
diversi in momenti diversi a seguito di
operazioni di assegnazione sul suo valore
Se la variabile contiene il valore null non
riferisce nessun oggetto in quel momento
Fondamenti di Programmazione
Oggetti e riferimenti
Le variabili hanno un nome, gli oggetti no
Per utilizzare un oggetto bisogna passare attraverso
una variabile che ne contiene il riferimento
Uno stesso oggetto pu essere riferito da pi variabili e
quindi essere raggiunto tramite nomi diversi (di
variabili)
Il rapporto variabili-oggetti riferiti dinamico, il
riferimento iniziale non necessariamente rimane legato
alloggetto per tutta la sua esistenza
Se un oggetto non (pi) riferito da nessuna variabile
diventa irraggiungibile (e quindi inutilizzabile)
Fondamenti di Programmazione
Uso di classi
29
Operazioni su istanze
Le principali operazioni che si possono
effettuare sulle variabili che riferiscono
istanze di una classe sono:
assegnamento
confronto
invocazione di metodi
Fondamenti di Programmazione
Uso di classi
30
Il valore il riferimento !
String saluto1 = new String ("Buongiorno");
String saluto2 = new String ("Buongiorno");
saluto1 == saluto2 ??
FALSE
saluto1
saluto2
Buongiorno
Buongiorno
metodi classe
String
metodi classe
String
Fondamenti di Programmazione
Il valore il riferimento !
String saluto1 = new String ("Buongiorno");
String saluto2 = saluto1
saluto1 == saluto2 ??
TRUE
saluto1
saluto2
Buongiorno
metodi classe
String
Fondamenti di Programmazione
Uso di classi
31
Confronto
String saluto1 = new String ("Buongiorno");
String saluto2 = new String ("Buongiorno");
saluto1 == saluto2; // false
saluto1.equals
(saluto2); // true
saluto1.equals(saluto2);
saluto1
saluto2
Buongiorno
Buongiorno
metodi classe
String
metodi classe
String
Fondamenti di Programmazione
Uso di classi
32
Confronto
String saluto1 = new String ("Buongiorno");
String saluto2 = new String ("buongiorno");
saluto1 == saluto2; // false
saluto1.equals
(saluto2); // false
saluto1.equals(saluto2);
saluto1.equalsIgnoreCase
(saluto2); // true
saluto1.equalsIgnoreCase(saluto2);
saluto1
saluto2
Buongiorno
buongiorno
metodi classe
String
metodi classe
String
Fondamenti di Programmazione
Uso di classi
33
saluto1
saluto2
Buongiorno
Buongiorno
metodi classe
String
metodi classe
String
Fondamenti di Programmazione
saluto1
saluto2
Buongiorno
metodi classe
String
Fondamenti di Programmazione
Uso di classi
34
Alcune distinzioni
a = "b";
"b"
Fondamenti di Programmazione
Alcune distinzioni
a = 'b';
a una variabile di tipo char
Il valore corrispondente
al singolo carattere b
viene copiato dentro a
a
b
Fondamenti di Programmazione
Uso di classi
35
Alcune distinzioni
a = ' ';
a una variabile di tipo char
Il valore corrispondente
al singolo carattere spazio
(invisibile, detto anche blank)
viene copiato dentro a
Fondamenti di Programmazione
Alcune distinzioni
a = " ";
""
Fondamenti di Programmazione
Uso di classi
36
Alcune distinzioni
a = "";
""
Fondamenti di Programmazione
Operazioni su istanze
Le principali operazioni che si possono
effettuare sulle variabili che riferiscono
istanze di una classe sono:
assegnamento
confronto
invocazione di metodi
Fondamenti di Programmazione
Uso di classi
37
Metodi
I metodi non static rappresentano operazioni
effettuabili su singoli oggetti
La documentazione indica per ogni metodo il
tipo ritornato e la lista degli argomenti formali
che rappresentano i dati che il metodo deve
ricevere in ingresso da chi lo invoca
Per ogni argomento formale sono specificati:
un nome
un tipo
Fondamenti di Programmazione
Uso di classi
38
Concatenazione di stringhe
L'operatore + si applica a due (o pi) variabili
di tipo String (o meglio: almeno una String
e altre trasformabili in String)
Il risultato un nuovo oggetto String il cui
contenuto la sequenza di caratteri risultante
dalla concatenazione delle sequenze
corrispondenti alle variabili coinvolte
int estratto = . . . ;
System.out.println
("Il numero vincente e'" + estratto);
System.out.println("Il
Fondamenti di Programmazione
Uso di classi
39
Esempi di metodi di
StringBuffer
public StringBuffer append(
append(String str)
str)
Appends the string to this string buffer.
public StringBuffer insert(
insert(int offset, String str)
str)
Inserts the string into this string buffer.
public StringBuffer deleteCharAt(
deleteCharAt(int index)
index)
Removes the character at the specified position in this StringBuffer
(shortening the StringBuffer by one character).
character).
public StringBuffer reverse()The
reverse()The character sequence contained in this
string buffer is replaced by the reverse of the sequence.
sequence.
Invocazione di metodi
Linvocazione di un metodo non static su un
oggetto istanza della classe in cui il metodo
definito si effettua con la sintassi:
nomeVar.
nomeVar.nomeMetodo(lista
nomeMetodo(lista argomenti attuali)
Fondamenti di Programmazione
Uso di classi
40
Un saluto maiuscolo
public class Ossequioso
{
private String mioSaluto;
mioSaluto;
public Ossequioso (String
(String cosaDevoDire)
cosaDevoDire)
{
mioSaluto = cosaDevoDire;
cosaDevoDire;
}
. . .
public void salutaUpper ()
{
System.out.println
(mioSaluto.
System.out.println(
mioSaluto.toUppercase());
toUppercase());
}
}
Fondamenti di Programmazione
Uso di classi
41
Un saluto a rovescio
public class Ossequioso
{
private String mioSaluto;
mioSaluto;
public Ossequioso (String
(String cosaDevoDire)
cosaDevoDire)
{
mioSaluto = cosaDevoDire;
cosaDevoDire;
}
. . .
public void salutaRovescio ()
{
StringBuffer rovescio = new StringBuffer(
StringBuffer(mioSaluto);
mioSaluto);
rovescio.reverse
();
rovescio.reverse();
System.out.println
(rovescio);
System.out.println(rovescio);
}
}
Fondamenti di Programmazione
Roadmap
3. Uso di classi
Come identificarla ? Dove cercarla ?
La classe istanziabile o non istanziabile ?
Se istanziabile, come creo le istanze ?
Se istanziabile, cosa posso fare con le istanze ?
Quali metodi mi servono e come li uso ?
Fondamenti di Programmazione
Uso di classi
42
Lunghi elenchi
La documentazione di ogni classe (istanziabile o
no) contiene lelenco dei metodi disponibili
La classe Math non istanziabile e contiene 54
metodi (tutti static ovviamente)
La classe String istanziabile ibrida e contiene
70 metodi di cui 13 static
La classe StringBuffer istanziabile pura e
contiene 53 metodi (nessuno static ovviamente)
Fondamenti di Programmazione
Uso di classi
43
Esempio di ricerca
Supponiamo di voler arrotondare un numero
floating point allintero pi vicino: ci sar un
metodo che lo fa per noi ?
Essendo unoperazione matematica
fondamentale la ricerca si orienta sul package
java.lang e sulla classe Math
Sapendo che in inglese round significa
(anche) arrotondare vediamo se c un
metodo con questo nome
Fondamenti di Programmazione
Uso di classi
44
Overloading di metodi
Esistono due metodi round nella classe Math
I due metodi hanno lo stesso nome ma sono
distinguibili in base alla lista degli argomenti: uno
riceve in ingresso un argomento float, laltro riceve in
ingresso un argomento double
La definizione di metodi con lo stesso nome ma liste
degli argomenti diverse, cio varianti diverse dello
stesso metodo detta overloading
A seconda degli argomenti passati verr selezionato
ed eseguito il metodo appropriato
Fondamenti di Programmazione
Esempi di overloading
Nella classe Math i metodi abs, max e min
sono definiti ciascuno in 4 versioni diverse
Nella classe String il metodo substring
definito in 2 versioni diverse
Nella classe StringBuffer il metodo append
definito in 13 versioni diverse
Se una classe istanziabile ha pi costruttori
essi sono (ovviamente) in overloading
Fondamenti di Programmazione
Uso di classi
45
Complicazioni
Il metodo contains sembra essere quello che
ci serve (in effetti lo ) ma richiede
conoscenze che non abbiamo ancora
Peraltro il metodo contains non esisteva fino
alla versione 1.4
Il metodo indexOf (in 4 versioni) non fa
esattamente quello che ci serve ma quasi . . .
Fondamenti di Programmazione
Uso di classi
46
Uso di classi
47