Sei sulla pagina 1di 47

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Uso di una classe pronta


Quando si deve cercare e poi usare una
classe pronta alluso i passi da seguire sono:
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

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Organizzazione delle classi


La libreria standard segue il metodo di
organizzazione delle classi previsto da Java: le classi
tra loro affini sono raggruppate in package
Ogni package ha un nome tipicamente composto da
due o pi parole separate da . e contiene una o pi
classi (ed eventualmente altri componenti)
I nomi a pi livelli riflettono unorganizzazione
gerarchica dei package simile a quella delle cartelle
(directory) su un disco
Fondamenti di Programmazione

Esempi di package
java.lang

Package fondamentale con


classi di uso molto comune

java.io

Package per lInput/Output

java.util

Package con classi varie di


utilit generale

java.text

Package con classi per la


gestione ed elaborazione di
testi e dati in formato testuale

Fondamenti di Programmazione

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso di classi appartenenti


ad un package
Solo le classi appartenenti al package java.lang sono
automaticamente disponibili in ogni programma
Per luso di altri package in una classe necessario
importarli tramite la parola riservata import
Tutte le dichiarazioni di importazione devono trovarsi
prima della definizione della classe
Si possono importare singole classi di un package p.e.
import java.util.Random
ma pi tipico importare comunque tutto il package:
import java.util.*
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

La doppia natura delle classi


Le classi disponibili nella libreria standard si
possono distinguere in due tipologie principali:
Classi istanziabili
Classi non istanziabili

La stessa distinzione applicabile alle nostre


classi
Fondamenti di Programmazione

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Classi non istanziabili


Una classe non istanziabile contiene un
insieme di metodi (ed eventualmente
attributi) di natura generale non legati alle
propriet di oggetti individuali specifici
Non ha senso la nozione di istanza della
classe poich non ci sono caratteristiche
differenziabili tra oggetti distinti
Esempi: BuongiornoMain, ValutaDriver,
AnnoDriver, Math, Collections, . . .
Fondamenti di Programmazione

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Istanziabili vs. non istanziabili


La stragrande maggioranza delle classi
istanziabile ma lesistenza di alcune classi non
istanziabili necessaria
La classe (indispensabile) che contiene il main
normalmente non istanziabile
Poich i numeri non sono oggetti, i metodi
numerici appartengono a classi non
istanziabili
Fondamenti di Programmazione

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Istanziabili vs. non istanziabili


Nel caso di una classe istanziabile attributi e metodi
rappresentano propriet possedute da tutti gli oggetti
istanza della classe
Ogni oggetto istanza di una classe ha una sua identit
"contiene" individualmente gli attributi e i metodi
definiti nella classe
Ogni volta che si costruisce unistanza con new si crea
un nuovo insieme di attributi e metodi individuali
Nel caso di una classe non istanziabile attributi e
metodi sono unici a livello della classe (non esistono
istanze diversificate)
Fondamenti di Programmazione

Classi non istanziabili


Una classe non istanziabile rappresenta
qualcosa di concettualmente unico, che non
esiste e non pu esistere in versioni separate
ciascuna con una propria identit:
esiste una sola matematica (la classe Math non
istanziabile)
esiste un solo sistema su cui un programma
eseguito (la classe System non istanziabile)
esiste un solo punto di inizio di un programma (le
classi contenenti il main non sono istanziabili)
Fondamenti di Programmazione

Uso di classi

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Riconoscere una classe non


istanziabile
Non ha costruttori
Attributi e metodi sono tutti static
Quando penso allesecuzione dei suoi metodi
non ho bisogno di immaginare unistanza
individuale: sono applicabili direttamente alla
classe con almeno un argomento
Math.sqrt(2)
Math.abs(-3)
Fondamenti di Programmazione

In memoria
Math
E

2.7182

PI 3.1415
public
. . .
public
. . .
public
a)
. . .
public

static double abs(double a)


