Fondamenti di Programmazione
Prof.ssa Elisa Tiezzi
Programmazione orientata a oggetti
1
Programmazione OO
Dati  Istruzioni = Metodi
• Concetti base:
– dati
– istruzioni
• Dati:
– variabili
– tipi
Programmazione Procedurale
Dati  Metodi = Classi
• Istruzioni:
– istruzioni base
– strutture di controllo
– sotto-programmi
Programmazione a Oggetti
2
Cosa è un oggetto
Variabili
(stato)
Metodi
(comportamenti)
Un oggetto è una “scatola” software contenente
variabili (che descrivono lo stato di un oggetto)
e metodi (detti suoi membri, definiscono
i comportamenti)
3
Esempio: i numeri razionali
razionale 3/4
Istanza:
un preciso oggetto
Variabili di istanza (campi):
contengono i valori (lo stato) del
numero razionale
Metodi di istanza:
agiscono sul numero razionale
add
3
num
div
4
4
Cosa è un messaggio
Gli oggetti interagiscono e comunicano tra loro usando i messaggi
per ottenere maggiori funzionalità e comportamenti più complessi
isBigger(razionale di confronto)
num
den
altro oggetto utilizzato
dal programma
razionale 3/4
5
Usare gli oggetti
•
•
•
Inviare un messaggio ad un oggetto significa invocare un metodo
dell’oggetto
Accedere alle variabili di istanza di un oggetto significa poter
manipolare o ispezionare il loro valore
Sintassi per invocare un metodo/accedere alle variabili di istanza di
un oggetto:
–
all’interno della definizione di un oggetto:
metodo(lista_di_parametri)
variabile
–
all’esterno della definizione di un oggetto (operatore ‘.’):
riferimentoOggetto.metodo(lista_di_parametri)
riferimentoOggetto.variabile
6
Cosa è una classe
Una classe è un “prototipo” che definisce le
variabili e i metodi comuni a tutti gli oggetti di un
certo tipo.
Una classe è solo il modello di un oggetto e
pertanto non riserva spazio di memoria per i suoi
dati.
Ogni oggetto ha il suo spazio dati, un oggetto è
un’istanza di una classe.
7
Esempio
classe Rational
Tutti gli oggetti di tipo Rational
possiedono i due campi interi
num e den ed almeno i 6
metodi riportati
add
int num
int den
8
oggetto 8/15
istanza di Rational
add
int num=8
int den=15
oggetto 4/5
istanza di Rational
add
int num=4
int den=5
9
Dichiarare una classe
• class nome_classe
{
// definizione variabili
// definizione metodi
}
• Esempio:
class Rational
{
int num;
int den;
// definizione metodi
}
10
Dichiarare un oggetto
• Sintatticamente la dichiarazione di un oggetto è del
tutto analoga alla dichiarazione di una variabile di tipo
primitivo
• Esempio:
– Rational primoNumero;
essendo Rational una classe
• La variabile dichiarata di tipo classe è un indirizzo ad
un’area di memoria contenente l’oggetto vero e proprio
11
Istanza di un oggetto
• L’operatore new crea un oggetto del tipo “indicato” dal metodo che
immediatamente segue
• Sintassi:
– riferimentoOggetto = new NomeClasse(lista_di_parametri);
essendo riferimentoOggetto una variabile di tipo NomeClasse
• L’esecuzione di una tale istruzione comporta:
– l’allocazione della memoria necessaria a contenere l’oggetto
– l’assegnazione a riferimentoOggetto dell’indirizzo di inizio dell’area di
memoria allocata
– l’inizializzazione delle variabili di istanza dell’oggetto dettate dalla lista di
parametri del metodo NomeClasse(lista_di_parametri)
12
Fondere le due fasi
Rational primoNumero;
primoNumero = new Rational(3,4);
è equivalente a
Rational primoNumero = new Rational(3,4);
13
Oggetti e metodi
• Un metodo può ritornare il riferimento ad un oggetto
del tipo dichiarato dal valore di ritorno del metodo
– NomeClasse nomeMetodo(lista_input)
• Un metodo può avere un parametro formale di tipo
classe. Al momento dell’invocazione di un tale metodo,
il parametro è inizializzato con la copia
– Rational mul(Rational number)
14
Tipi primitivi e tipo classe
• Un metodo non può cambiare il valore di una variabile
di un tipo primitivo passatagli come argomento
• Un metodo può cambiare i valori delle variabili di
istanza dell’oggetto indirizzato dalla variabile tipo
classe che gli è passata come parametro
15
Il metodo main
• main è un metodo speciale dal quale le applicazioni
Java iniziano automaticamente l’esecuzione
• Sintassi:
public static void main(String args)
• È buona norma non includere il metodo main nella
definizione di una classe il cui scopo è esclusivamente
quello di definire un tipo
– eccezione: per debugging
16
• Esempio:
class RationalTest

