Oltre agli operatori visti nelle scorse lezioni, ne esistono anche
altri, che presenteremo qui per completezza di trattazione.
Conosciamo già loperatore punto (dot), utilizzato per
accedere a metodi e variabili allinterno di oggetti e classi,
e loperatore (), utilizzato per elencare gli argomenti di
un metodo nella sua dichiarazione e nellinvocazione.
Abbiamo anche visto loperatore di casting, costituito
da un nome di tipo (classe o tipo primitivo) racchiuso entro parentesi
tonde, limitandoci solo al caso di casting tra tipi primitivi (vedi
lezione
7).
In realtà anche listanza di una classe può essere convertita
in unistanza di unaltra classe, con il vincolo che la
classe di partenza e quella di arrivo siano in relazione ereditaria,
ovvero una deve essere sottoclasse dellaltra.
Notiamo che poiché una sottoclasse contiene tutte le informazioni
della sua superclasse, è possibile utilizzare una sua istanza ovunque
ci si aspetti che venga utilizzata unistanza della sua superclasse;
invece per utilizzare una superclasse al posto di una sottoclasse
è necessario un casting esplicito.
Tuttavia questultima possibilità non è sempre permessa.
Consideriamo il seguente esempio:
import Uomo;
import UomoDAffari;
class TestCasting {
static byte i = 0;
static void presenta(Uomo uomo) {
System.out.print(++i + ": ");
uomo.presentati();
}
public static void main(String arg[]) {
Uomo man = new Uomo("Pinko", (byte)24, "meccanico");
UomoDAffari businessMan = new UomoDAffari("Pallino",
(byte)42,
"banchiere", "dott.",
100000000);
presenta(man);
presenta(businessMan);
Object essereVivente = man;
presenta((Uomo)essereVivente);
presenta(man);
}
}
In questa semplice classe è stato dichiarato un metodo statico,
presenta(),
che accetta come parametro unistanza della classe Uomo.
Notiamo che allinterno di main()
tale metodo è richiamato direttamente, senza istanziare alcun oggetto
di tipo TestCasting e senza nemmeno premettere il nome
della classe (perché?).
Se eseguiamo il programma, otterremo il seguente output:
1: Pinko: - Salve, sono
Pinko, ho 24 anni e faccio il meccanico
2: dott. Pallino: - Salve, sono Pallino, ho 42 anni e faccio il
banchiere
3: Pinko: - Salve, sono Pinko, ho 24 anni e faccio il meccanico
4: Pinko: - Salve, sono Pinko, ho 24 anni e faccio il meccanico
Il rigo 1 è il risultato dellinvocazione presenta(man)
, il rigo 2 è il risultato dellinvocazione dello stesso metodo
con il parametro businessMan che è di tipo UomoDAffari: Java ha
accettato una sottoclasse laddove si aspettava di ricevere la superclasse.
Se la segnatura del metodo presenta
fosse stata:
static void presenta(UomoDAffari
uomo)
non sarebbe stato possibile invocare presenta((UomoDAffari)man)
perché il casting avrebbe prodotto in fase di esecuzione lerrore
java.lang.ClassCastException.
Il casting ha invece successo nellinvocazione presenta((Uomo)essereVivente),
perché essereVivente, pur essendo un oggetto di tipo Object (di
cui Uomo è una sottoclasse, vedi lezione
16) ha tutte le proprietà (metodi e attributi) della classe
Uomo.
Per verificare che il casting è necessario, modificate il sorgente
precedente provando ad invocare direttamente presenta(essereVivente).
Per verificare se un oggetto appartiene o meno ad una classe si
utilizza loperatore instanceof, la cui sintassi è:
nomeOggetto instanceof nomeClasse
se loggetto nomeOggetto appartiene alla classe nomeClasse
ritorna il valore true, altrimenti ritorna false.
Nel caso dellesempio precedente listruzione:
essereVivente instanceof
Uomo
restituirebbe il valore
true.
Infine vediamo lordine seguito dallinterprete Java quando
in unespressione si utilizzano più operatori, per stabilire
quali di essi deve valutare per primi.
Nella tabella sono elencati tutti gli operatori, ordinati secondo
lordine di precedenza a partire da quelli con priorità più
alta:
|
OPERATORI |
|
[] . (parametri) espr++ espr-- |
|
++espr espr +espr espr ~ ! |
|
new (tipo)espr |
|
* / % |
|
+ - |
|
<< >> >>> |
|
< > <= >= instanceof |
|
== != |
|
& |
|
^ |
|
| |
|
&& |
|
|| |
|
?: |
|
= += -= *= /= %= &= ^= |= <<= >>= >>>= |
Tra questi lunico operatore che ancora non conosciamo è loperatore
[ ], utilizzato per dichiarare, creare e accedere agli array.
Gli array saranno argomento di alcune delle prossime lezioni.
Torna all'indice Generale del corso di Corso di Java di Software Planet