Formato PDF - Fondamenti di Informatica B

Transcript

Formato PDF - Fondamenti di Informatica B
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 l’uso di classi per due
problemi molto comuni: l’interazione con
l’utente e il trattamento di sequenze di
caratteri
Fondamenti di Programmazione
Uso di classi
1
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 all’uso” 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 all’uso 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
2
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 l’utilizzo 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
3
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 un’organizzazione
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 l’Input/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
4
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 l’uso 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
• All’atto 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
all’inizio 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
5
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
6
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)
• L’uso tipico è la costruzione di istanze (tramite
new) e quindi l’invocazione 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
7
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 l’operatore
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 l’operatore new
Fondamenti di Programmazione
Istanziabili vs. non istanziabili
• La stragrande maggioranza delle classi è
istanziabile ma l’esistenza 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
8
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 un’istanza 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
9
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 all’esecuzione dei suoi metodi
non ho bisogno di immaginare un’istanza
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 (un’ipotetica classe
Persona è istanziabile)
Fondamenti di Programmazione
Riconoscere una classe
istanziabile
• Ha costruttori
• Attributi e metodi sono tutti (o quasi) non
static
• Quando penso all’esecuzione dei suoi metodi
ho bisogno di immaginare un’istanza
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 l’attributo o
metodo è definito a livello di classe
• Se la parola static non è presente l’attributo 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 l’attributo o
metodo
è definito
livellovedere
di classe con
ha nulla
a ache
• Se
parola staticitaliano
non è presente
l’attributo 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 un’istanza (tramite operatore new)
• Ogni attributo o metodo static esiste
concretamente a livello di classe
– Esiste in un’unica 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 l’accesso/invocazione è possibile solo
tramite un’istanza 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 all’istanza su cui è stato
invocato il metodo
• P.e. nel corpo del metodo tassoConversione di Valuta
return tassoRif /…
si intende l’attributo tassoRif dell’istanza riferita da
sterlina se si sta eseguendo l’invocazione
sterlina.tassoConversione
(…) mentre si intende
sterlina.tassoConversione(…)
l’attributo tassoRif dell’istanza 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 un’istanza
• Nel corpo di un metodo non static si può accedere a
qualunque attributo e metodo della stessa classe (se
esiste l’istanza 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
L’uso 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
3
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 all’invocazione 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
all’oggetto 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
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
a
‘’
Fondamenti di Programmazione
Alcune distinzioni
a = " ";
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
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 dell’oggetto su cui sono invocati e
restituiscono un riferimento all’oggetto stesso (anziché ad uno
nuovo, come normalmente fanno i metodi della classe String)
String)
Fondamenti di Programmazione
Invocazione di metodi
• L’invocazione 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 l’elenco 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
l’ordine 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 all’intero più vicino: ci sarà un
metodo che lo fa per noi ?
• Essendo un’operazione 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, l’altro 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 un’operazione 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 un’operazione 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