1Definizione di classi
Corso di Laurea Ingegneria Civile
Fondamenti di Informatica
Dispensa 19
Definizione di classi
Maggio 2010
2Definizione di classi
Contenuti
Classi per istanziare oggetti
Esempio: la classe Punto
Variabili d’istanza
Metodi d’istanza
Costruttori
Ulteriori aspetti nella definizione di classi
auto-referenziazione
i metodi toString e equals
sovraccarico del costruttore
metodi di classe
variabili di classe
classi e oggetti
occultamento dell’informazione
Esempi: le classi Quadrato, Triangolo
Esercizi
3Definizione di classi
Prerequisiti
Questo capitolo presuppone la conoscenza
degli argomenti già trattati nelle
precedenti lezioni di questo corso, con
particolare riferimento al capitolo 12 del
libro di testo
4Definizione di classi
Definizione di classi
In questo capitolo vengono presentati i
concetti relativi alla definizione di classi per
istanziare oggetti
gli aspetti fondamentali del linguaggio Java nella
definizione di classi
alcuni aspetti metodologici
Nota Bene – Va ricordato che la definizione di
una nuova classe implicitamente definisce un
nuovo tipo riferimento
5Definizione di classi
Classi per istanziare oggetti
Una classe per istanziare oggetti è il progetto
per una tipologia di oggetti istanza che sono
caratterizzati da
uno stato, ovvero da un insieme di proprietà
• variabili d’istanza
un comportamento, ovvero sanno eseguire delle
operazioni
• metodi d’istanza
Un metodo per la loro creazione ovvero per una
opportuna inizializzazione del loro stato
• costruttori
6Definizione di classi
Esempio: la classe Punto
Una classe per istanziare oggetti ha lo scopo di
rappresentare una certa tipologia di oggetti
la definizione di una classe parte dalla domanda
• che cosa deve rappresentare un oggetto della classe?
La classe Punto
nell’ambito di una applicazione geometrica, si
vogliono rappresentare e gestire dei punti in uno
spazio bidimensionale
ciascun oggetto della classe Punto modella un punto
in uno spazio bidimensionale
7Definizione di classi
Struttura della classe Punto
/* Un oggetto Punto rappresenta un punto
* in uno spazio bidimensionale. */
class Punto {
... dichiarazione di variabili d'istanza ...
... definizione di costruttori ...
... definizione di metodi d'istanza ...
}
8Definizione di classi
Caratterizzazione dello stato e
del comportamento
La classe Punto è così caratterizzata
lo stato di un oggetto Punto può essere descritto
mediante una coppia di coordinate (X,Y)
• 2 variabili d’istanza
bisogna poter creare un oggetto Punto in modo
parametrico rispetto alle sue coordinate (X,Y)
• un costruttore (con due parametri)
un oggetto Punto deve saper eseguire le seguenti
operazioni da realizzare con tre metodi d’istanza
• accedi alla coordinata X del punto
• accedi alla coordinata Y del punto
9Definizione di classi
La classe e oggetti Punto
...
Punto
«costruttori»
Punto(double xx,
double yy)
«operazioni»
double getX()
double getY()
(1.0, -1.0)
p1 : Punto
double getX()
double getY()
(0.0, 0.0)
p : Punto
double getX()
double getY()
(1.0, -1.0)
p2 : Punto
double getX()
double getY()
10Definizione di classi
Variabili d’istanza . . .
La realizzazione di una classe prosegue con la
scelta e la dichiarazione delle variabili per
rappresentare lo stato degli oggetti
le variabili d’istanza sono variabili che servono a
rappresentare lo stato di un oggetto della classe
La classe Punto
lo stato di un oggetto Punto è costituito da una
coppia di coordinate (X,Y)
può essere rappresentato mediante le variabili
d’istanza x e y
11Definizione di classi
. . . Variabili d’istanza . . .
/* Un oggetto Punto rappresenta un punto
* in uno spazio bidimensionale.
* (Prima versione- parziale.) */
class Punto {
/* Coordinata x del punto. */
private double x;
/* Coordinata y del punto. */
private double y;
}
12Definizione di classi
. . . Variabili d’istanza
x : double
y : double
Punto
x = 1.0
y = -1.0
p1 : Punto x = 0.0
y = 0.0
p : Punto
x = 1.0
y = -1.0
p2 : Punto
13Definizione di classi
Accesso a variabili d’istanza
Si supponga di aver creato un oggetto Punto e
di aver assegnato un valore alle sue variabili
d’istanza
Punto p1;
p1 = new Punto(1,-1);
Le variabili d’istanza di un oggetto possono
essere accedute all’interno della classe
System.out.println(p1.x); // visualizza 1.0
p1.y = 2; // ora p1 è il punto (1,2)
x = 1.0
y = -1.0
p1 : Puntop1
Punto
14Definizione di classi
Metodi d’istanza
La realizzazione di una classe prosegue con
l’implementazione delle operazioni e dei
costruttori
un metodo d’istanza è un metodo
• la cui esecuzione può essere richiesta inviando un
messaggio a un oggetto istanza
La classe Punto deve contenere le definizioni
dei metodi d’istanza
•double getX()
•double getY()
15Definizione di classi
Costruttori
Gli oggetti istanza devono essere creati
esplicitamente, mediante l’operatore new e
l’invocazione di un costruttore che, in modo
parametrico, inizializza lo stato dell’oggetto
creato
un costruttore consente di inizializzare lo stato di un
oggetto appena creato
La classe Punto deve contenere le definizioni
del costruttore che ha lo stesso nome della
classe
Punto(double xx, double yy)
16Definizione di classi
La classe Punto . . .
/* Un oggetto Punto rappresenta un punto sul piano */
class Punto {
/* Coordinata x del punto. */
private double x;
/* Coordinata y del punto. */
private double y;
/* Crea un nuovo Punto di coordinate (xx,yy). */
public Punto(double xx, double yy) {
this.x = xx;
this.y = yy;
}
. . .
17Definizione di classi
. . . La classe Punto
. . .
/* Restituisce la coordinata x di questo punto. */
public double getX() {
return this.x; }
/* Restituisce la coordinata y di questo punto. */
public double getY() {
return this.y; }
}
18Definizione di classi
Il metodo toString
Spesso è utile avere un metodo che calcola una
descrizione testuale di un oggetto
ad esempio, Punto[x=1.0,y=-1.0]
è compito del metodo String toString()
• questo metodo ha un significato speciale in Java
/* Calcola una descrizione testuale di questo punto. */
public String toString() {
return "Punto[x=" + x + ",y=" + y + "]";
}
19Definizione di classi
Il metodo equals
È utile anche definire un metodo boolean
equals(...) per verificare l’uguaglianza tra due
oggetti istanza della classe
anche questo metodo ha un significato speciale in
Java
/* Verifica se questo punto è uguale al Punto p. */
public boolean equals(Punto p) {
// pre: p!=null
return (this.x==p.x) && (this.y==p.y);
}
20Definizione di classi
Sovraccarico del costruttore
Una classe può definire anche più di un
costruttore, il cui nome sarà sovraccarico
un costruttore senza argomenti
/* Crea un nuovo Punto di coordinate (0,0). */
public Punto() {
this.x = 0;
this.y = 0; }
un costruttore di copia
/* Crea un nuovo Punto uguale al Punto p. */
public Punto(Punto p) {
// pre: p!=null
this.x = p.x;
this.y = p.y;}
21Definizione di classi
Classe e oggetti Punto
x : double
y : double
Punto
«costruttori»
Punto()
Punto (double x, double y)
Punto(Punto p)
«operazioni d’istanza»
double getX()
double getY()
String toString()
boolean equals(Punto p)
x = 1.0
y = -1.0
p2 : Punto
double getX()
double getY()
void trasla(double dx, double dy)
String toString()
boolean equals(Punto p)
x = 1.0
y = -1.0
p1 : Punto
double getX()
double getY()
void trasla(double dx, double dy)
String toString()
boolean equals(Punto p)
x = 0.0
y = 0.0
p : Punto
double getX()
double getY()
String toString()
boolean equals(Punto p)
Complessivamente si ha:
22Definizione di classi
Occultamento dell’informazione
Le variabili d’istanza di una classe vengono normalmente
dichiarate private class Punto {
/* Coordinata x del punto. */
private double x;
/* Coordinata y del punto. */
private double y;
...
}
Una variabile d’istanza privata può essere acceduta solo
da oggetti costruiti dalla classe
nell’ambito di istruzioni scritte nella classe
Una variabile d’istanza privata non può essere acceduta
da oggetti di altre classi
nell’ambito di istruzioni scritte in altre classi
23Definizione di classi
Uso della classe Punto . . .
Una caratterizzazione più precisa del
comportamento della classe Punto
Scrivere una applicazione di prova che acquisisce due
oggetti di tipo Punto e calcola la distanza tra essi
• Si usa una classe applicazione (che contiene il ―main‖)
• Bisogna creare gli oggetti definiti nella classe e usarli
Definizione della classe punto
• Punto.java
Uso degli oggetti di tipo Punto (classe Punto)
• UsoPunto.java
• Al suo interno definiamo il metodo di classe ―distanza‖
24Definizione di classi
. . . Uso della classe Punto
Class UsoPunto{
Public static void main(Strig[] args){
Punto p, p1, p2; // tre punti nel piano
p = new Punto(0,0); // p è l'origine del piano
p1 = new Punto(1,-1); // p1 è il punto di coordinate
// (1,-1)
p2 = new Punto(1,-1); // un altro punto di coordinate
// (1,-1)
System.out.println(p1.getX()); // visualizza 1.0
System.out.println(p1.getY()); // visualizza -1.0
System.out.println(distanza(p1,p2));
}
}
25Definizione di classi
Distanza tra due punti
Un metodo che calcola e restituisce la distanza
tra due punti – metodo di classe/* Calcola la distanza tra gli oggetti Punto p1 e p2.*/
public static double distanza(Punto p1, Punto p2) {
double qd; // quadrato della distanza
/* calcola il quadrato della distanza */
qd = (p1.x-p2.x)*(p1.x-p2.x) +
(p1.y-p2.y)*(p1.y-p2.y);
/* calcola e restituisce la distanza */
return Math.sqrt(qd);
}
26Definizione di classi
La classe Quadrato . . .
Si vuole definire la classe Quadrato per istanziare oggetti un oggetto Quadrato modella un quadrato
lo stato di un oggetto Quadrato consiste nella lunghezza del suo lato
per creare un oggetto Quadrato è richiesta la lunghezza del lato come parametro
un oggetto Quadrato deve saper eseguire le seguenti operazioni
• lato() — restituisce il lato del quadrato
• area() — calcola e restituisce l’area del quadrato
• perimetro() — calcola e restituisce il perimetro del quadrato
• diagonale() — calcola e restituisce la diagonale del quadrato
27Definizione di classi
. . . La classe Quadrato
Diagramma classi per Quadrato
28Definizione di classi
Uso della classe Quadrato/* Applicazione di prova per la classe Quadrato. */
class TestQuadrato {
public static void main(String[] args) {
Quadrato p, q; // due quadrati
double areaP; // area del quadrato p
double perimetroQ; // perimetro del quadrato q
/* crea i due quadrati */
p = new Quadrato(10);
q = new Quadrato(20);
/* calcola e visualizza l'area di p */
areaP = p.area();
System.out.println(areaP); // 100
/* calcola e visualizza il perimetro di q */
perimetroQ = q.perimetro();
System.out.println(perimetroQ); // 80
}
}
29Definizione di classi
La classe Quadrato
Ricordiamo come si definisce una classe per
istanziare oggetti
bisogna dichiarare le variabili d’istanza
• in questo caso, c’è bisogno di una variabile che rappresenta
il lato del quadrato
bisogna definire (almeno) un costruttore per la
classe
bisogna definire un metodo per ciascuna operazione
che gli oggetti della classe devono saper eseguire
• in questo caso, si devono definire i metodi lato(), area(),
perimetro() e diagonale()
30Definizione di classi
La classe Quadrato — variabili d’istanza
/* Un oggetto Quadrato rappresenta
* un quadrato. */
class Quadrato {
/* lato del quadrato */
private double lato;
... segue ...
31Definizione di classi
La classe Quadrato — il costruttore
... segue ...
/* Crea un nuovo Quadrato di lato l. */
public Quadrato(double l) {
// pre: l>0
this.lato = l;
}
... segue ...
32Definizione di classi
La classe Quadrato — il metodo lato()
. . . segue . . .
/* Calcola il lato del quadrato. */
public double getLato() {
/* restituisce il lato */
return this.lato;
}
. . . segue . . .
Esercizio - Completare la definizione della
classe con la definizione degli altri metodi
d’istanza previsti
33Definizione di classi
Esecuzione di TestQuadrato
Lo stato di ogni oggetto istanza è indipendente
da quello degli altri oggetti istanza della stessa
classe
34Definizione di classi
Esercizio: la classe Triangolo . . .
Si vuole definire la classe Triangolo per istanziare
oggetti
un oggetto Triangolo modella un triangolo sul piano cartesiano
lo stato di un oggetto Triangolo consiste nella conoscenza delle
coordinate dei suoi vertici tre vertici v1, v2 e v3
per creare un oggetto Triangolo sono richiesti, come parametri,
i valori delle coordinate dei suoi vertici
un oggetto Triangolo deve saper eseguire, tra altre possibili, la
seguente operazione:
• perimetro() — calcola e restituisce il perimetro del triangolo
35Definizione di classi
Esercizi — Altre classi per i triangoli
Definire la classe TriangoloEquilatero il cui stato consiste nella
lunghezza del suo lato ed è capace di calcolare il suo lato, il suo
perimetro e la sua area
Suggerimento: Ricordarsi le specifiche (simili) della definizione
della classe Quadrato
Definire la classe TriangoloRettangolo il cui stato consiste nella
lunghezza dei suoi cateti ed è capace di calcolare la sua ipotenusa,
oltre a saper eseguire altre operazioni da scegliere
Suggerimento: Ricordarsi le specifiche (simili) della definizione
della classe TriangoloEquilatero e la classe Ipotenusa già vista in
precedenza
Definire classi per altre tipologie di triangolo a piacere
36Definizione di classi
Esercizi — Classe Quadrato
Definire una classe QuadratoSulPiano per definire quadrati sul piano cartesiano con i lati paralleli agli assi lo stato di un oggetto QuadratoSulPiano consiste
nella conoscenza delle coordinate dei suoi vertici vbs in basso a sinistra e vad in alto a destra, mentre le operazioni sono le stesse della classe Quadrato
Nella classe QuadratoSulPiano aggiungere
metodi di classe per verificare se
due quadrati hanno lo stesso lato
due quadrati hanno la stessa area
due quadrati sono uno interno all’altro
37Definizione di classi
Esercizio — Classe Rettangolo
Definire una classe Rettangolo
ciascun oggetto Rettangolo rappresenta un
rettangolo in un piano bidimensionale, ortogonale
rispetto agli assi cartesiani
1 2 3 4 5 6 7 8
1
2
3
4
5
6
r1
r2
x
y
38Definizione di classi
Caratterizzazione della classe
Rettangolo
Comportamento un rettangolo deve saper calcolare
• la sua base
• la sua altezza
• la sua area
un rettangolo deve sapersi traslare di (DX,DY)
bisogna poter calcolare l’intersezione tra due rettangoli
Stato lo stato di un rettangolo deve rappresentare
• le sue dimensioni
• la sua posizione nel piano
• le posizioni dei suoi vertici
39Definizione di classi
Esercizi — Altri oggetti
Definire una classe Libro per rappresentare oggetti libro
con il nome dell’autore, il titolo e il numero di pagine e
con opportuni metodi d’istanza tra cui un metodo del
tipo String toString() per la sua descrizione
Definire una classe LineaBus per rappresentare oggetti
linea di autobus urbano con il numero identificativo, il
nome dei due capolinea e con opportuni metodi
d’istanza tra cui un metodo del tipo String toString() per
la descrizione del suo percorso
40Definizione di classi
Esercizi — Altri oggetti
Definire una classe Auto per rappresentare oggetti
automobile con il nome della marca, il nome del
modello, la targa e l’anno di immatricolazione e con
opportuni metodi d’istanza tra cui un metodo del tipo
String toString() per la sua descrizione
Definire una classe Studente per rappresentare oggetti
studente con il cognome, il nome, il codice fiscale, il
numero di matricola e con opportuni metodi d’istanza
tra cui un metodo del tipo String toString() per la sua
descrizione
41Definizione di classi
Cosa abbiamo visto finora
Tipi riferimento e classi
Esempi ed esercizi di definizione di classi
per istanziare oggetti
42
Riepilogo della dispensa
Tipologie di classi
Classi applicazione – eseguibili, contengono il metodo
main
Classi che corrispondono alla creazione di un singolo
oggetto software – ad esempio la classe Math o la classe
System.out
Classi che definiscono il progetto di una tipologia di
oggetti – ad esempio la classe Televisore, da esse si
istanziano oggetti (classi per istanziare oggetti)
43
Riepilogo della dispensa
Nelle Classi per istanziare oggetti si definiscono: Variabili d’istanza
Almeno un costruttore
Metodi di istanza• Metodi get - per accedere al valore delle variabili d’istanza
• Metodi set - per modificare il valore delle variabili d’istanza
• Metodo equals - per confrontare due oggetti istanza: in genere verifica l’uguaglianza dei valori delle variabili d’istanza
• Metodo toString – per avere una descrizione testuale dell’oggetto istanza
• Altri metodi d’istanza
Eventuali metodi di classe
44
Riepilogo della dispensa
Classi per istanziare oggetti - Esempio Classe Televisore: Variabili d’istanza – assumono in generale valori
• differenti per i vari oggetti
• indipendenti dai valori assunti negli altri oggetti
• Es. stato (acceso/spento), marca, modello
Costruttore• Inizializza le variabili d’istanza, ad esempio lo stato a spento
Metodi di istanza• Metodi get – ad esempio getStato()
• Metodi set – ad esempio setStato(String s)
• Metodo equals – metodo che verifica se due televisori hanno lo stesso stato, marca, modello
• Metodo toString – per avere una descrizione testuale dell’oggetto
45
Riepilogo della dispensa
Variabili d’istanza
Possono essere accedute con
riferimentoall’oggetto.nomedellavariabile
Un metodo d’istanza o un costruttore accede alle variabili
d’istanza dell’oggetto che lo sta eseguendo direttamente
col loro nome o attraverso la parola chiave this
(necessaria se una variabile locale o un parametro ha
uguale nome della variabile d’istanza)
Se le variabili d’istanza sono dichiarate private è
possibile accedervi e modificarle solo attraverso i metodi
pubblici get e set
46
Riepilogo della dispensa
Operatore new e costruttori Gli oggetti vengono creati attraverso l’operatore new e le
loro variabili d’istanza vengono inizializzate attraverso il costruttore
Triangolo t;
t = new Triangolo(1,2,4,6,8,1);
Un costruttore ha:• uguale nome della classe
• elenco dei parametri
• modificatore public
• non ha tipo di ritorno
public Punto(double xx, double yy)
Una classe può avere più costruttori che si differenziano nell’elenco dei parametri
47
Riepilogo della dispensa
Metodi d’istanza e metodi di classe I metodi d’istanza sono i metodi che l’oggetto sa eseguire
e vengono richiamati come
o.metodo(parametri);
Dove o e’ una variabile che rappresenta un dato oggetto
Ad esempio p1.getX();
I metodi di classe non sono legati ad un dato oggetto, ma agiscono solo in base ai parametri del metodo. Nella loro definizione compare la parola chiave static. Vengono richiamati come:
metodo(parametri) – all’interno della classe
Classe.metodo(parametri) - all’esterno della classe (es.
Punto.distanza(p1,p2)
48Definizione di classi
Riepilogo della dispensa
Uso di oggetti
Tutti questi metodi vengono scritti in una classe (es.
Oggetto.java) che viene compilata ma non puo’ essere
eseguita
• Non e’ una classe applicazione – non contiene il main
L’oggetto definito in questa classe viene
effettivamente utilizzato da un’altra classe
applicazione (es. UsoOggetto.java) che crea gli
oggetti di tipo Oggetto con il costruttore new e che li
gestisce (può usare anche i metodi di classe con
Oggetto.metodo(parametri))
49Definizione di classi
Riferimenti al libro di testo
Per lo studio di questi argomenti si fa
riferimento al libro di testo, e in particolare al
capitolo 18
Nei file .java allegati a questa dispensa si
trova Il codice completo degli esempi mostrati