public static void main(String args)

/* corpo del metodo main */


17
I costruttori
• Un costruttore è un metodo speciale designato a inizializzare le
variabili di istanza
– nome uguale a quello della classe
• Viene richiamato automaticamente quando l’oggetto è creato
– new NomeClasse(lista_di_parametri)
• Un costruttore con una lista di argomenti vuota è detto
costruttore di default
• Se nella classe non è presente un costruttore, Java crea
automaticamente un costruttore di default
18
Definizione dei Costruttori
• La dichiarazione di un costruttore non include un tipo di ritorno che è
comunque un indirizzo
– è un errore anteporre la parola chiave void
• Esempio:
class Rational

int num, den;
Rational(int n, int d)



...
num = n;
den = d;
19
Un esempio riassuntivo
class Rational

int num, den; // variabili di istanza
Rational(int n, int d) // costruttore

num = n;
den = d;

Rational mul(Rational r) // operazione di moltiplicazione

return new Rational(num*r.num,den*r.den);

// altre operazioni aritmetiche
boolean isBigger(Rational r) // confronto se maggiore

return (num * r.den > den * r.num);

// altre operazioni di confronto
}
20
class RationalTest

public static void main(String args)

Rational firstNum = new Rational(3,5);
Rational secondNum = new Rational(2,3);
boolean isBiggerResult;
isBiggerResult = firstNum.isBigger(secondNum);
System.out.println (“Primo>secondo:“+isBiggerResult);


21
Firma (signature) di un metodo
• La firma di un metodo è data dal nome del metodo e dal numero, tipo
e ordine dei suoi parametri
– Esempio di firme diverse:
• int
int
• int
int
• int
int
myMethod(int i) è diverso da
yourMethod(int i)
myMethod(int i) è diverso da
myMethod(int i, double j)
myMethod(int i, double j) è diverso da
myMethod(double j, int i)
• Il valore di ritorno di un metodo non fa parte della firma del metodo
stesso
– Esempio di firme uguali:
• int myMethod(int i) ha la stessa firma di
double myMethod(int j)
22
Sovraccaricamento
• Lo stesso nome di un metodo ha più di una
definizione all’interno della stessa classe
• I metodi sovraccarichi hanno lo stesso nome ma
firme diverse tra loro
– I costruttori sono spesso sovraccaricati
23
Esempio
class MethodOverload

int square(int x)

return x*x;

double square(double y)

return y*y;

int square(double x)

return x*x;

sovraccaricamento
errore segnalato
dal compilatore
…………

24
Sovraccaricamento e conversione
• Se non si ha la corrispondenza con una qualche
firma, Java effettua conversioni di tipo
automatiche per trovare un’eventuale
corrispondenza
– una versione indesiderata del metodo può essere
eseguita
25
INCAPSULAMENTO
• Le variabili contenute in un oggetto dovrebbero
essere modificate solo dal suo interno, solo i
metodi dovrebbero essere gli unici responsabili
del cambiamento delle variabili.
• Un oggetto dovrebbe essere incapsulato rispetto
a tutto il resto del sistema e dovrebbe interagire
con le altre parti del programma solo attraverso
un insieme specifico di metodi che definiscono i
servizi che fornisce.
26
MODIFICATORI
• Un modificatore è una parola chiave di Java
usata per specificare delle caratteristiche
particolari di un costrutto del linguaggio.
• Alcuni modificatori sono chiamate modificatori
di visibilità perché controllano fino a quale
punto del programma è possibile usare un
membro della classe.
27
Il modificatore public
• Il modificatore public indica la totale assenza di
restrizioni di visibilità
• Le classi dichiarate public possono essere
referenziate ovunque
public class TwoDimensionalShape

