|
Il linguaggio Java: lez.3
Elenco delle pagine di "Il linguaggio Java: lez.3"
Introduzione al Modulo 3 - Pagina 1
Unità didattica 2.1) - Pagina 2
Unità didattica 2.2) - Pagina 3
Unità didattica 2.3) - Pagina 4
Unità didattica 2.4) - Pagina 5
Unità didattica 2.5) - Pagina 6
Unità didattica 2.6) - Pagina 7
1
|
2 |
3 |
4
3 - Unità didattica 2.2)
- 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.
Elenco delle pagine di "Il linguaggio Java: lez.3"
Introduzione al Modulo 3 - Pagina 1
Unità didattica 2.1) - Pagina 2
Unità didattica 2.2) - Pagina 3
Unità didattica 2.3) - Pagina 4
Unità didattica 2.4) - Pagina 5
Unità didattica 2.5) - Pagina 6
Unità didattica 2.6) - Pagina 7
Pagina :
1
|
2 |
3 |
4
Restyling e Aggiornamenti della
sezione manuali e guide a cura di:
Fabrizio
Miceli
|
Tips su sistemi
operativi, registro di configurazione, sicurezza, internet,
navigazione, word ed excel. |
|
|
|
Guide e sulla
configurazione, installazione ed utilizzo di, periferiche,
sistemi operativi ecc... |
|
|