Corso di Java

Espressioni e operatori

 

Ora che sappiamo come creare applicazioni Java, dobbiamo conoscere che cosa è possibile fare con esse, ossia quali sono i costrutti che il linguaggio ci mette a disposizione per l’implementazione degli algoritmi.
In Java è possibile manipolare oggetti e dati utilizzando gli operatori, e prendere delle decisioni per mezzo di istruzioni di controllo dell’esecuzione.
Poiché Java è stato derivato in gran parte dal C++, molte istruzioni e gli operatori che vedremo saranno familiari ai programmatori di C e C++, anche se sono stati aggiunti miglioramenti e semplificazioni.
Infatti uno degli obiettivi dei “genitori” di Java era quello di semplicare l’apprendimento della sintassi e della logica del nuovo linguaggio anche da parte degli sviluppatori esperti e poiché i programmatori C++ erano (e lo sono ancora) in maggioranza la scelta era obbligata.

Nei linguaggi di programmazione, un operatore elabora uno o più argomenti (detti operandi) per produrre un nuovo valore.
In Java quasi tutti gli operatori lavorano solo con i tipi primitivi, ad eccezione di ‘=’, ‘==’ e ‘!=’ che funzionano con tutti gli oggetti.
Inoltre la classe String supporta anche ‘+’ e ‘+=’.
Esistono delle regole di precedenza che definiscono il modo in cui viene valutata un’espressione con più operatori, ovvero l’ordine con cui gli operatori vengono eseguiti: ad es. possiamo pensare alla moltiplicazione e alla divisione, che vengono eseguite prima dell’addizione e della sottrazione.
Per modificare le regole di precedenza, si devono usare delle parentesi per rendere esplicito l’ordine di valutazione.
Ad es. la seguente istruzione:

a = x - y + 18*3 + z;

ha un significato completamente diverso dalla stessa istruzione con un particolare raggruppamento delle parentesi:

a = x – (y + 18)*(3 + z);

L’operazione di assegnamento viene eseguita con l’operatore =, che prende il valore dell’espressione alla sua destra e lo assegna alla variabile alla sua sinistra.
A destra dell’operatore = possiamo avere una costante, una variabile o una qualsiasi espressione che produce un valore, ma a sinistra deve esserci necessariamente una variabile (ossia uno spazio fisico in cui memorizzare il valore).
E’ possibile assegnare una valore costante ad una variabile:

x = 4;

ma non si può assegnare nulla ad un valore costante, cioè non si può scrivere:

4 = x;

L’assegnamento tra tipi primitivi è molto semplice, in quanto non si fa altro che copiare il valore di una variabile nell’altra, ad es:

x = y;

copia il valore di y in x, cosicché se in seguito si modifica y, l’operazione non avrà alcun effetto su x, il che è quello che tutti ci aspettiamo che avvenga.

Le cose cambiano quando applichiamo l’operatore di assegnamento tra due oggetti.
Infatti lavorare con gli oggetti significa operare con il loro riferimento, per cui se si assegna un oggetto ad un altro, non si fa altro che copiare il riferimento a quell’oggetto.
Per comprendere meglio la differenza sostituiamo il precedente metodo main() della classe “Automobile” con il seguente:

public static void main(String arg[]) {
    Automobile auto1 = new Automobile("Vera", "Carriola", 70, 15, 8, 70,
                                      true, true);
    Automobile auto2 = new Automobile("Vera", "Bomba", 55, 10, 9, 4,
                                      true, true);
       
    System.out.println("L'auto 1 e' una " + auto1.getMarcaModello());
    System.out.println("L'auto 2 e' una " + auto2.getMarcaModello());
    System.out.println("Sull'auto 2 c'e' l'autoradio? " + auto2.getAutoradio());
    auto2 = auto1;
    System.out.println("Adesso l'auto 2 e' una " + auto2.getMarcaModello());
    auto1.setAutoradio(false);
    System.out.println("Sull'auto 2 c'e' l'autoradio? " + auto2.getAutoradio());
}

Una volta compilato il sorgente ed eseguito il binario, otterremo il seguente output:

L'auto 1 e' una Vera Carriola
L'auto 2 e' una Vera Bomba
Sull'auto 2 c'e' l'autoradio? true
Adesso l'auto 2 e' una Vera Carriola
Sull'auto 2 c'e' l'autoradio? false


Inizialmente auto1 e auto2 sono due oggetti distinti della stessa classe e le prime due stampe a video lo evidenziano; con l’assegnamento:

auto2 = auto1;

la variabile auto2 punta allo stesso oggetto di auto1, per cui la modifica alla variabile autoradio dell’oggetto auto1 si riflette sull’oggetto auto2.

Vedete la differenza con il seguente programma:

class TestPrimitivi {
    public static void main(String arg[]) {
        int x = 0;
        int y = 3;
       
        System.out.println("La variabile x vale " + x);
        System.out.println("La variabile y vale " + y);
        x = y;
        y = 100;

        System.out.println("Adesso la variabile x vale " + x);
        System.out.println("Adesso la variabile y vale " + y);
    }
}

 

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