Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Definizione di classi
Capitolo 18
febbraio 2004
1
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Classi per istanziare oggetti
Una classe per istanziare oggetti è il progetto per una tipologia di
oggetti istanza
 è una descrizione composta dalle dichiarazioni e definizioni
necessarie a rappresentare le caratteristiche di tali oggetti
 variabili d’istanza
 metodi d’istanza
 costruttori
2
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio: la classe Punto
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
/* 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 ...
}
3
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Caratterizzazione dello stato e del comportamento
La classe Punto
 stato
 una coppia di coordinate (X,Y)
 comportamento
 accedi alla coordinata X del punto
 accedi alla coordinata Y del punto
 trasla il punto di (DX,DY)
 modalità di creazione
 creazione parametrica rispetto alle sue coordinate
4
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uso della classe Punto
Punto p, p1, p2;
// tre punti nel piano
p = new Punto(0,0);
p1 = new Punto(1,-1);
//
//
//
//
//
p2 = new Punto(1,-1);
p è l'origine del piano
p1 è il punto di coordinate
(1,-1)
un altro punto di coordinate
(1,-1)
System.out.println(p1.getX());
System.out.println(p1.getY());
// visualizza 1.0
// visualizza -1.0
p1.trasla(4,3);
// ora p1 ha coordinate (5,2)
System.out.println(p1.getX());
// visualizza 5.0
System.out.println(p1.getY());
// visualizza 2.0
5
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Punto
p : Punto
Punto
(0.0, 0.0)
...
p1 : Punto
«costruttori»
Punto(double xx,
double yy)
«operazioni»
double getX()
double getY()
void trasla(double dx,
double dy)
(1.0, -1.0)
double getX()
double getY()
void trasla(double dx,
double dy)
double getX()
double getY()
void trasla(double dx,
double dy)
p2 : Punto
(1.0, -1.0)
double getX()
double getY()
void trasla(double dx,
double dy)
6
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Variabili d’istanza
Le variabili d’istanza sono variabili che servono a rappresentare
lo stato di un oggetto della classe
La classe Punto
 le coordinate di un Punto possono essere rappresentate dalle
variabili d’istanza x e y
/* Un oggetto Punto rappresenta un punto
* in uno spazio bidimensionale. (Prima versione.) */
class Punto {
/* Coordinata x del punto. */
public double x;
/* Coordinata y del punto. */
public double y;
}
7
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Variabili d’istanza
p : Punto
Punto
p1 : Punto
x : double
y : double
x = 1.0
y = -1.0
x = 0.0
y = 0.0
p2 : Punto
x = 1.0
y = -1.0
8
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Accesso a variabili d’istanza
Punto p1;
p1 = new Punto(1,-1);
p1
p1 : Punto
Punto
System.out.println(p1.x);
p1.y = 2;
9
Definizione di classi
x = 1.0
y = -1.0
// visualizza 1.0
// ora p1 è il punto (1,2)
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio: Distanza tra due punti
/* 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);
}
10
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi d’istanza
Un metodo d’istanza è un metodo
 la cui esecuzione può essere richiesta inviando un messaggio
a un oggetto istanza
 viene eseguito dall’oggetto istanza a cui è stata richiesta
l’esecuzione
 l’oggetto che esegue un metodo d’istanza può referenziare
se stesso con la parola this (questo)
Metodi d’istanza per la classe Punto
 double getX()
 double getY()
 void trasla(double dx, double dy)
11
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Punto
/* Un oggetto Punto rappresenta un punto
* in uno spazio bidimensionale. (Seconda versione.) */
class Punto {
/* Coordinata x del punto. */
public double x;
/* Coordinata y del punto. */
public double y;
/* 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;
}
/* Trasla questo punto di (dx,dy). */
public void trasla(double dx, double dy) {
this.x += dx;
this.y += dy;
}
}
12
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Costruttori
Un costruttore consente di inizializzare lo stato di un oggetto
appena creato
Costruttori per la classe Punto
 Punto(double xx, double yy)
13
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Punto
/* Un oggetto Punto rappresenta un punto
* in uno spazio bidimensionale. (Terza versione.) */
class Punto {
/* Coordinata x del punto. */
public double x;
/* Coordinata y del punto. */
public double y;
/* Crea un nuovo Punto di coordinate (xx,yy). */
public Punto(double xx, double yy) {
this.x = xx;
this.y = yy;
}
... metodi d'istanza ...
}
14
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ulteriori aspetti nella definizione di classi
Ulteriori aspetti nella definizione di classi
 sempre con riferimento alla classe Punto