static double cos(double a)
static double sqrt(double

static float ulp(float f)

Fondamenti di Programmazione

Uso di classi

10

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Riconoscere una classe


istanziabile
Ha costruttori
Attributi e metodi sono tutti (o quasi) non
static
Quando penso allesecuzione dei suoi metodi
ho bisogno di immaginare unistanza
individuale a cui applicarli (anche senza
argomenti esterni, perch usano attributi
interni)
Persona.codiceFiscale() // NO! QUALE PERSONA?
String.toUpperCase() // NO! QUALE STRINGA?
Fondamenti di Programmazione

Uso di classi

11

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Ogni volta che eseguo new Persona


ne creo una nuova istanza distinta

String nome= Luca;


String cognome Verdi;
. . .

12

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Due livelli di definizione


Dalla discussione precedente emerge che
esistono due livelli di definizione per
attributi e metodi
Nel caso di classi istanziabili attributi e metodi
sono definiti a livello di istanza
Nel caso di classi non istanziabili attributi e
metodi sono definiti a livello di classe
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Il modificatore static
La parola riservata static viene usata per
indicare ilIl
livello
di definizione del
di un attributo
significato
o metodo

modificatore static non

Se la parola static presente lattributo o


metodo
definito
livellovedere
di classe con
ha nulla
a ache
Se
parola staticitaliano
non presente
lattributo o
illatermine
statico
metodo definito a livello di istanza
Fondamenti di Programmazione

Static vs. non static


Ogni attributo o metodo non static esiste
concretamente in ogni istanza creata
Esiste in molteplici versioni se vengono create
pi istanze
Non esiste concretamente se il programma non
crea almeno unistanza (tramite operatore new)

Ogni attributo o metodo static esiste


concretamente a livello di classe
Esiste in ununica versione
La sua esistenza non dipende da cosa fa il
programma
Fondamenti di Programmazione

Uso di classi

14

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Tirando le somme
Una classe non istanziabile (come Math o
BuongiornoMain)
non contiene nessun costruttore esplicito
dovrebbe contenere solo attributi e metodi static

Una classe istanziabile (come Ossequioso o


String)
ha almeno un costruttore (di solito esplicito)
dovrebbe avere almeno un attributo o metodo
non static
Fondamenti di Programmazione

Classi istanziabili ibride


Alcune classi istanziabili (p.e. String) della
libreria standard contengono attributi o
metodi static ed hanno quindi natura ibrida
E come se la classe avesse due sottoparti
(una static e una no) ognuna delle quali
segue le proprie regole
Salvo rari casi, sconsigliabile realizzare
classi istanziabili ibride (sono accettabili
attributi costanti definiti come static)
Fondamenti di Programmazione

Uso di classi

15

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

attributi non static


metodi non static

istanza1

istanzaN

attributi non static


metodi non static

Una classe NON


istanziabile
pura ha solo
questa parte

attributi static

attributi non static


...

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Accesso a metodi e attributi


non static
La sintassi simile al caso precedente, ma
ovviamente laccesso/invocazione possibile solo
tramite unistanza specifica (ed ogni accesso
diversificato):
nomeIstanza.nomeMetodoNonStatic(...)
nomeIstanza.nomeAttributoNonStatic
P.e.
maggiordomoIta.saluta();
altraValuta.tassoRif
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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 /

si intende lattributo tassoRif dellistanza riferita da


sterlina se si sta eseguendo linvocazione
sterlina.tassoConversione
() mentre si intende
sterlina.tassoConversione()
lattributo tassoRif dellistanza riferita da dollaro se
si sta eseguendo dollaro.tassoConversione
()
dollaro.tassoConversione()
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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;

Si aggiunge static per compilare

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Il driver non cambia . . .


public class ValutaDriver
{
public static void main (String args [])
{
Valuta sterlina = new Valuta("Sterlina",1.40);
Valuta dollaro = new Valuta("Dollaro",0.67);
Valuta franco = new Valuta("Franco Svizzero",0.60);
System.out.print
("Risultato 1 = ");
System.out.print("Risultato
System.out.println
(sterlina.tassoConversione
tassoConversione(dollaro));
(dollaro));
System.out.println(sterlina.
System.out.print
("Risultato 2 = ");
System.out.print("Risultato
System.out.println
(dollaro.tassoConversione
tassoConversione(sterlina));
(sterlina));
System.out.println(dollaro.
System.out.print
("Risultato 3 = ");
System.out.print("Risultato
System.out.println
(dollaro.tassoConversione
tassoConversione(franco));
(franco));
System.out.println(dollaro.
}
}

Fondamenti di Programmazione

. . . ma il risultato s !

Fondamenti di Programmazione

Uso di classi

21

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

New di un oggetto String


String saluto;
saluto = new String("Ciao ciao");

Ciao ciao

saluto

null

Fondamenti di Programmazione

Uso di classi

24

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Varianti sul tema


L'operatore new pu essere usato al
momento della definizione
String saluto = new String("Ciao ciao");
StringBuffer salutino = new StringBuffer("Bye");
StringBuffer saluto2 = new StringBuffer(saluto);

Solo per la classe String, in quanto di uso


molto comune, Java offre la forma compatta
String s = "Ciao ciao";

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Assegnamenti tra variabili di


tipi strutturati
String saluto1, saluto2, saluto3;
saluto1 = new String("Ciao ciao");
saluto2 = new String("Buongiorno");
...

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Assegnamenti tra variabili di


tipi strutturati
PRIMA
v1

DOPO

v1 = v2;
v1
null

v2
null

v2
null

v1

v1

v2

v2

Fondamenti di Programmazione

Uso di classi

28

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Confronti tra variabili di tipo


strutturato
E possibile applicare gli operatori di confronto == e
!= a variabili di tipo strutturato
Se uno dei due termini del confronto il valore null
si verifica se una certa variabile riferisce un oggetto
oppure no,
p.e. saluto3 != null
Se entrambi i termini del confronto sono variabili, si
verifica se hanno lo stesso valore (cio riferiscono
esattamente lo stesso oggetto)
Raramente questo desiderato e utile
Fondamenti di Programmazione

Uso di classi

30

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Confronto tra riferimenti vs.


confronto tra oggetti
Usare == fa il confronto tra i riferimenti non fra i
valori contenuti negli oggetti (p.e. le sequenze di
caratteri contenute nelle istanze di String)
Di solito si vogliono confrontare i contenuti non i
riferimenti: per questo si usa il metodo equals
Il metodo booleano equals della classe String accetta
come argomento il riferimento ad un altro oggetto e
ritorna true se le stringhe contenute sono uguali (in
modo case sensitive), false altrimenti
Il metodo booleano equalsIgnoreCase fa lo stesso
senza distinguere maiuscole/minuscole
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Una particolarit di String


Usare esplicitamente new oppure la forma
abbreviata per inizializzare un oggetto String
non esattamente la stessa cosa
Se si usa esplicitamente new, la Java Virtual
Machine crea oggetti distinti anche se di
contenuto uguale
Se non si usa esplicitamente new, la Java
Virtual Machine evita di creare oggetti distinti
ma dal contenuto uguale
Fondamenti di Programmazione

Uso di classi

33

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Una particolarit di String


String saluto1 = new String ("Buongiorno");
String saluto2 = new String ("Buongiorno");

saluto1

saluto2

Buongiorno

Buongiorno

metodi classe
String

metodi classe
String

Fondamenti di Programmazione

Una particolarit di String


String saluto1 = "Buongiorno";
String saluto2 = "Buongiorno";

saluto1

saluto2
Buongiorno
metodi classe
String

Fondamenti di Programmazione

Uso di classi

34

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Alcune distinzioni
a = "b";

a una variabile di tipo String


Il riferimento ad un oggetto
che contiene una stringa
composta dal solo carattere b
viene copiato dentro a

"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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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 = " ";

a una variabile di tipo String


Il riferimento ad un oggetto
che contiene una stringa
composta dal solo carattere
spazio viene copiato dentro a

""

Fondamenti di Programmazione

Uso di classi

36

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Alcune distinzioni
a = "";

a una variabile di tipo String


Il riferimento ad un oggetto
che contiene una stringa vuota
composta da nessun carattere
viene copiato dentro a
Non confondere stringa vuota
(detta anche nulla) con riferimento null

""

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Esempi di metodi di String


Tipo ritornato

Nome del metodo

public char charAt (int index)


index)

Lista argomenti attuali


(uno solo in questo caso)

Returns the character at the specified index.


index. An index ranges from 0 to
length()
length() - 1.
Lista argomenti attuali
(due in questo caso)
public String substring (int beginIndex,
beginIndex, int endIndex)
endIndex)
Tipo ritornato

Nome del metodo

Returns a new string that is a substring of this string. The substring


begins at the specified beginIndex and extends to the character at
index endIndex - 1. Thus the length of the substring is endIndexendIndexbeginIndex.
beginIndex.
Fondamenti di Programmazione

Uso di classi

38

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Esempi di metodi di String


Tipo ritornato

Nome del metodo


Lista argomenti attuali
public int length ()
(nessuno in questo caso)
Returns the length of this string. The length is equal to the number
of 1616-bit Unicode characters in the string.
Tipo ritornato

Nome del metodo


Lista argomenti attuali
public String toUpperCase ()
(nessuno in questo caso)
Converts all of the characters in this String to upper case using the rules
of the default locale.

N.B. Il metodo toUpperCase (cos come il metodo


corrispondente toLowerCase)
toLowerCase) restituisce un riferimento ad un
nuovo oggetto String:
String: quello iniziale rimane immutato !
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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.

N.B. I metodi della classe StringBuffer normalmente


modificano il contenuto delloggetto su cui sono invocati e
restituiscono un riferimento alloggetto stesso (anzich ad uno
nuovo, come normalmente fanno i metodi della classe String)
String)
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Argomenti attuali e formali


