Buono sconto 4% su Toner e Cartucce agli utenti AZpoint. SU Iomiricarico.it!!
- Le basi della programmazione object oriented: classi ed oggetti
I concetti di classe ed oggetto, sono strettamente legati. Esistono infatti,
delle definizioni ufficiali derivanti dalla teoria della programmazione
orientata agli oggetti, che di seguito vi presentiamo:
Definizione 1:
una classe è un’astrazione per un gruppo di oggetti che condividono
le stesse caratteristiche e le stesse funzionalità.
Definizione 2:
un oggetto è un’istanza (ovvero, una creazione fisica) di una
classe.
A questo punto, il lettore più "matematico" sicuramente avrà le
idee un po’ confuse. Effettivamente definire il concetto di classe tramite la
definizione di oggetto, e il concetto di oggetto tramite la definizione di
classe, non è di certo il massimo della chiarezza! Ma la situazione è molto
meno complicata di quella che può sembrare. Passiamo subito ad un esempio:
class Punto
{
int x;
int y;
}
Sopra abbiamo definito una classe Punto.
Evidentemente, la funzione di questa classe, è quella di astrarre il concetto
di punto (a due dimensioni), tramite la definizione delle sue coordinate su di
un piano cartesiano. Potremmo salvare questo listato in un file chiamato "Punto.java",
compilarlo, ma non mandarlo in esecuzione (otterremmo un’eccezione). Infatti,
in questa classe, è assente il metodo main,
e quindi non sarà eseguita nessun’azione inizialmente.
Il concetto di classe è servito per definire come è fatto un generico
punto, ma in questo modo, abbiamo solo definito il concetto di punto, in realtà
non abbiamo ancora nessun punto da poter utilizzare.
Nel contesto della programmazione ad oggetti, una classe dovrebbe limitarsi a
definire che struttura avranno gli oggetti che da essa saranno istanziati.
"Istanziare", come abbiamo già visto, è il termine object oriented
che sta per "creare fisicamente", ed il risultato di un’istanza deve
essere un oggetto.
Istanzieremo allora oggetti dalla classe Punto,
nel modo seguente:
1 class Principale
2 {
3 public static void main(String
args[])
4
{
5
Punto punto1;
6 punto1 = new Punto();
7 punto1.x = 2;
8 punto1.y = 6;
9 Punto punto2 = new Punto();
10 punto2.x = 0;
11 punto2.y = 1;
12
System.out.println(punto1.x);
13
System.out.println(punto1.y);
14 System.out.println(punto2.x);
15
System.out.println(punto2.y);
16
}
17 }
La classe Principale,
dichiara alla riga 5, un oggetto di tipo Punto
e lo chiama punto1
(così come nella classe Punto
avevo dichiarato un intero e lo avevo chiamato x).
Ma è solamente alla riga 6 che avviene l’istanza della classe Punto.
La parola chiave new,
di fatto, istanzia la classe Punto.
Dalla riga 6 in poi possiamo utilizzare l’oggetto punto1.
Precisamente, alle righe 7 e 8, settiamo le coordinate x ed y del punto1,
rispettivamente ai valori interi 2
e 6. In
pratica, sfruttando la definizione di punto che mi ha fornito la classe Punto,
ho creato un oggetto di tipo Punto,
che è individuato dal nome punto1.
Notiamo anche, l’utilizzo dell’operatore "dot" (che in inglese
significa "punto", ma nel senso del simbolo di punteggiatura
".") per accedere alle variabili x
e y.
Alla riga 9, però, abbiamo dichiarato ed istanziato in una sola riga di
codice un altro oggetto dalla classe Punto
chiamandolo punto2.
Abbiamo poi settato le coordinate di quest’ultimo rispettivamente a 0
e 1.
Abbiamo infine stampato le coordinate di entrambi i punti.
Ora, le definizioni di classi ed oggetto dovrebbero risultare un po’ più
chiare: la classe serve per definire come sarà fatto un oggetto, l’oggetto è
la realizzazione fisica della classe. In questo esempio, abbiamo istanziato due
oggetti diversi da una stessa classe. Entrambi questi oggetti sono punti, ma
evidentemente sono punti diversi.
Questi concetti, come d’altronde tutti quelli relativi alla programmazione
ad oggetti, sono già familiari a chiunque, giacchè derivanti dalla realtà che
ci circonda. L’essere umano, per superare la complessità della realtà,
raggruppa gli oggetti in classi. Per esempio nella nostra mente esiste il
modello definito dalla classe Persona.
Ma nella realtà esistono miliardi di oggetti di tipo Persona,
ognuno dei quali ha caratteristiche uniche. Comprendere le definizioni 1 e 2
ora, non dovrebbe essere più un problema.
N.B.: tutti i concetti dell’object orientation, derivano dal mondo reale.
Il concetto di classe nella programmazione, può essere paragonato al concetto
di "idea" del mondo reale. Per esempio, volendo definire l’idea
(astrazione) di un’auto,dovremmo parlare delle caratteristiche e delle
funzionalità comuni ad ogni auto. Quindi, banalizzando, potremmo definire un’auto
come"un mezzo di trasporto (quindi che si può muovere), con quattro
ruote". Questa definizione può essere portata nella programmazione sotto
forma di classe dichiarante come attributo un intero chiamato numeroRuote
inizializzato a 4, ed un metodo che potremmo chiamare per semplicità muoviti().
Il lettore è rimandato alle prossime pagine per la comprensione e l’utilizzo
del concetto di metodo.
class Auto
{
int numeroRuote=4;
void muoviti()
{
// implementazione del metodo…
}
}
Ogni auto ha 4 ruote, e si muove. Una Ferrari Testarossa ed una Fiat
Cinquecento, hanno entrambe 4 ruote e si muovono, anche se in modo diverso. La
Testarossa e la Cinquecento sono da considerarsi oggetti della classe Auto,
e nella realtà esisterebbero come oggetti concreti.
- Osservazione importante
Nel primo esempio abbiamo potuto commentare la definizione di due classi. Per
la prima (la classe Punto),
abbiamo sottolineato la sua caratteristica di essere un dato. E’ da
considerarsi una parte strutturale dell’applicazione, e quindi svolge un ruolo
essenziale nell’ambito compilativo. Nell’ambito esecutivo la classe Punto
non ha un ruolo. Infatti, sono gli oggetti istanziati da essa che influenzano il
flusso di lavoro del programma. Questo può definirsi come il caso standard. In
un’applicazione object oriented, una classe dovrebbe limitarsi definire la
struttura comune di un gruppo oggetti, non dovrebbe mai possedere né variabili
né metodi. Infatti, la classe Punto,
non possiede le variabili x
e y,
bensì, dichiarando le due variabili, definisce gli oggetti che da essa saranno
istanziati, come possessori di quelle variabili. Notare che mai all’interno
del codice è presente un’istruzione come:
Punto.x
ovvero
nomeClasse.nomeVariabile
(che tra l’altro produrrebbe un errore in compilazione) bensì:
punto1.x
ovvero
nomeOggetto.nomeVariabile
L’operatore ".", come spesso accade nell’informatica, è
sinonimo di appartenenza, e quindi sono gli oggetti a possedere le variabili
dichiarate nella classe (che tra l’altro verranno dette "variabili d’istanza").
Infatti, i due oggetti istanziati avevano valori diversi per x
e y, il
che significa che l’oggetto punto1
ha la sua variabile x
e la sua variabile y,
mentre l’oggetto punto2
ha la sua variabile x
e la sua variabile y.
Le variabili di punto1
sono assolutamente indipendenti dalle variabili di punto2.
Giacché le classi non hanno membri (variabili e metodi), non eseguono codice e
non hanno un ruolo nell’ambito esecutivo, e per quanto visto sono gli oggetti
che sono i protagonisti assoluti di quest’ambito. Come spesso accade quando si
approccia a Java, appena definita una nuova regola, subito si presenta l’eccezione
(che se vogliamo dovrebbe confermarla!). Puntiamo infatti l’attenzione sulla
classe Principale.
Essa è invece una classe che esegue del codice contenuto all’interno dell’unico
metodo main,
che per quanto detto, è assunto per default come punto di partenza di un’applicazione
Java. In qualche modo i creatori di Java, dovevano stabilire un modo per far
partire il runtime di un programma. La scelta è stata fatta in base ad una
questione pratica: un’applicazione scritta in C o C++, ha come punto di
partenza per default un programma chiamante che si chiama proprio main.
In Java i programmi chiamanti non esistono, ma esistono i metodi, ed in
particolare i metodi statici, ovvero, dichiarati con un modificatore static.
Questo modificatore molto potente sarà trattato in dettaglio nei prossimi
moduli. Per ora limitiamoci a sapere che un membro dichiarato statico,
appartiene alla classe, e tutti gli oggetti istanziati da essa condivideranno
gli stessi membri. Giacché la classe Principale
contiene un metodo, può eseguire del codice.
E’ bene che il lettore eviti di utilizzare il modificatore static
nei primi tempi ed aspetti che "i tempi maturino", per non buttare via
tempo prezioso. L’accenno fatto ad un argomento complesso come static,
ha solamente lo scopo di chiarire un punto oscuro del nostro discorso.
|