15
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Auto-referenziazione
Un oggetto può accedere alle proprie variabili d’istanza anche
senza specificare il riferimento this
/* Restituisce la coordinata x di questo punto. */
public double getX() {
return x;
}
16
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Quando è necessario usare this
Se una classe dichiara una variabile d’istanza var e un metodo o
costruttore dichiara anche una variabile locale var, allora in quel
metodo o costruttore
 l’espressione this.var denota la variabile d’istanza var
 l’espressione var denota la variabile locale var
/* Crea un nuovo Punto di coordinate (x,y). */
public Punto(double x, double y) {
this.x = x;
this.y = y;
}
17
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il metodo toString
Il metodo String toString() ha il compito di calcolare una
descrizione testuale di un oggetto
 ad esempio, Punto[x=1.0,y=-1.0]
/* Calcola una descrizione testuale di questo punto. */
public String toString() {
return "Punto[x=" + x + ",y=" + y + "]";
}
18
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il metodo equals
Il metodo boolean equals(...) deve verificare l’uguaglianza tra
due oggetti istanza della classe
/* 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);
}
19
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Sovraccarico del costruttore
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;
}
20
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi di classe
Una classe per istanziare oggetti può anche definire dei metodi 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);
}

invocazione di un metodo di classe
pa = new Punto(1,1);
pb = new Punto(4,5);
dist = Punto.distanza(pa,pb);
21
Definizione di classi
// 5.0
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Variabili di classe
Una classe per istanziare oggetti può anche dichiarare delle
variabili di classe
22
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Classi e oggetti
«oggetto classe»
Punto
Punto
double distanza(Punto p1, Punto p2)
x : double
y : double
«costruttori»
Punto()
Punto (double x, double y)
Punto(Punto p)
«operazioni d’istanza»
double getX()
double getY()
void trasla(double dx, double dy)
String toString()
boolean equals(Punto p)
«operazioni di classe»
static double distanza(Punto p1, Punto p2)
23
Definizione di classi
p2 : Punto
p1 : Punto
x = 1.0
y = -1.0
x = 1.0
y = -1.0double getX()
double getY()
void trasla(double dx, double dy)
double
p : getX()
Punto
String toString()
double getY()
x
=
0.0
boolean
p)
void trasla(double dx,
doubleequals(Punto
dy)
y
=
0.0
String toString()
double boolean
getX() equals(Punto p)
double getY()
void trasla(double dx, double dy)
String toString()
boolean equals(Punto p)
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
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;
...
}

da chi può essere acceduta una variabile d’istanza privata?
Occultamento dell’informazione
 un principio basilare della programmazione orientata agli
oggetto
24
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio: la classe Rettangolo
Si vuole definire una classe Rettangolo
 un oggetto Rettangolo rappresenta un rettangolo in un piano
bidimensionale, ortogonale rispetto agli assi cartesiani
y
6
r2
5
4
r1
3
2
1
1
25
2
3
4
Definizione di classi
5
6
7
8
x
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
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
26
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Scelta delle variabili d’istanza
Sono possibili diverse scelte per le variabili d’istanza di
Rettangolo
 la nostra scelta
 il punto vbs (vertice in basso a sinistra) – di tipo Punto –
ad esempio, (2,1)
 il punto vad (vertice in alto a destra) – di tipo Punto – ad
esempio, (7,4)
27
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Rettangolo
/* Un oggetto Rettangolo rappresenta un rettangolo in
* uno spazio bidimensionale, i cui lati sono entrambi
* paralleli agli assi cartesiani del piano. */
class Rettangolo {
/* Vertice in basso a sinistra. */
private Punto vbs;
/* Vertice in alto a destra. */
private Punto vad;
...
}
28
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Costruttori
Due costruttori per la classe Rettangolo
/* Crea un nuovo Rettangolo tra i punti p1 e p2. */
public Rettangolo(Punto p1, Punto p2) {
// pre: p1!=null && p2!=null
this.vbs = new Punto(Math.min(p1.getX(),p2.getX()),
Math.min(p1.getY(),p2.getY()));
this.vad = new Punto(Math.max(p1.getX(),p2.getX()),
Math.max(p1.getY(),p2.getY()));
}
/* Crea un nuovo Rettangolo che è inizialmente uguale
* al Rettangolo r. */
public Rettangolo(Rettangolo r) {
// pre: r!=null
this.vbs = new Punto(r.vbs);
this.vad = new Punto(r.vad);
}
29
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi
Per la classe Rettangolo si vogliono definire i seguenti metodi
d’istanza
 double base()
 double altezza()
 void trasla(double dx, double dy)
 boolean equals(Rettangolo r)
 String toString()