…………

class shapeTest

TwoDimensionalShape myShape;
…………
}
28
• I campi ed i metodi dichiarati public sono accessibili ovunque
public class A

public int x;
public int getX()  return x; 

class B

public static void main(String[] args)
{
A a = new A();
a.x = 3;
System.out.println(a.getX());

}
29
Il modificatore private
• Le variabili e i metodi dichiarati private sono
accessibili soltanto dai metodi della classe in cui
sono definiti
30
Esempio
public class TwoDimensionalShape

private int width, height;
private int generate( int n )

return 1+(int)( Math.random*n );

public void setRandomWidth( int n )

width = generate( n );

public int getWidth( )
{
return width;
}
}
31
class shapeTest

public static void main( String[] args )
{
TwoDimensionalShape s = new TwoDimensionalShape();
s.width = s.generate( 100 ); ERRORE DOPPIO
s.setRandomWidth( 100 );
System.out.println( s.getWidth( ) );

}
32
Caratteristiche dell’OOP
Occultamento delle
informazioni
• protegge i dati all’interno
di un oggetto
– usa variabili di istanza
private
• non permette un loro
accesso diretto
– usa metodi public per
accedere alle variabili
Incapsulamento
• gli oggetti incapsulano
attributi e metodi
• nasconde i dettagli di una
definizione di classe
separando
– interfaccia (API)
– implementazione
33
La parola chiave static
• Una variabile definita static è detta variabile di
classe
• Essa rappresenta informazioni valide per l’intera
classe ed è condivisa da tutte le istanze della classe
• Esempio:
public class A

static int x;
………

34
• Un metodo definito static è detto metodo di classe
• Esso definisce un comportamento identico per tutte le
istanze della classe ossia indipendente dagli oggetti
• Esempio:
Math.random()
• E’ un errore di sintassi per un metodo static chiamare
un metodo di istanza o accedere ad una variabile di istanza
35
Accedere a membri static
•
•
I membri static di una classe esistono
indipendentemente dall’esistenza di una
istanza di tale classe
Due tipi di accesso


NomeClasse.nomeMetodo(lista_parametri)
NomeClasse.nomeVariabile
rifOggetto.nomeMetodo(lista_parametri)
rifOggetto.nomeVariabile
essendo rifOggetto un riferimento a un oggetto di tipo
NomeClasse
36
La parola chiave final
• La parola chiave final riferita a una variabile
indica che essa non può essere modificata
– Sintassi:
final tipo NOME = costante;
– Esempio
final double PI = 3.14159;
37
Librerie di classi
Una libreria di classi è un insieme di classi che aiuta
il programmatore nello sviluppo del software.
Un compilatore spesso viene distribuito con una
libreria di classi fondamentali.
Si possono ottenere separatamente delle librerie
commerciali.
Tecnicamente una libreria non fa parte della
definizione del linguaggio.
La libreria standard viene distribuita con qualsiasi
ambiente di sviluppo.
38
API e package
•Una libreria di classi è composta da gruppi di classi tra loro
collegate, spesso indicate collettivamente come API
(Application Programmer Interface). E’ possibile per
esempio riferirsi al Java Database API quando si parla
dell’insieme delle classi che permettono di interagire con
una base di dati.
• Le classi della libreria standard di Java sono raggruppate in
package che, come le API, permettono di indicare con un
unico nome delle classi tra loro collegate. Ad esempio la
classe String fa parte del package java.lang.
39
La clausola IMPORT
• Le classi del package java.lang sono automaticamente rese
disponobili durante la scrittura di un programma.
• Se si vogliono usare le classi appartenenti ad altri package,
occorre specificare il nome della classe insieme al nome del
package, oppure usare la clausola import.
• Es.: java.util.Random
import java.util.Random
import java.util.*
40