Corso di Java

Variabili e attributi I

 

A partire da questa lezione cominceremo a costruire la nostra prima applicazione.
Supponiamo di dover lavorare con una classe “Automobile”, della quale abbiamo rilevato le seguenti qualità:
- marca
- modello
- capacità del serbatoio
- quantità di benzina nel serbatoio
- livello della riserva
- consumo (numero di Km con un litro)
- presenza dell’autoradio
- presenza dell’antifurto
Ovviamente queste non sono le uniche qualità di un’automobile, anzi, non sono nemmeno le prime che ci verrebbero in mente se ci venisse chiesto di elencarne alcune.
La scelta degli attributi è un passo importante nella progettazione di classi Java e va fatta tenendo in considerazione l’utilizzo cui è destinata la classe; nel nostro caso creeremo un’applicazione nella quale non useremo attributi come il colore, la velocità massima, l’accelerazione, etc., per cui ci limiteremo (per ora) a considerare solo queste.

Ognuna di queste qualità può essere espressa con una variabile, ossia con un elemento in cui è possibile memorizzare informazioni di vario tipo durante l’esecuzione del programma.
Il contenuto di una variabile può essere modificato (ciò giustifica, appunto, il nome variabile) all’interno della sua regione di visibilità, detta scope.
Lo scope di una variabile è quella porzione di codice nella quale essa è raggiungibile, ossia può essere letta ed eventualmente modificata.
Questo concetto ci potrà essere più chiaro dopo aver fatto una serie di premesse.
In Java una variabile può essere:
variabile istanza, utilizzata per definire gli attributi di un oggetto;
variabile di classe, utilizzata per definire attributi di un’intera classe di oggetti;
variabile locale, utilizzata all’interno di metodi e blocchi di istruzioni.
Ogni variabile è caratterizzata da un nome e da un tipo, e il suo valore iniziale può essere assegnato nel momento stesso in cui viene creata.

Scriviamo il corpo della nostra classe:

class Automobile {
    String marca, modello;
    float capacitaSerbatoio, livelloRiserva, consumo, quantitaBenzina;
    boolean autoradio, antifurto;
}


E’ possibile assegnare un valore ad una variabile tramite un segno di uguale (=) interposto tra il nome della variabile (a sinistra) e il valore da assegnare (a destra), ad es:

marca = “Ferrari”;
consumo = 5;
autoradio = true;

Quando si definisce una variabile istanza o di classe, viene assegnato un valore iniziale di default a seconda del tipo di informazione in essa contenuta: 0 per le variabili numeriche; \0 per i caratteri; false per i booleani e null per gli oggetti.
All’interno di una classe è possibile riferirsi a tutti i suoi attributi, ossia a tutte le sue variabili istanza, mentre le variabili locali sono accessibili solamente all’interno del blocco in cui sono definite.
Un blocco è una porzione di istruzioni Java racchiuse tra parentesi graffe.

Supponiamo che da qualche parte, all’interno della nostra classe ci sia un blocco di questo tipo:

{
    ...
    float f3 = livelloRiserva;
    {
        int i = 3;
        float f1 = quantitaBenzina;
        float f2 = f1 - f3;
        int k = j + i + 1;
    }
    int j = i;
}

...

A parte la banalità del codice, possiamo notare che abbiamo inserito un blocco all’interno di un altro blocco più grande, e che dentro il blocco interno sono state dichiarate quattro variabili, per ognuna delle quali è stata fatta contestualmente un’operazione di assegnamento.
Le variabili i, k, f1 e f2 sono variabili locali al blocco interno e sono visibili solo all’interno di esso.
j e f3 sono locali al blocco esterno, per cui non sono visibili al di fuori di esso, ma è possibile utilizzarli nei blocchi interni: ciò rende possibile l’assegnamento fatto ad f2.

Poiché le variabili istanza (gli attributi) di una classe sono visibili in tutto il corpo della classe, è possibile assegnare quantitaBenzina ad f1 e livelloRiserva ad f3.
Il codice di esempio contiene due errori, che è importante rilevare:
Sebbene j sia dichiarato nel blocco esterno, essa non è accessibile in quello interno, perché quando questo viene eseguito, essa non è stata ancora dichiarata (cioè non esiste), per cui l’assegnamento fatto a k non è possibile;
Anche l’assegnamento fatto a j è un errore che viene rilevato in fase di compilazione, perché al termine del blocco interno, i non è più visibile, anzi possiamo dire che in tal punto i non esiste più.
Ciò vuol dire che lo scope di una variabile ha inizio nel punto in cui essa è dichiarata e ha termine alla fine del blocco che contiene la sua dichiarazione.
Notiamo che poiché tutto il corpo di ogni classe è racchiuso entro parentesi graffe, anche le variabili istanza rientrano in questa definizione (il blocco che contiene la dichiarazione è la classe e quindi ogni blocco che la classe contiene può accedere a tali variabili).
Approfondiremo i modi con cui è possibile utilizzare le variabili nella prossima puntata.

 

Torna all'indice Generale del corso di Corso di Java di Software Planet