dichiarazione
Java è un linguaggio con un forte controllo sui tipi e per questo prima di poter utilizzare una variabile è necessario dichiarare il suo tipo (cioè quali informazioni potrà contenere e quali operazioni sara possibile effettuarci).
Una dichiarazione è una istruzione con la formatipo nomeVariabile
che specifica che da questo punto in avanti esisterà la variabile
nomeVariabile
che potrà contenere soltanto valori
del tipo specificato.
assegnazione
In java il simbolo = ci permette di assegnare un valore ad una variabile, non è da confondere con il concetto di uguaglianza della matematica.
Un assegnazione è una istruzione con la formanomeVariabile = espressione
che valuta l'espressione sulla destra e ne mette il risultato nella variabile presente sulla sinistra. Il tipo dell'espressione deve essere lo stesso o meno preciso di quello della variabile.
Tratteremo nei prossimi capitoli formalmente cosa è una espressione, per adesso il significato intuitivo
delle espressioni viste a matematica va bene. Un esempio di assegnazione potrebbe essere
x=4
che vuol semplicemente dire mettere il valore 4 dentro la variabile x
oppure x=y+1
che vuol dire "prendi il contenuto della variabile y, sommaci 1
e quel che viene mettilo nella variabile x".
Proviamo a vedere una assegnazione che potrebbe sembrare più particolare:
x = x + 4;
questa istruzione prende il valore della variabile x, ci aggiunge 4 e poi scrive il risultato sempre nella variabile x
visto che questa scrittura è molto comune abbiamo un modo per abbreviarla:
x += 4;
Spesso resta comodo fare la prima assegnazione insieme alla dichiarazione
di una variabile, ad esempio se voglio assegnare il valore 5 alla variabile
intera lunghezza posso scrivere:
int lunghezza = 5;
che è del tutto equivalente a:
int lunghezza;
.
lunghezza = 5;
Come posso fare per incrementare il valore di una variabile di 5 unità?
a+=5;uno dei modi possibili! a=5;così si assegna il valore 5 alla variabile a a=a+5;uno dei modi possibili!tipi di dato
Il tipo (o tipo di dato) indica le caratteristiche dei valori che una variabile o una espressione può assumere. Il tipo di una variabile viene definito al momento della sua dichiarazione e non può essere cambiato.classificazione dei tipi
Java divide i tipi delle variabili in due grandi gruppi: tipi base e tipi riferimento.
- Tipi base
- numeri interi (byte, short, int, long), numeri decimali (float, double), booleani (boolean) e caratteri (char).
- Tipi riferimento
- in pratica tutti gli altri, ad esempio: per rappresentare dei testi (String), vettori, pulsanti (Button)…
Tipi base: numeri interi
I tipi senza parte decimale si differenziano in base al numero più grande (in valore assoluto) che possono contenere.
- byte
- un numero intero (con segno), occupa 8 bit bit in memoria, i suoi valori vanno da -128 a 127, non si possono scrivere valori diquesto tipo: 34 non è un valore di tipo byte
- short
- numero intero (con segno), occupa 16 bit in memoria, i suoi valori vanno da -32768 a 32767, non si possono scrivere valori di questo tipo: 678 non è un valore di tipo short
- int
- numero intero (con segno), occupa 32 bit in memoria, i suoi valori vanno da -2147483648 ... 2147483647,
per ricordarci facilmente nell'ordine di ± due miliardi, i valori di questo tipo in si scrivono normalmente:
ad esempio
456
. - long
- numero intero (con segno), occupa in memoria 64 bit, i suoi valori vanno da -9223372036854775808 a 9223372036854775807,
per ricordarci più facilmente nell'ordine di ± 1018.
I numeri di tipo long si scrivono postponendo una "L" al numero intero, ad esempio14456L
è un valore long valido.
Tipi base: numeri decimali
Sono anche chiamati numeri in virgola mobile, e si differenziano in base alla precisione che hanno (tecnicamente il numero di cifre per la mantissa e per esponente).
Nei numeri in virgola mobile per separare la parte intera da quella decimale si usa il "." come nella notazione anglosassone e non la "," come nella notazione italiana.
- float
- numero in virgola mobile, in memoria occupa 32 bit, il numero più piccolo memorizzabile è circa ±1,45x10-45
e il più grande è circa 3,4x1038
I numeri di tipo float si scrivono utilizzando il "." per separare la parte decimale e postponendo una
"f" al numero, ad esempio
14.456f
è un valore float valido. - double
- numero in virgola mobile, in memoria occupa 64 bit, il numero più piccolo memorizzabile è circa ±4,5x10-324
e il più grande è circa 1,7x10308.
I numeri di tipo double si scrivono utilizzando il "." per separare la parte decimale, ad esempio14.456
è un valore double valido.
Tipi base: booleani
I booleani (a volte anche chiamati "valori di verità")
sono rappresentati dal tipo boolean
e possono contenere soltanto due valori: true
o false
.
Tipi base: caratteri
Il tipo che rappresenta un carattere è char
,
un char rappresenta un singolo carattere Unicode e va racchiuso tra
virgolette singole, ad esempio: 'a'
oppure '😱'
.
Quale dei seguenti tipi può contenere valori con la parte decimale?
byte no, numeri interi molto piccoli float long no, numero interi molto grandi double booleanno, soltanto true o falseTipi riferimento: testi, vettori, pulsanti …
I tipi riferimento sono molto numerosi e in più ognuno può definirne di nuovi, per comodità qui tratteremo soltanto il tipo che rappresenta i testi perché si usa molto spesso: String.
Una variabile di tipo String contiene un testo Unicode di lunghezza arbitraria racchiuso tra doppie virgolette come ad esempio: "ciao" o "ཨ་རོགས".
Una qualsiasi variabile di tipo riferimento se non viene inizializzata
assume un valore speciale: null
Il valore contenuto in una variabile di tipo riferimento è l'indirizzo
di memoria in cui inizia l'oggetto rappresentato dalla varibile stessa.
Ad esempio una variabile String testo
possiamo ipotizzare che contenga una
sequenza di caratteri che saranno memorizzati in una sequenza di byte: il
valore di testo è l'indirizzo di memoria in cui inizia la
sequenza di byte in questione.
Conversione di tipo
È a volte necessario convertire un valore da un tipo ad un altro, Java in automatico converte da un tipo meno preciso ad uno più preciso (es int → double oppure byte → int).
Se la variabile i è di tipo int e d è di tipo double posso
scrivere:
d = i
ma non il viceversa (i=d).
cast
Assegnare un valore più preciso ad un tipo meno preciso non può essere fatto automaticamente. Sarebbe a dire che non posso ad esempio mettere un valore in virgola mobile in una variabile di tipo intero perché si rischierebbe di perdere informazioni quindi se lo faccio java mi rileva un errore.
È possibile però forzare questa operazione quando si è sicuri che il valore sia convertibile usando l'operazione di cast che si fa racchiudendo tra parentesi tonde il nome di un tipo prima di un espessione.
Poniamo che la variabile x sia di tipo int: x=(int) 10.8
converte il
valore 10.8 ad un intero (non arrotondando ma troncando il valore) ottenendo quindi 10, questa operazione può essere
fatta tra i diversi tipi numerici, attenzione però che la converisone tra i tipi interi viene fatta
semplicemente scartando dei byte.
Quanto vale (byte) 257
?
L'operazione di cast può essere fatta anche in altri contesti che qui però non trattiamo.
convertire numeri in testi e viceversa
Le conversioni di questo genere sono meno ovvie e bisogna far uso di metodi specifici a seconda della conversione che si vuol fare:
- String → int
intero = Integer.parseInt(testo)
- String → double
decimale = Double.parseDouble(testo)
- numero → String
testo = String.valueOf(numero)
, spesso per comodità si usa la conversione automatica che fa Java quando si concatena una variabile di qualsiasi tipo ad una String, ad esempiotesto = "" + numero
.
Esempio: prodotto di due numeri
Poniamo che la nostra interfaccia contenga due caselle di testo (cOperando1 e cOperando2) in cui l'utente scrive due numeri interi e una etichetta (eRisultato) in cui vogliamo che venga visualizzato il prodotto dei due numeri interi
public void calcolaProdotto() {
String testo1, testo2, risposta;
int numero1, numero2, prodotto;
testo1 = cOperando1.getText();
testo2 = cOperando2.getText();
numero1 = Integer.parseInt(testo1);
numero2 = Integer.parseInt(testo2);
prodotto = numero1 * numero2;
risposta = String.valueOf(prodotto);
eRisultato.setText(risposta);
}
Esempio: divisione di due numeri
Poniamo che la nostra interfaccia contenga due caselle di testo (cOperando1 e cOperando2) in cui l'utente scrive due numeri decimali e una etichetta (eRisultato) in cui vogliamo che venga visualizzato il rapporto tra i due numeri decimali
public void calcolaRapporto() {
String testo1, testo2, risposta;
double numero1, numero2, rapporto;
testo1 = cOperando1.getText();
testo2 = cOperando2.getText();
numero1 = Double.parseDouble(testo1);
numero2 = Double.parseDouble(testo2);
rapporto = numero1 / numero2;
risposta = "" + rapporto;
eRisultato.setText(risposta);
}
Osservando la penultima riga vedrai che un argomento dell'operatore è di tipo stringa e l'altro è di tipo double. Quando uno degli operandi è di tipo stringa, Java rappresenterà anche l'altro operando come stringa, eseguendo così una conversione implicita da double a testo. Dato che la stringa vuota concatenata ad una seconda stringa (che è il risultato della trasformazione in stringa di rapporto) restituisce esattamente laa stringa rappresentante il numero, abbiamo ottenuto ciò che si voleva.
Se lunghezza è una variabile di tipo intero e testo è una variabile di tipo String che contiene la rappresentazione di un numero come posso fare per avere il valore che rappresenta in lunghezza?
Integer.parseInt(testo, lunghezza)Integer.parseInt() ha un solo argomento qui ne vengono usati due testo=Integer.parseInt(lunghezza)L'argomento dei Integer.parseInt() deve essere il testo, come risultato dà un numero, qui l'argomento è un numero lunghezza=Integer.parseInt(testo)Per terminare prova ad analizzare la seguente funzione analoga alla precedente:
public void calcolaProdotto() {
int numero1, numero2, prodotto;
numero1 = Integer.parseInt(operando1.getText());
numero2 = Integer.parseInt(operando2.getText());
prodotto = n1 * n2;
risultato.setText("" + prodotto);
}
Come si vede si tratta della sola eliminazione delle variabili stringa che erano state utilizzate per leggere i valori (in questo caso l'istruzione per leggere è stata inserita direttamente in Integer.parseInt() ) o per calcolare il risultato che andava poi visualizzato.
Crea un programma che calcola l'area e il perimetro di un quadrato, il lato del quadrato è un numero senza parte decimale.