Ogni volta che si invoca un metodo si deve
specificare una lista di argomenti attuali
Gli argomenti attuali e formali sono in
corrispondenza posizionale
Gli argomenti attuali possono essere delle
variabili o delle espressioni
Gli argomenti attuali devono rispettare il tipo
attribuito agli argomenti formali
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

La ricerca del metodo


Capire se esistono una classe e/o un metodo
che fanno ci che ci serve non sempre
facile: esiste un mare di classi ognuna delle
quali pu contenere decine di metodi
I libri, gli esempi gi fatti, i programmatori pi
esperti possono essere indispensabili per
indirizzare la ricerca
In subordine, pu essere utile anche la ricerca
su Internet
Fondamenti di Programmazione

Uso di classi

43

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

La ricerca del metodo


Se nessuno ci indirizza e nemmeno Internet ci
aiuta si procede per tentativi seguendo
lordine logico:
individuare il package
individuare la classe
individuare il metodo

I nomi delle classi e dei metodi ci dovrebbero


aiutare
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Altro esempio di ricerca


Supponiamo di voler verificare se una
sequenza di caratteri ne contiene uno in
particolare: ci sar un metodo che lo fa per
noi ?
Essendo unoperazione fondamentale sui
caratteri la ricerca si orienta sul package
java.lang e sulle classi String o StringBuffer
Stavolta non facile ipotizzare un nome di
metodo, scorriamo la lista . . .
Fondamenti di Programmazione

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

Modulo di Fondamenti di Programmazione

P. Baroni - P.Martinelli - M. Rossi - A. Viola

Uso creativo dei metodi


Il metodo indexOf (nella versione che riceve
in ingresso un char) restituisce la posizione
della prima occorrenza nella stringa del char
specificato
Se nella stringa il char non c, restituisce -1
Quindi possiamo sapere se il char presente
o meno distinguendo tra risultati non negativi
e il risultato -1
Fondamenti di Programmazione

Ricerche senza successo


Ci interessa un metodo che calcoli il logaritmo
in base 2 di un numero
Essendo unoperazione matematica
fondamentale la ricerca si orienta sul package
java.lang e sulla classe Math
Ci sono il metodo log (base e) e il metodo
log10 (base 10), ma in base 2 non c
Dovremo scrivercelo noi
Fondamenti di Programmazione

Uso di classi

47