Java/Tipi di dato: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 32:
*il ''tipo null'', che formalmente viene indicato come il tipo cui appartiene il valore letterale ''null''.
 
===Dimensioni===
La dimensione dei tipi primitivi del Java non dipende dalla macchina su cui il programma è in esecuzione. Questo comportamento è differente da quello di altri linguaggi compilati in codice "nativo", primo fra tutti il linguaggio C, nel quale i tipi base hanno dimensioni diverse a seconda che ci si trovi su una macchina piuttosto che su un'altra. Questo significa che, per ciascuno di essi, è noto a priori sia il limite minimo, sia il limite massimo dei valori che esso ammette.
 
Tutti i tipi numerici sono ''signed'', eccetto il ''char'', che è ''unsigned''.
Un certo tipo di processore, ad esempio, potrebbe gestire gli interi a 32 bit usando parole a 64 bit. Un compilatore C potrebbe decidere, allora, di implementare le variabili ''int'' facendo occupare loro 8 byte anziché 4; in Java questo non è permesso: nell'esempio, anche se la macchina virtuale ''può'' decidere di utilizzare parole a 64 bit, questo rimane trasparente al codice della classe, per il quale il tipo ''int'' si comporta sempre esattamente come se fosse dotato di soli 32 bits.
 
=== Dimensioni in memoria ===
La dimensione dei tipi primitivi del Java non dipende dalla macchina su cui il programma è in esecuzione. Questo comportamento è differente darispetto a quello di altri linguaggi compilati in codice "nativo", primo fra tutti il linguaggio C, nel quale i tipi base hanno dimensioni diverse a seconda che ci si trovi su una macchina piuttosto che su un'altra. Questo significa che in Java, per ciascuno didei tipi essinumerici, è noto a priori sia il limite minimo, sia il limite massimo dei valori che esso ammette.
 
UnSu certouna tipomacchina diil cui processore, ad esempio, potrebbe gestiregestisce gli interi a 32 bit usando parole a 64 bit., Unun compilatore C potrebbe decidere, allora, di implementare le variabili ''int'' facendo occupare loro 8 byte anziché 4; in Java questo non è permesso: nell'in questo esempio, anche se la macchina virtuale ''può'' decidere di utilizzare parole a 64 bit, questo rimane trasparente al codice della classe, per il quale il tipo ''int'' si comporta sempre esattamente come se fosse dotato di soli 32 bits.
 
=== Il tipo ''char'' ===
Java utilizza l'Unicode. I caratteri vengono gestiti tramite il corrispondente valore numerico Unicode; è per questo che, in realtà, ''char'' è a tutti gli effetti un tipo numerico. (Può essere visto come una versione ''unsigned'' del tipo ''short''.) I valori letterali di tipo ''char'' vanno compresi tra singoli apici: ad esempio, <code>'a'</code>.
 
== Conversioni ===
Le conversioni in Java si chiamano anche operazioni di ''cast''. Una conversione ammessa dal linguaggio può essere realizzata in due soli modi: con ''cast esplicito'' o con ''cast implicito''. Il primo si ha utilizzando l'apposito operatore; il secondo, invece, viene gestito dal compilatore e non richiede una sintassi specifica. Ogni cast implicito può essere reso esplicito, se si vuole (a volte è utile per chiarezza).
 
L'idea che sta alla base di questo meccanismo, in Java, è che, in presenza di un'operazione che potrebbe avere risultati non previsti (per es. la conversione di un ''float'' in un ''int'' potrebbe portare al troncamento del numero, il che è una perdita di informazioni per il programma), il programmatore deve "dichiarare" esplicitamente al compilatore di esserne consapevole e di volerla ugualmente effettuare. Questa "dichiarazione" viene effettuata scrivendo esplicitamente l'operatore di cast per la conversione.
 
Per quanto riguarda i tipi base:
*le conversioni ammesse sono quelle che coinvolgono i soli tipi numerici; cioè, non sono ammesse conversioni tra ''boolean'' e i tipi numerici. Questo comportamento è differente da quello che si ha nel C;
*sono ammesse tutte le conversioni da un certo tipo numerico verso un altro tipo numerico;
*richiedono necessariamente il cast esplicito tutte le conversioni da un tipo numerico più "grande" ad uno più "piccolo".
 
Per quanto riguarda le classi:
*le conversioni da un sottotipo a un supertipo (per es. da String a Object) non richiedono cast esplicito;
*le conversioni da un supertipo a un suo sottotipo (per es. da Collection ad ArrayList) richiedono cast esplicito.
Il motivo è che
*nel primo caso, la conversione riesce sempre, poiché, ad es., ogni istanza di String sicuramente è anche un'istanza di Object;
*nel secondo, invece, potrebbe non riuscire: un oggetto Collection potrebbe essere istanza di ArrayList, oppure di LinkedList, oppure di HashSet.
 
Le specifiche di linguaggio affermano che, se si cerca di convertire un oggetto di un tipo X ad un altro tipo Y di cui l'oggetto '''non''' è istanza, allora viene lanciata una ClassCastException. Questa regola viene talvolta utilizzata apposta nei programmi. Come si può notare leggendo le regole qui sopra, in questo caso il programmatore deve per forza aver messo un cast esplicito per la conversione.
 
== Gli Array ==