DATA TYPE
Un Data Type è una classificazione che specifica in modo preciso un insieme omogeneo di valori e le operazioni che possono essere applicate su questi valori. Se ad esempio prendiamo i numeri interi come Data Type, cioè l’insieme di quei numeri che non hanno una parte decimale, le operazioni che possiamo compiere su questo set di valori sono le operazioni aritmetiche. Anche se Java è un linguaggio di programmazione Object-Oriented è fondamentale capire che non tutti i valori che possiamo esprimere in Java sono realizzati come oggetti.

TIPI PRIMITIVI E TIPI RIFERIMENTO
I tipi primitivi vengono gestiti individualmente come valori, non sono istanze di una particolare classe. Tutti gli altri tipi, cioè ad esempio le classi predefinite di Java e i tipi che noi creiamo sono dei tipi riferimento. Andiamo adesso ad elencare con una figura i tipi primitivi.
PRIMITIVE DATA TYPE
NUMERI INTERI
Partiamo dai numeri interi, Java definisce quattro varianti che vediamo rappresentati in figura. Tutti i tipi interi sono con segno; quindi, vanno da un certo numero negativo a uno positivo. Ad esempio, il tipo byte contenuto in otto bit va da -128 a + 127. Infatti, con 28 possiamo rappresentare 256 diverse possibili combinazioni.
TIPI FLOATING POINT
Vediamo ora i tipi aventi una parte decimale, float e double. Double è il tipo che viene usato più comunemente data la sua grande precisione.
TIPI CHAR E BOOLEAN
Il tipo char viene utilizzato per rappresentare caratteri alfanumerici secondo lo standard Unicode. Il tipo boolean ammette solo due possibili valori, true o false, cioè vero o falso.
I LITERAL NUMERICI
Un literal è la forma letterale ed esplicita con cui possiamo rappresentare i tipi primitivi. Osserviamo questo numero:
250
Ovviamente non abbiamo difficoltà a riconoscere che si tratta di un numero intero, detto nella forma di un linguaggio di programmazione questa rappresentazione si chiama literal che oltre ad essere direttamente comprensibile a noi esseri umani, lo è anche per un compilatore. Possiamo rappresentare i numeri secondo certe basi, quella decimale, esadecimale, ottale e binaria.
Ti ricordo che la base esadecimale comprende i numeri da 0 a 9 e le lettere dalla A alla F. Deve iniziare con i caratteri 0X per far capire al compilatore che il literal è espresso in forma esadecimale. Quella che stai vedendo è la rappresentazione del numero 250.
I numeri ottali usano otto simboli dallo 0 al 7, deve essere preceduta da uno 0 per far capire al compilatore che il literal è espresso in base otto. Infine, possiamo usare la notazione binaria, Il numero deve essere preceduto dal prefisso 0b in modo che il compilatore lo tratti come un numero binario. Convertiamo il binario in decimale:
0x20 + 1×21 +0x22 + 1×23 + 1×24 +1×25 + 1×26 +1×27 = 250(decimale)
Indipendentemente dal formato literal Java e quindi la JVM trattano i numeri esclusivamente nella forma binaria. A volte i grandi numeri per esser meglio compresi dagli esseri umani si possono suddividere nella seguente maniera:
250000000 -> 250_000_000
Il trattino basso viene semplicemente ignorato dal compilatore.
LITERAL NUMERICI FLOATING POINT
Un numero floating point è un numero che possiede una parte intera e una parte decimale.
250.13
Il punto viene utilizzato per separare la parte intera dalla parte decimale, esiste anche la possibilità di rappresentare un literal floating point con la cosiddetta notazione esponenziale.
Nell’esempio che stai vedendo l’esponente è una potenza del dieci; quindi, volendo ottenere il numero floating point dobbiamo moltiplicare il numero per 100 ottenendo 250.13. L’esponente può essere anche negativo, quindi in questo caso il numero viene diviso per la potenza del dieci.
6.7e-2 -> 0.067
Un’altra cosa importante da sapere è che Java considera di default un numero floating point come double. Possiamo specificare in chiaro che intendiamo utilizzare un double aggiungendo alla fine del numero una lettera d maiuscola o minuscola.
250.13d
Se però vogliamo forzare il compilatore a usare un float dobbiamo specificare la lettera f.
250.13f
I LITERAL PER I CARATTERI
Definiamo innanzitutto cosa si intende per carattere in Java.
Per alfabeto dobbiamo pensare ai caratteri previsti dallo standard Unicode, il nostro ma non solo. I caratteri in Java occupano 16 bit e sono numeri senza segno 216 = 65536 possibili combinazioni. Si appoggiano su una tabella standard di conversione chiamata Unicode. I caratteri sono racchiusi all’interno di una coppia di singoli apici: ‘A’. Si possono specificare particolari sequenze di escape che iniziano con una barra rovesciata:
IL LITERAL BOOLEAN
Il literal boolean ammette solo due possibili valori, true e false. True indica che una certa condizione è vera, false il contrario. È un tipo che utilizzeremo spesso soprattutto nelle strutture di controllo e nei cicli.
TABELLA RIASSUNTIVA
I LITERAL PER LE STRINGHE
Le stringhe sono sequenze di caratteri che si inseriscono all’interno di una coppia di doppi apici, ad esempio:
“Questa è una stringa”
Le stringhe in realtà sono degli oggetti, infatti sono dei reference type come vedremo in seguito.
package it.corso.java.datatype; public class DataType { public static void typeInference(){ var myVar = 250; System.out.println("Il tipo di myVar è " + ((Object) myVar).getClass().getSimpleName()); } public static void scientificNotation(){ float f1 = 35e3f; double d1 = 12E4d; System.out.println("Value of 35e3f " + f1); System.out.println("Value of 12E4d " + d1); } public static void displayChar(){ char myVar1 = 65, myVar2 = 66, myVar3 = 67; System.out.println("Codice ASCII 65 " + myVar1); System.out.println("Codice ASCII 66 " + myVar2); System.out.println("Codice ASCII 67 " + myVar3); } public static void displayString(){ String txt = "Hello World"; System.out.println(txt.toUpperCase()); // Outputs "HELLO WORLD" System.out.println(txt.toLowerCase()); // Outputs "hello world" System.out.println(txt.indexOf( "World" )); // Outputs 6 } }
LE VARIABILI
Una variabile è un nome che noi andiamo ad assegnare ad un’area di memoria all’interno del quale andiamo ad archiviare un valore. Successivamente nel tempo possiamo modificare questo valore. Oltre a dare un nome la dichiarazione di variabili in Java prevede l’assegnamento di un particolare Data Type, in modo tale che il compilatore possa verificare che i valori che inseriamo in memoria siano conformi al Data Type.
Il valore 250 può essere modificato mentre il nome di variabile e il suo Data Type sono immutabili. Prima di utilizzare una variabile in Java occorre innanzitutto dichiararla con la seguente sintassi:
data_type identificatore;
Esempio:
int myVar;
myVar è l’identificatore che deve seguire certe regole di definizione che ora vediamo.
Le keyword sono le parole riservate del linguaggio Java. Dopo la dichiarazione una variabile deve essere inizializzata, cioè si deve riempire quell’area di memoria con la seguente sintassi:
data_type identificatore = valore;
Il simbolo di uguale rappresenta l’operatore di assegnamento, mentre il valore può essere un tipo literal oppure può essere anche il frutto di un’espressione. Volendo si possono dichiarare e inizializzare più variabili con una singola istruzione.
Se guardiamo bene una inizializzazione, che poi è un assegnamento fatto al momento della dichiarazione, si potrebbe pensare che sia superfluo indicare il Data Type in quanto il compilatore dal valore dieci potrebbe inferire il tipo di variabile. L’inferenza del tipo è stata introdotta in Java 10. L’inferenza del tipo non si può usare sempre ma solo con le variabili locali.
VARIABILI DI ISTANZA
Le variabili di istanza sono quelle variabile che sono definite all’interno di una classe, ma fuori dai metodi della classe stessa.
public class Numeri {
public int numeroX;
public int numeroY;
}
le variabili “numeroX” e “numeroY” sono dunque delle variabili di istanza. Le variabili di istanza verranno deallocate dalla memoria non appena l’oggetto, istanza della classe, non terminerà di esistere per esempio non appena il flusso dell’applicazione è terminato.
VARIABILI LOCALI
Le variabili locali sono tutte quelle variabili che vengono dichiarate ed utilizzate all’interno dei metodi di una classe.
public int sottrazione (int x, int y) {
int sottrazione;
sottrazione=x-y;
return sottrazione;
}
la variabile “sottrazione” sarà dunque una variabile locale. È importante specificare che la visibilità delle variabili locali è relativa al metodo nella quale viene dichiarata. Per esempio, se scrivessi un altro metodo all’interno della classe e facessi riferimento alla variabile “sottrazione” riceverei un messaggio di errore del compilatore che richiede di dichiarare la variabile perché, per quel metodo, di fatto non esiste. Una variabile locale viene deallocata non appena il metodo effettua il return e quindi ritorna al metodo principale main della classe.
LE COSTANTI
Possiamo considerare le costanti aventi sempre un nome come le variabili che punta una determinata area di memoria, solo che in questo caso la memoria è read-only, la costante una volta assegnata non può più essere modificata.
final data_type identificatore = valore;
per creare un valore costante si antepone la keyword final.
final double PIGRECO = 3.14169;
Il fatto di avere l’identificatore tutto maiuscolo non è obbligatorio, è una convenzione che deriva dal linguaggio C che serve anche a colpo d’occhio per non confondere variabili e costanti. Possiamo come le variabili differire la dichiarazione dall’assegnamento, questa è una cosa ammessa.
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
package it.corso.java.variabili; public class TestVariabili { protected String nome = "Marco"; /* Variabile di istanza. Vediamo con un esempio * perchè viene chiamata variabile di istanza, * guardando il metodo VariabileIstanza(). */ /* Variabile di classe. Tale variabile non appartiene ad una * specifica istanza, ma appartiene alla classe stessa. Questo * perchè abbiamo usato il modificatore static. Si possono avere * sia variabili che metodi statici (appartenenti alla classe * e non alle istanze). */ public static int myNumber = 100; public void myMethod() { int a = 100;/*Variabile locale viene creata quando viene invocato il metodo, e distrutta quando la variabile esce dal suo ambito di visibilità, ossia quando il metodo termina. */ System.out.println(a); System.out.println("myNumber vale: " + TestVariabili.myNumber); } public void variabileIstanza(){ /*Creiamo un oggetto di tipo TestVariabili o * più precisamente ne creiamo due istanze. La OOP sarà * spiegata approfonditamente più avanti nel corso, per * ora ti basta sapere che una classe è un pò come un prototipo * da cui vengono creati oggetti, detti appunto istanze della * classe. L'oggetto viene creato attraverso l'operatore new * che alloca la memoria necessaria per contenere la struttura * dati della classe. * */ TestVariabili t1 = new TestVariabili(); t1.nome = "Anna";//Variabile nome di istanza t1 TestVariabili t2 = new TestVariabili(); t2.nome = "Luca";//Variabile nome di istanza t2 System.out.println("Nome istanza t1:" + t1.nome); System.out.println("Nome istanza t2:" + t2.nome); /*OGNI ISTANZA MANTIENE LA PROPRIA COPIA DI VARIABILI */ } public void testParametri(String nome, String cognome, int anni){ System.out.println("Persona: " + nome + " " + cognome + " anni " + anni ); } }
package it.corso.java; import it.corso.java.variabili.*; import it.corso.java.datatype.*; public class CorsoJava { public static void main(String[] args) { CorsoJava.Variabili(); CorsoJava.DataType(); } public static void Variabili(){ TestVariabili.myNumber = 10; TestVariabili test = new TestVariabili(); test.MyMethod(); test.VariabileIstanza(); test.TestParametri("Marco", "Albasini", 55); } public static void DataType(){ DataType.DisplayChar(); DataType.TypeInference(); DataType.ScientificNotation(); DataType.DisplayString(); } }
Scrivi un commento