Corso di Laurea Ingegneria Civile Fondamenti di Informaticaelinf/0910/materiale0910/19... · Il...

Post on 21-Aug-2020

4 views 0 download

Transcript of Corso di Laurea Ingegneria Civile Fondamenti di Informaticaelinf/0910/materiale0910/19... · Il...

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