Corso di Java

Operatori e precedenze

 

Oltre agli operatori visti nelle scorse lezioni, ne esistono anche altri, che presenteremo qui per completezza di trattazione.
Conosciamo già l’operatore punto (dot), utilizzato per accedere a metodi e variabili all’interno di oggetti e classi, e l’operatore (), utilizzato per elencare gli argomenti di un metodo nella sua dichiarazione e nell’invocazione.
Abbiamo anche visto l’operatore 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 l’istanza di una classe può essere convertita in un’istanza di un’altra classe, con il vincolo che la classe di partenza e quella di arrivo siano in relazione ereditaria, ovvero una deve essere sottoclasse dell’altra.
Notiamo che poiché una sottoclasse contiene tutte le informazioni della sua superclasse, è possibile utilizzare una sua istanza ovunque ci si aspetti che venga utilizzata un’istanza della sua superclasse; invece per utilizzare una superclasse al posto di una sottoclasse è necessario un casting esplicito.
Tuttavia quest’ultima 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 un’istanza della classe “Uomo”.

Notiamo che all’interno 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 dell’invocazione presenta(man) , il rigo 2 è il risultato dell’invocazione 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 l’errore “java.lang.ClassCastException”.

Il casting ha invece successo nell’invocazione 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 l’operatore instanceof, la cui sintassi è:

nomeOggetto instanceof nomeClasse

se l’oggetto nomeOggetto appartiene alla classe nomeClasse ritorna il valore true, altrimenti ritorna false.
Nel caso dell’esempio precedente l’istruzione:

essereVivente instanceof Uomo

restituirebbe il valore true.

Infine vediamo l’ordine seguito dall’interprete Java quando in un’espressione si utilizzano più operatori, per stabilire quali di essi deve valutare per primi.

Nella tabella sono elencati tutti gli operatori, ordinati secondo l’ordine di precedenza a partire da quelli con priorità più alta:

OPERATORI

[] . (parametri) espr++ espr--

++espr –espr +espr –espr ~ !

new (tipo)espr

* / %

+ -

<< >> >>>

< > <= >= instanceof

== !=

&

^

|

&&

||

?:

= += -= *= /= %= &= ^= |= <<= >>= >>>=


Tra questi l’unico operatore che ancora non conosciamo è l’operatore [ ], 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