  |
In realtà gli operatori sono "funzioni overloaded" |
uno dei segreti meglio riposti di Java e di molti altri linguaggi di programmazione,
e il fatto che gli operatori sono più di uno, ma con lo stesso nome. Per capirci, consideriamo la somma: in Java possibile sommare due interi, oppure sommare due numeri in virgola mobile, oppure sommare due stringhe. È particolarmente evidente nel caso di stringhe, che le operazioni di vengono fatte per sommare due stringhe sono diverse dalle operazioni che vengono fatte per sommare due interi. Ma in in realtà sono diverse anche le operazioni che vengono fatte quando si sommano due numeri in virgola mobile.
  |
la somma prende due int e ritorna un int |
una somma di interi utilizza la rappresentazione interna cosiddetta in complemento due. Non importa quello che realmente sia questa rappresentazione, importa che si opera su questo tipo di dati.
  |
oppure prende due double e ritorna un double |
invece la somma in virgola mobile prende due valori che utilizzano la rappresentazione IEEE 754, una rappresentazione completamente diversa da quella in complemento due. Quindi per fare la somma si fanno delle operazioni che sono diverse da quelle fatte per fare la somma intera. Tra l'altro il tipo del risultato è pure differente : del primo caso abbiamo un intero, nel secondo un double.
  |
Analogo ai metodi overload |
questo fatto, ovvero che ad un nome corrispondono più operazioni è particolarmente importante quando si programmano metodi, ma è vero pure per gli operatori. Tecnicamente si chiama overloading, cioè sovraccarico. L'operatore somma è come il manager di una ditta, che deve fare sacco di cose, ed è pertanto sovraccarico di lavoro.
int sum(int x, int y)
  |
Prende due int e ritona un int |
double sum(double x, double y)
  |
Ha lo stesso nome, ma prende due double e ritorna un double |
il programmatore ha infatti la possibilità di scrivere qualcosa come quello mostrato nel listato. Vedete due metodi di somma, il primo che prende due interi e ritorna un interno, e il secondo che prende due double e ritorna un double. Il punto è che entrambi i metodi hanno stesso nome, ma hanno un corpo (e quindi una implementazione) distinti. Ciò che distingue quale dei due metodi viene chiamato è il tipo dei parametri. Quindi il fatto che sum venga chiamato con due interi causa esecuzione di un algoritmo diverso da quello che viene seguito quando lo chiamo con due double. Questo fatto, che può sembrare un cavillo, è uno dei meccanismi fondamentali di Java, ed è forse uno dei più difficili da gestire. Mentalmente il programmatore deve fare caso al tipo che si ottiene. Per questo motivo è particolarmente importante stare attenti al fatto che sommando un long ad un double si ottiene un double. Dal tipo del risultato dipende quale metodo viene chiamato.
|