Si vuole inoltre definire il seguente metodo di classe
 Rettangolo intersezione(Rettangolo r1, Rettangolo r2)
30
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi d’istanza
/* Calcola la base di questo rettangolo. */
public double base() {
return vad.getX() - vbs.getX();
}
/* Calcola l'altezza di questo rettangolo. */
public double altezza() {
return vad.getY() - vbs.getY();
}
/* Calcola l'area di questo rettangolo. */
public double area() {
return this.base()*this.altezza();
}
/* Trasla questo rettangolo di dx in orizzontale
* e di dy in verticale. */
public void trasla(double dx, double dy) {
vbs.trasla(dx,dy);
vad.trasla(dx,dy);
}
31
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi d’istanza
/* Verifica se questo rettangolo è uguale
* al Rettangolo r. */
public boolean equals(Rettangolo r) {
// pre: r!=null
return (this.vbs.equals(r.vbs)) &&
(this.vad.equals(r.vad));
}
/* Restituisce una descrizione di questo rettangolo. */
public String toString() {
return "Rettangolo[vbs=" + vbs.toString() +
",vad=" + vad.toString() + "]";
}
32
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Intersezione tra due rettangoli
/* Calcola il rettangolo intersezione tra r1 e r2.
* Restituisce null se l'intersezione è vuota. */
public static Rettangolo intersezione(Rettangolo r1,
Rettangolo r2) {
// pre: r1!=null && r2!=null
Rettangolo inters;
// intersezione di r1 e r2
if (r1.vbs.getX()>r2.vad.getX() ||
r1.vbs.getY()>r2.vad.getY() ||
r1.vad.getX()<r2.vbs.getX() ||
r1.vad.getY()<r2.vbs.getY())
inters = null;
else
inters =
new Rettangolo(
new Punto(Math.max(r1.vbs.getX(),r2.vbs.getX()),
Math.max(r1.vbs.getY(),r2.vbs.getY())),
new Punto(Math.min(r1.vad.getX(),r2.vad.getX()),
Math.min(r1.vad.getY(),r2.vad.getY())));
return inters;
}
33
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uso della classe Rettangolo
Rettangolo r1, r2;
Rettangolo r12;
// due rettangoli
// l'intersezione di r1 e r2
r1 = new Rettangolo(new Punto(2,4),new Punto(7,1));
System.out.println(r1);
// Rettangolo[vbs=Punto[x=2.0,y=1.0],vad=Punto[x=7.0,y=4.0]]
r2 = new Rettangolo(new Punto(0,0),new Punto(3,4));
r2.trasla(5,2);
System.out.println(r2);
// Rettangolo[vbs=Punto[x=5.0,y=2.0],vad=Punto[x=8.0,y=6.0]]
r12 = Rettangolo.intersezione(r1,r2);
System.out.println(r12);
// Rettangolo[vbs=Punto[x=5.0,y=2.0],vad=Punto[x=7.0,y=4.0]]
34
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Classi per oggetti dati
Si consideri una classe Giocatore
 un oggetto Giocatore rappresenta il nome di un giocatore e il
suo punteggio corrente
 un giocatore può essere creato specificando il suo nome e il
suo punteggio iniziale
 il suo nome può essere acceduto mediante il metodo String
getNome()
 il suo punteggio può essere acceduto mediante il metodo int
getPunteggio()
 il suo punteggio può essere modificato mediante il metodo
void setPunteggio(int p)
Un oggetto dati è un oggetto i cui metodi consentono solo
l’accesso o la modifica diretta delle sue variabili
 proprietà
 metodi accessori
 metodi modificatori
35
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Giocatore
/* Un oggetto Giocatore rappresenta il nome e il punteggio
* di un giocatore di un gioco a punti. */
class Giocatore {
/* Il nome del giocatore. */
private String nome;
/* Il punteggio corrente del giocatore. */
private int punteggio;
/* Crea un nuovo Giocatore,
* dati il nome e il punteggio iniziale. */
public Giocatore(String nome, int punteggio) {
this.nome = nome;
this.punteggio = punteggio;
}
}
36
/* Restituisce il nome di questo Giocatore. */
public String getNome() {
return nome;
}
/* Restituisce il punteggio corrente di questo Giocatore. */
public int getPunteggio() {
return punteggio;
}
/* Cambia il punteggio a questo Giocatore. */
public void setPunteggio(int p) {
this.punteggio = p;
}
Definizione di classi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl