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 limplementazione degli algoritmi.
In Java è possibile manipolare oggetti e dati utilizzando gli operatori,
e prendere delle decisioni per mezzo di istruzioni di controllo
dellesecuzione.
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 lapprendimento 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 unespressione con più operatori, ovvero
lordine con cui gli operatori vengono eseguiti: ad es. possiamo
pensare alla moltiplicazione e alla divisione, che vengono eseguite
prima delladdizione e della sottrazione.
Per modificare le regole di precedenza, si devono usare delle parentesi
per rendere esplicito lordine 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);
Loperazione
di assegnamento viene eseguita con loperatore =, che
prende il valore dellespressione alla sua destra e lo assegna
alla variabile alla sua sinistra.
A destra delloperatore = 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;
Lassegnamento tra tipi primitivi è molto semplice, in quanto
non si fa altro che copiare il valore di una variabile nellaltra,
ad es:
x = y;
copia il valore di y in x, cosicché se in seguito si modifica y,
loperazione non avrà alcun effetto su x, il che è quello che
tutti ci aspettiamo che avvenga.
Le cose cambiano
quando applichiamo loperatore 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 quelloggetto.
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 lassegnamento:
auto2 = auto1;
la variabile auto2 punta allo stesso oggetto di auto1,
per cui la modifica alla variabile autoradio delloggetto
auto1 si riflette sulloggetto 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