![]() ![]() |
|
![]() ![]() |
Le classi in Java possono avere due ruoli:
Attenzione: Vedremo che
questi due ruoli (prototipo / contenitore)
possono anche essere presenti contemporaneamente nella medesima
classe.
|
![]() ![]() |
|
![]() ![]() |
Nel primo ruolo, una classe descrive le caratteristiche
comuni di una collezione di oggetti.
La dichiarazione di classe introduce un nuovo tipo di dato (la classe stessa), i cui elementi saranno i suoi oggetti. Nella classe vengono dichiarati:
Per accedere ad una variabile di istanza di un oggetto, si usa la sintassi <oggetto>.<nomeVariabile>e analogamente per invocare un metodo, si scrive <oggetto>.<nomeMetodo>(<lista_parametri>)Ad esempio,
|
![]() ![]() |
|
![]() ![]() |
In una classe possiamo anche dichiarare uno stato
e delle funzionalità che sono associati alla classe stessa,
e non ai suoi oggetti. Si possono infatti dichiarare:
Ad esempio, abbiamo visto in diverse classi la dichiarazione del metodo
che viene invocato quando si esegue la classe con il comando
java.
Per accedere ad una variabile statica di una classe, si usa la sintassi <nomeClasse>.<nomeVariabile>e analogamente per invocare un metodo statico, si scrive <nomeClasse>.<nomeMetodo>(<lista_parametri>)Ad esempio, tutti i metodi della classe ArrayUtils sono statici:
|
![]() ![]() |
|
![]() ![]() |
Lo schema generale di dichiarazione di una classe
in Java è il seguente:
Quindi in una classe che definisce un prototipo per le sue istanze, oltre a variabili d'istanza, metodi d'istanza e costruttori possono essere dichiarati anche variabili e metodi statici. Variabili e metodi (siano essi d'istanza o statici) sono chiamati anche membri della classe. NOTA: L'ordine delle dichiarazioni all'interno del corpo di una classe non è importante. |
![]() ![]() |
|
![]() ![]() |
La classe Student contiene variabili
e metodi sia statici che di istanza.
Si osservi che per garantire l'incapsulamento, le variabili name ed ID sono dichiarate private: vengono inizializzate al momento della creazione, e possono essere accedute solo in lettura con i metodi accessori getName() e getID(). Le altre variabili d'istanza sono dichiarate public per non appesantire troppo il codice. |
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
La seguente sequenza di comandi crea la collezione
di oggetti vista prima:
Si noti ancora una volta che le operazioni su variabili di tipo oggetto sono operazioni su riferimenti, non sugli oggetti stessi. Quindi, ad esempio, l'effetto del comando:
|
![]() ![]() |
|
![]() ![]() |
Quando si scrivono i metodi e le variabili
di una classe, come si decide se devono essere statici o di
istanza?
Come regola generale, devono essere statici se codificano le funzionalità o lo stato della classe, e quindi sono significativi anche se non esiste alcun oggetto della classe. Invece devono essere di istanza se codificano le funzionalità o lo stato degli oggetti. Vediamo alcuni esempi più specifici, che possono risultare utili nella pratica:
|
![]() ![]() |
|
![]() ![]() |
Abbiamo visto spesso che una dichiarazione
di variabile o metodo (sia statico che di istanza) può essere
preceduta dai modificatori public oppure
private
(oppure da nessuno dei due). Cosa significano? Quali sono le differenze?
Nella tabella i modificatori sono elencati in ordine crescente di visibilità. Si noti che:
|
![]() ![]() |
|
![]() ![]() |
Supponiamo di non aver rispettato il principio di
incapsulamento nella definizione della classe Student, cioè di aver
dichiarato le variabili
name ed ID pubbliche:
Con l'uso del costruttore già visto,
le variabili name e ID verrebbero inizializzate
al momento della creazione. Ma poiché le variabili d'istanza sono
dichiarate public, è possibile una sequenza di comandi
come
che porterebbe la computazione in uno stato concettualmente inconsistente. Invece avendole dichiarate private siamo sicuri che il valore iniziale delle due variabili non potrà essere modificato. |