- 1 1. Cosa sono le “variabili” in Java?
- 2 2. Nozioni di base sulle variabili: differenza tra dichiarazione, assegnazione e inizializzazione
- 2.1 2.1 Dichiarazione: Prepararsi a Usare una Variabile
- 2.2 2.2 Assegnazione: Inserire un Valore in una Variabile
- 2.3 2.3 Inizializzazione: Assegnare un Valore al Momento della Dichiarazione
- 2.4 2.4 Perché Non Puoi Usare una Variabile Solo con una Dichiarazione (Regole delle Variabili Locali)
- 2.5 2.5 Dichiarare più Variabili in una Volta (Con Cautela)
- 2.6 2.6 Riepilogo della Sezione
- 3 3. Comprendere i “Tipi” di Variabile (Tipi Primitivi e Tipi di Riferimento)
- 3.1 3.1 I tipi Java rientrano in due grandi categorie
- 3.2 3.2 Cosa sono i tipi primitivi? (Tipi che contengono il valore stesso)
- 3.3 3.3 Caratteristiche e avvertenze dei tipi primitivi
- 3.4 3.4 Cosa sono i tipi di riferimento? (Tipi che gestiscono dove vive il valore)
- 3.5 3.5 Cosa succede quando assegni tipi di riferimento?
- 3.6 3.6 Punti di confusione comuni per i principianti
- 3.7 3.7 Riepilogo della sezione
- 4 4. Tipi di variabili (dove vivono) e ambito (dove sono validi)
- 5 5. Utilizzare correttamente var (inferenza di tipo) in Java 10+
- 6 6. “Non voglio cambiare questo valore”—final e l’idea di costanti
- 6.1 6.1 Cos’è final? (Impedire la riassegnazione)
- 6.2 6.2 Perché usare final su variabili locali?
- 6.3 6.3 Usare final sui campi
- 6.4 6.4 Nota importante per final con tipi di riferimento (confusione comune per i principianti)
- 6.5 6.5 Che cos’è una costante? (static final)
- 6.6 6.6 Come decidere quando usare final
- 6.7 6.7 Riepilogo della sezione
- 7 7. Valori iniziali, valori di default e errori comuni (recupero da trappole per principianti)
- 7.1 7.1 Le variabili locali non ricevono valori di default
- 7.2 7.2 I campi ottengono automaticamente valori predefiniti
- 7.3 7.3 Errori causati da null (NullPointerException)
- 7.4 7.4 Usare una variabile al di fuori del suo ambito
- 7.5 7.5 Confusione da variabili con lo stesso nome (Shadowing rivisitato)
- 7.6 7.6 Errori di compilazione dovuti a incompatibilità di tipo
- 7.7 7.7 Riepilogo della sezione
- 8 8. Riepilogo: Punti chiave da padroneggiare per primi per le variabili Java
- 8.1 8.1 Considera le variabili Java come un insieme di “Tipo, Nome e Valore”
- 8.2 8.2 Distinguere chiaramente dichiarazione, assegnazione e inizializzazione
- 8.3 8.3 Essere consapevoli della differenza tra tipi primitivi e tipi di riferimento
- 8.4 8.4 Comprendere lo Scope Riduce Drasticamente gli Errori
- 8.5 8.5 Usa var e final in Base allo Scopo
- 8.6 8.6 Linee Guida per Principianti per Scrivere in Sicurezza
- 8.7 8.7 Prossimi Argomenti da Imparare per una Comprensione più Profonda
1. Cosa sono le “variabili” in Java?
Quando inizi a studiare Java, uno dei primi concetti importanti che incontri è la “variabile”.
In breve, una variabile è un contenitore usato per memorizzare temporaneamente valori (dati) all’interno di un programma così da poterli riutilizzare quante volte è necessario.
Tuttavia, in Java ti bloccherai rapidamente se memorizzi le variabili semplicemente come “scatole”.
Questo perché le variabili Java sono gestite insieme a un “tipo” (il tipo di dato).
In questa sezione organizzeremo il ruolo delle variabili e il modo di pensare specifico di Java (l’importanza dei tipi) per i principianti.
1.1 Cosa puoi fare con le variabili (memorizzare valori e riutilizzarli)
Con le variabili, un programma può passare da “calcoli una tantum” a “elaborazioni significative”.
Ad esempio, puoi scrivere numeri direttamente così:
System.out.println(100 + 20);
Questo funziona, ma i valori non hanno significato, quindi chi legge il codice più tardi (incluso il tuo futuro io) avrà difficoltà.
Non saprai “Che cos’è 100?” o “Che cos’è 20?”
Usando le variabili, puoi dare un significato ai valori.
int price = 100;
int tax = 20;
System.out.println(price + tax);
Utilizzare le variabili in questo modo offre i seguenti vantaggi:
- Più facile comprendere l’intento (nomi come prezzo e tassa trasmettono significato)
- Puoi riutilizzare i valori più volte (non è necessario scrivere lo stesso valore più e più volte)
- Più facile da modificare in seguito (se l’aliquota fiscale cambia, devi modificare solo il valore della variabile)
- Puoi conservare risultati intermedi (scomponi logiche complesse in passaggi più piccoli)
Specialmente per un principiante, va bene pensare a “variabili = dare un nome ai valori”.
Tuttavia, in Java il concetto successivo—i “tipi”—arriva sempre come un insieme.
1.2 Le variabili Java sono usate con i “tipi” (sicurezza dei tipi)
In Java, le variabili vengono generalmente create nella seguente forma:
type variableName = value;
Esempio:
int age = 20;
String name = "Sagawa";
Il punto chiave qui è il tipo.
intè un intero (es. 20, 100, -5)Stringè una stringa (es. “Hello”, “Java”)
In Java, quando crei una variabile, dichiari esplicitamente “che tipo di valore questa variabile può contenere”.
Grazie a questo sistema, Java ha dei punti di forza come i seguenti.
Cosa significa “type‑safe”?
Poiché specifichi i tipi, Java può impedirti di inserire un valore del tipo sbagliato in una variabile.
Ad esempio, se provi a mettere una stringa in una variabile int, otterrai un errore di compilazione.
int age = "20"; // This is an error
Questo non è un inconveniente—è in realtà utile.
Invece di “rompersi dopo aver eseguito il programma”, puoi “rilevare gli errori prima di eseguirlo”.
I principianti a volte pensano che “Java abbia molti errori” a causa di questo, ma se cambi prospettiva:
- Java trova le incongruenze di tipo in anticipo
- Più grande è il progetto, più i tipi aiutano a ridurre gli incidenti
Quest’idea—“i tipi e le variabili arrivano come un set”—è una delle basi più fondamentali di Java.
Nota: Anche con le “variabili” ci sono “valori” e “riferimenti”
Le variabili Java sono gestite in due modi principali:
- Tipi primitivi: gestiscono direttamente il valore (es.
int,double,boolean) - Tipi di riferimento: gestiscono non il valore stesso, ma la posizione (riferimento) dove il valore è memorizzato (es.
String, array, classi)
Non approfondiremo qui, ma è un punto di confusione comune per i principianti, quindi vale la pena menzionarlo fin da subito.
Ad esempio, String è un tipo di riferimento.
Può sembrare che tu stia “memorizzando una stringa”, ma in realtà stai tenendo “un riferimento a un oggetto stringa”.
Questa differenza è collegata anche a temi che imparerai più tardi, come “== vs equals” e “come si comporta final”.
2. Nozioni di base sulle variabili: differenza tra dichiarazione, assegnazione e inizializzazione
Per comprendere correttamente le variabili Java,
è importante organizzare le differenze tra “dichiarazione”, “assegnazione” e “inizializzazione”.
I principianti spesso usano queste tre parole come se avessero lo stesso significato,
ma in realtà hanno ruoli chiaramente diversi.
Se mantieni questa ambiguità,
è più probabile che finisca nello stato di
“Non so perché è un errore” o “Non so perché non posso usarlo.”
2.1 Dichiarazione: Prepararsi a Usare una Variabile
Dichiarazione significa dire a Java:
“Sto per usare una variabile con questo nome,” e “il suo tipo è questo.”
La dichiarazione più basilare appare così:
int count;
A questo punto, sono successe solo queste due cose:
- Creare una variabile chiamata
count - Decidere che il suo tipo è
int(un intero)
Nessun valore è stato ancora memorizzato.
Questa è una comune idea sbagliata dei principianti:
dichiarare una variabile da sola non la rende “pronta all’uso.”
2.2 Assegnazione: Inserire un Valore in una Variabile
Assegnazione significa inserire un valore in una variabile che è già stata dichiarata.
count = 10;
Questo = non significa “uguale” in matematica.
Significa mettere il valore a destra nella variabile a sinistra.
Quindi il flusso diventa:
int count; // declaration
count = 10; // assignment
Questa è l’idea.
Nota: Non Puoi Assegnare a una Variabile Non Dichiarata
Il codice seguente genera un errore:
count = 10; // Error: count has not been declared
In Java, l’ordine deve essere dichiarazione → assegnazione.
2.3 Inizializzazione: Assegnare un Valore al Momento della Dichiarazione
Inizializzazione significa fare dichiarazione e assegnazione allo stesso tempo.
int count = 10;
Questo è semanticamente lo stesso di queste due righe:
int count;
count = 10;
In Java—sia nel lavoro reale sia nell’apprendimento—
nella maggior parte dei casi, va bene assumere che userai “inizializzazione.”
Questo perché ha i seguenti vantaggi:
- La variabile diventa utilizzabile nel momento in cui è creata
- Previene errori causati da variabili non inizializzate
- Il codice diventa più facile da leggere
Quindi, come principiante, è consigliato sviluppare l’abitudine di
“inizializzare le variabili al momento in cui le dichiari.”
2.4 Perché Non Puoi Usare una Variabile Solo con una Dichiarazione (Regole delle Variabili Locali)
In Java, esistono regole molto rigide per le variabili locali (variabili all’interno dei metodi). Java è particolarmente severo in questo aspetto.
Il codice seguente genera un errore di compilazione:
int number;
System.out.println(number); // Error
Il motivo è chiaro:
Le variabili locali non possono essere usate a meno che non siano inizializzate
Quella regola esiste.
Java tratta lo stato “non sappiamo cosa c’è dentro number” come
uno stato pericoloso e lo blocca come errore prima dell’esecuzione.
Questo può sembrare severo per i principianti, ma nello sviluppo su larga scala,
è un meccanismo di sicurezza molto importante.
2.5 Dichiarare più Variabili in una Volta (Con Cautela)
In Java, puoi dichiarare più variabili dello stesso tipo insieme.
int x, y, z;
Puoi anche scriverlo così:
int a = 1, b = 2, c = 3;
Questo è sintatticamente corretto, ma può ridurre la leggibilità, quindi fai attenzione.
Specialmente per i principianti e lo sviluppo in team, è più sicuro scrivere:
int a = 1;
int b = 2;
int c = 3;
come una variabile per riga.
2.6 Riepilogo della Sezione
Punti chiave da ricordare da questa sezione:
- Dichiarazione : decide il nome e il tipo della variabile
- Assegnazione : inserire un valore in una variabile
- Inizializzazione : dichiarare e assegnare allo stesso tempo
- Le variabili locali non possono essere usate a meno che non siano inizializzate
- Come principiante, usa “dichiarazione + inizializzazione” come impostazione predefinita
3. Comprendere i “Tipi” di Variabile (Tipi Primitivi e Tipi di Riferimento)
Quando si lavora con le variabili Java, non si può evitare di comprendere i tipi. Ciò che spesso confonde i principianti è:
- Perché ci sono così tanti tipi
- Perché i numeri hanno sia
intchedouble - Come
Stringdifferisce dai tipi numerici
.In questa sezione, organizzeremo i tipi Java da due prospettive:
“tipi primitivi” e “tipi di riferimento.”
3.1 I tipi Java rientrano in due grandi categorie
I tipi di variabili Java possono essere classificati in modo generico nelle seguenti due categorie:
- Tipi primitivi
- Tipi di riferimento
Una volta compresa questa classificazione, gli argomenti che imparerai in seguito — come “== vs equals”, “come si comporta final” e “come funziona la memoria” — diventano molto più facili da capire.
3.2 Cosa sono i tipi primitivi? (Tipi che contengono il valore stesso)
I tipi primitivi sono tipi che contengono direttamente il valore stesso.
Di seguito alcuni tipi primitivi comuni:
int count = 10;
double price = 19.99;
boolean isActive = true;
Queste variabili memorizzano
il “valore stesso” all’interno della variabile.
Tipi primitivi più usati
| Type | Meaning | Example Use |
|---|---|---|
int | Integer | Counts, age, number of times |
long | Large integer | Amounts of money, IDs |
double | Decimal | Prices, ratios |
boolean | True/false | Flag checks |
char | Single character | Character processing |
Come principiante, è sufficiente prima padroneggiare int, double e boolean.
3.3 Caratteristiche e avvertenze dei tipi primitivi
I tipi primitivi hanno le seguenti caratteristiche:
- Contengono il valore stesso
- Sono veloci da elaborare
- Non è possibile assegnare
null - La dimensione è fissa
Ad esempio, nel codice seguente,
a e b contengono valori completamente indipendenti.
int a = 5;
int b = a;
b = 10;
In questo caso:
arimane 5bcambia a 10
Questo è il risultato.
Ciò è dovuto al fatto che il valore stesso è stato copiato.
3.4 Cosa sono i tipi di riferimento? (Tipi che gestiscono dove vive il valore)
D’altra parte, i tipi di riferimento
sono tipi che non gestiscono il valore stesso, ma la posizione (riferimento) dove il valore esiste.
I tipici tipi di riferimento includono:
String name = "Java";
int[] numbers = {1, 2, 3};
String- Array
- Classi
- Interfacce
- Collezioni come List / Map
Tutti questi sono tipi di riferimento.
Comprendere i tipi di riferimento con un’immagine
Una variabile di tipo riferimento contiene:
- non l’oggetto reale stesso, ma
- un “indirizzo” che punta a dove l’oggetto reale è memorizzato
Questo è il modello mentale.
3.5 Cosa succede quando assegni tipi di riferimento?
Guarda il codice seguente:
String a = "Hello";
String b = a;
b = "World";
In questo caso:
aè “Hello”bè “World”
Questo è il risultato.
Se ti limiti a guardare questo, potresti pensare,
“Non è lo stesso dei tipi primitivi?”
E per quanto riguarda l’esempio successivo?
int[] array1 = {1, 2, 3};
int[] array2 = array1;
array2[0] = 100;
Il risultato è:
array1[0]→ 100array2[0]→ 100
Ciò avviene perché array1 e array2 si riferiscono allo stesso array.
Con i tipi di riferimento:
- Assegnare variabili può farle “puntare allo stesso oggetto reale”
- Modificare il contenuto può influenzare tutte le variabili che lo riferiscono
Questa è la caratteristica chiave.
3.6 Punti di confusione comuni per i principianti
Riassumiamo i punti di difficoltà più comuni:
- Tipi primitivi → il valore è copiato
- Tipi di riferimento → il riferimento (posizione) è copiato
Questa differenza è strettamente legata ai seguenti argomenti:
- La differenza tra
==e.equals() - Cosa succede quando si usa
final - Come il passaggio di valori come argomenti di metodo influisce su ambito e comportamento
Per ora, è sufficiente ricordare solo questo:
i tipi di riferimento a volte possono condividere lo stesso oggetto reale.
3.7 Riepilogo della sezione
- I tipi Java sono divisi in tipi primitivi e tipi di riferimento
- I tipi primitivi gestiscono “il valore stesso”
- I tipi di riferimento gestiscono “la posizione (riferimento) del valore”
- Con i tipi di riferimento, l’assegnazione e le modifiche possono influenzare altre variabili
4. Tipi di variabili (dove vivono) e ambito (dove sono validi)
In Java, le variabili non differiscono solo per “tipo”.
Il loro comportamento cambia anche a seconda di dove sono dichiarate (dove vivono).
Se non comprendi questa differenza, potresti confonderti su cose come:
- “Non posso usare la variabile che ho dichiarato prima”
- “Ha lo stesso nome, ma il valore è diverso”
- “Non capisco perché non posso fare riferimento ad essa qui”
In questa sezione, organizzeremo
tipi di variabili e ambito per i principianti.
4.1 Cos’è l’Ambito? (Dove può essere usata una variabile)
Ambito significa
l’intervallo in cui una variabile può essere usata.
In Java, l’ambito è determinato rigidamente da:
- dove la variabile è dichiarata
- l’intervallo delle parentesi graffe
{ }
La regola di base è molto semplice:
Una variabile può essere usata solo all’interno del blocco in cui è dichiarata
4.2 Variabili Locali (Variabili all’interno dei Metodi)
Le variabili locali sono variabili dichiarate all’interno di metodi o blocchi (come if e for).
public void sample() {
int x = 10; // local variable
System.out.println(x);
}
Questo x ha queste caratteristiche:
- Valido solo all’interno del metodo
sample - Scompare quando il metodo termina
Esempio di Ambito con Blocchi
if (true) {
int y = 5;
System.out.println(y);
}
System.out.println(y); // Error
Poiché y è dichiarata all’interno del blocco if, non può essere usata al di fuori di esso.
Regole Importanti per le Variabili Locali
Le variabili locali hanno regole rigide:
- Non puoi usarle se non sono inizializzate
- Nessun valore predefinito è assegnato automaticamente
int value; System.out.println(value); // compile-time error
Questo fa parte del design di sicurezza di Java per evitare l’uso di “valori non definiti”.
4.3 Campi (Variabili d’Istanza)
I campi sono variabili dichiarate all’interno di una classe ma al di fuori dei metodi.
public class Sample {
int count; // field (instance variable)
public void printCount() {
System.out.println(count);
}
}
I campi hanno caratteristiche diverse dalle variabili locali:
- Ogni istanza della classe ha la propria copia
- Sono automaticamente inizializzate con valori predefiniti
- Possono essere usate da qualsiasi metodo della classe
Valori Predefiniti per i Campi
A seconda del tipo, i seguenti valori predefiniti sono impostati automaticamente:
int→ 0double→ 0.0boolean→ false- Tipi di riferimento → null
Quindi il seguente codice non produce un errore:
public class Sample {
int count;
public void print() {
System.out.println(count); // 0
}
}
Tuttavia, fare troppo affidamento sui valori predefiniti non è consigliato.
L’inizializzazione esplicita rende più chiara l’intenzione del codice.
4.4 Variabili statiche (Variabili di Classe)
Una variabile con static diventa
una variabile condivisa in tutta la classe.
public class Counter {
static int total = 0;
}
Questo total ha queste caratteristiche:
- Ne esiste solo una per classe
- Condivisa da tutte le istanze
Modello Mentale per le Variabili statiche
- Variabili d’istanza → il portafoglio di ogni persona
- Variabili statiche → la cassaforte condivisa di un’azienda
Quel modello rende più facile la comprensione.
Avvertenze per le Variabili statiche
Le variabili statiche sono utili, ma memorizzare troppi stati può causare bug.
- È difficile tracciare dove sono avvenuti i cambiamenti
- Il testing diventa più difficile
- I problemi sono più probabili nell’elaborazione concorrente
Come principiante, è consigliato limitare l’uso a cose come:
- Costanti
- Valori di configurazione condivisi
e scopi simili.

4.5 Attenzione alle Variabili con lo Stesso Nome (Shadowing)
Guarda il seguente codice:
public class Sample {
int value = 10;
public void test() {
int value = 5;
System.out.println(value);
}
}
In questo caso, l’output è 5.
Questo perché la variabile locale sta nascondendo il campo (shadowing).
Poiché questa è una fonte comune di confusione per i principianti:
- Evita nomi di variabili duplicati
- Non riutilizzare lo stesso nome a meno che non sia intenzionale
Questa disciplina è importante.
4.6 Riepilogo della Sezione
answer. Lo scope significa “l’intervallo in cui una variabile può essere usata” * Le variabili locali sono valide solo all’interno dei blocchi e devono essere inizializzate * I campi ricevono automaticamente valori predefiniti * Le variabili static* sono condivise all’interno della classe * Fai attenzione all’ombreggiamento causato da variabili con lo stesso nome
5. Utilizzare correttamente var (inferenza di tipo) in Java 10+
Introdotto in Java 10, var è
un modo per consentire al compilatore di inferire il tipo di una variabile.
Può sembrare comodo, ma se usato in modo improprio può facilmente portare a “codice difficile da leggere”.
Perciò è importante comprendere le regole e quando usarlo.
5.1 Cos’è var? (Come funziona senza scrivere il tipo)
In Java normale, dichiari una variabile così:
String message = "Hello";
Con var, puoi scrivere:
var message = "Hello";
A questo punto, Java guarda il lato destro "Hello" e decide:
- Questa variabile è di tipo
String
Il punto importante è che var non è tipizzazione dinamica.
- Il tipo è determinato al momento della compilazione
- Il tipo non cambia a runtime
Quindi pensa a var come a “una scorciatoia che ti permette di omettere il tipo”.
5.2 Dove puoi e dove non puoi usare var
var può essere usato solo in luoghi strettamente definiti.
Dove puoi usarlo
- Solo variabili locali
public void sample() { var count = 10; }
Dove non puoi usarlo
Tutti i seguenti usi generano errori:
var x; // No initialization → error
var y = null; // Cannot infer the type → error
class Sample {
var value = 10; // Cannot be used for fields → error
}
Il motivo di queste restrizioni è chiaro: evitare di ridurre leggibilità e sicurezza.
5.3 Vantaggi dell’uso di var
var brilla quando
il tipo tende a diventare lungo.
ArrayList<String> list = new ArrayList<String>();
Con var:
var list = new ArrayList<String>();
Diventa molto più pulito.
In altre parole, var è utile quando:
- I generics sono lunghi
- Il tipo è ovvio dal lato destro
Usato in questo modo, può migliorare la leggibilità.
5.4 Insidie di var (Errori comuni per i principianti)
var è comodo, ma se i principianti lo usano troppo, possono verificarsi i seguenti problemi.
Il tipo diventa difficile da vedere
var data = getData();
Da questa sola riga, non puoi capire:
- Qual è il tipo dei dati
- Cosa contiene
In casi come questo, è più sicuro scrivere esplicitamente il tipo.
Data data = getData();
Può diventare un tipo non intenzionale
var number = 10; // int
I principianti spesso incontrano casi come “Pensavo fosse lungo”.
Quando non scrivi il tipo esplicitamente, la tua intenzione e il tipo effettivamente inferito possono divergere, quindi fai attenzione.
5.5 Come decidere se usare var
Se non sei sicuro, usa questi criteri:
- Se il tipo è ovvio dal lato destro →
varva bene - Se il tipo ha un significato importante → scrivi il tipo esplicitamente
- Codice per principianti / di apprendimento → scrivi il tipo il più possibile
- Sviluppo in team → segui gli standard di codifica
Specialmente durante l’apprendimento, scrivere il tipo aiuta a approfondire la comprensione, quindi non è necessario forzarsi a usare var.
5.6 Riepilogo della sezione
varè una scorciatoia per l’inferenza di tipo- Non è tipizzazione dinamica; il tipo è fissato al momento della compilazione
- È valido solo per variabili locali e richiede l’inizializzazione
- È importante distinguere quando migliora o riduce la leggibilità
6. “Non voglio cambiare questo valore”—final e l’idea di costanti
In Java, l’idea di progettazione “una volta che un valore è deciso, non lasciarlo cambiare in seguito” è molto importante.
Lo strumento per questo è final.
I principianti spesso pensano che “final sia qualcosa che si mette sulle costanti”, ma in realtà ha un significato più ampio.
6.1 Cos’è final? (Impedire la riassegnazione)
.
Una variabile dichiarata final non può essere riassegnata dopo che l’hai assegnata una volta.
final int maxCount = 10;
maxCount = 20; // compile-time error
La regola è molto semplice:
- Puoi inizializzarla
- Non puoi riassegnarla
È tutto quello che devi ricordare.
6.2 Perché usare final su variabili locali?
Aggiungere final a una variabile locale rende chiaro che:
- Questa variabile non cambia a metà percorso
- Il valore è fisso
Aiuta a esprimere chiaramente la tua intenzione nel codice.
final int basePrice = 100;
int total = basePrice + 20;
Scriverlo in questo modo:
- Aiuta a prevenire modifiche accidentali
- Fa sentire il lettore più sicuro
Questi sono i vantaggi.
6.3 Usare final sui campi
Aggiungere final a un campo lo rende
un valore immutabile per quell’istanza.
public class User {
final String name;
public User(String name) {
this.name = name;
}
}
In questo caso:
namepuò essere impostato una sola volta nel costruttore- Non può essere modificato successivamente
Questo è un approccio di design importante per stabilizzare lo stato dell’oggetto.
6.4 Nota importante per final con tipi di riferimento (confusione comune per i principianti)
Questo è un punto molto importante:
final int[] numbers = {1, 2, 3};
numbers[0] = 100; // OK
numbers = new int[]{4, 5, 6}; // Error
Perché succede?
Il motivo è che final limita “la riassegnazione del riferimento”.
- Modificare il contenuto dell’array → OK
- Cambiare a quale array il riferimento punta → NG
In altre parole, final non rende i contenuti immutabili.
Se non capisci questo, potresti confonderti e pensare:
- “Perché può cambiare anche se è final?”
- “È un bug?”
Ecco perché questa distinzione è importante.
6.5 Che cos’è una costante? (static final)
In Java, quello che la gente chiama comunemente “costante” è tipicamente definito con static final per convenzione.
public class Config {
public static final int MAX_USERS = 100;
}
Questo tipo di costante presenta le seguenti caratteristiche:
- Condivisa in tutta la classe
- Il valore non può essere modificato
- Puoi darle un nome significativo
Convenzione di denominazione per le costanti
Le costanti sono generalmente scritte nello stile seguente:
UPPER_SNAKE_CASE
Esempio:
static final double TAX_RATE = 0.1;
6.6 Come decidere quando usare final
Come principiante, i seguenti criteri sono facili da applicare:
- Se il valore non deve cambiare → aggiungi
final - Valori di configurazione / valori di base → usa
static final - Se modifiche accidentali sarebbero problematiche → aggiungi
final
Specialmente nella pratica, un atteggiamento comune è:
“Se non sei sicuro, aggiungi
final.”
In molti casi, è un buon compromesso.
6.7 Riepilogo della sezione
- Con
final, non puoi riassegnare la variabile - Puoi usarlo sia per variabili locali sia per campi
finalsu tipi di riferimento non significa “contenuti immutabili”- Le costanti sono definite con
static final finalè uno strumento per scrivere codice più sicuro e più chiaro
7. Valori iniziali, valori di default e errori comuni (recupero da trappole per principianti)
Finora hai imparato le dichiarazioni, i tipi, lo scope, var e final.
Nella pratica, però, ci sono molte situazioni in cui “capisco il concetto, ma continuo a ricevere errori.”
In questa sezione organizzeremo i punti di difficoltà più comuni per i principianti insieme alle relative cause.
7.1 Le variabili locali non ricevono valori di default
Prima di tutto, una regola molto importante:
Le variabili locali non ricevono valori di default automatici
Il codice seguente genera un errore di compilazione:
public void sample() {
int x;
System.out.println(x); // Error
}
Il motivo è semplice: Java non consente lo stato in cui “non sappiamo cosa c’è dentro x”.
Approccio corretto
public void sample() {
int x = 0;
System.out.println(x);
}
Per le variabili locali, segui rigorosamente la regola: inizializzale sempre tu stesso.
7.2 I campi ottengono automaticamente valori predefiniti
D’altra parte, i campi (variabili d’istanza e variabili statiche)
vengono assegnati automaticamente valori iniziali.
public class Sample {
int count;
boolean active;
String name;
}
I valori predefiniti sono i seguenti:
int→ 0double→ 0.0boolean→ false- Tipi di riferimento → null
Quindi il codice seguente non genera errori:
public class Sample {
int count;
public void print() {
System.out.println(count); // 0
}
}
Tuttavia, i progetti che si basano sui valori predefiniti non sono consigliati.
Rendono più difficile capire l’intento e possono facilmente diventare terreno fertile per bug.
7.3 Errori causati da null (NullPointerException)
Il valore predefinito per i tipi di riferimento è null.
String text;
Se chiami un metodo in questo stato, otterrai un errore di runtime:
System.out.println(text.length()); // NullPointerException
Questa è una delle eccezioni più comuni che i principianti incontrano.
Contromisure di base
- Inizializza quando possibile
- Considera la possibilità di
null - Progetta per evitare l’uso non intenzionale di
nullString text = "";
Anche l’inizializzazione con una stringa vuota può prevenire molti incidenti.
7.4 Usare una variabile al di fuori del suo ambito
Il seguente è un altro errore comune:
if (true) {
int value = 10;
}
System.out.println(value); // Error
Questo è un problema di riferimento fuori dall’ambito.
valueè valido solo all’interno del bloccoif- Fuori dal blocco, non esiste
Riconferma quella regola.
7.5 Confusione da variabili con lo stesso nome (Shadowing rivisitato)
public class Sample {
int value = 10;
public void test() {
int value = 5;
System.out.println(value);
}
}
Questo codice stampa 5.
I principianti spesso pensano erroneamente che:
- Verrà usato il valore del campo
Ma in realtà,
l’ambito interno ha la priorità.
Poiché lo shadowing causa confusione:
- Usa nomi di variabili distinti in base ai ruoli
Tieni presente.
7.6 Errori di compilazione dovuti a incompatibilità di tipo
La seguente assegnazione non è consentita:
int number = 3.14; // Error
Questo perché:
double→intnon viene convertito automaticamente
Questa è la regola.
Approccio corretto (quando lo intendi)
int number = (int) 3.14; // 3
Tuttavia, fai attenzione che la parte decimale viene troncata.
7.7 Riepilogo della sezione
- Le variabili locali devono essere inizializzate
- I campi ottengono valori predefiniti, ma non fare troppo affidamento su di essi
nullspesso causa errori di runtime- Non puoi usare le variabili al di fuori del loro ambito
- Le incompatibilità di tipo sono prevenute con errori di compilazione
8. Riepilogo: Punti chiave da padroneggiare per primi per le variabili Java
In questo articolo, abbiamo organizzato l’argomento “variabili Java” passo dopo passo,
concentrandoci sui punti che i principianti trovano comunemente confusi.
Infine, riassumiamo i punti chiave
in una forma utile sia per l’apprendimento che per la programmazione reale.
8.1 Considera le variabili Java come un insieme di “Tipo, Nome e Valore”
Le variabili Java hanno sempre questi tre elementi:
- Tipo : che tipo di valore contiene
- Nome : cosa rappresenta il valore
- Valore : i dati effettivi memorizzati
int count = 10;
Questa singola riga contiene l’intera essenza delle variabili Java.
8.2 Distinguere chiaramente dichiarazione, assegnazione e inizializzazione
Una trappola comune per i principianti è confondere le differenze tra questi tre termini:
- Dichiarazione: preparare l’uso di una variabile
- Assegnazione: inserire un valore
- Inizializzazione: dichiarare e assegnare allo stesso tempo
Specialmente per le variabili locali,
ricorda la regola: non puoi usarle se non sono inizializzate.
8.3 Essere consapevoli della differenza tra tipi primitivi e tipi di riferimento
I tipi Java sono ampiamente divisi in due categorie:
- Tipi primitivi: gestiscono il valore stesso
- Tipi di riferimento: gestiscono la posizione (riferimento) del valore
Tenere a mente questa differenza ti aiuta a comprendere naturalmente:
- Copia del valore
- Come si comportano array e oggetti
- Cosa significa realmente
final
8.4 Comprendere lo Scope Riduce Drasticamente gli Errori
Le variabili possono essere usate solo nel punto in cui sono dichiarate.
- Variabili locali → valide solo all’interno dei blocchi
- Campi → disponibili in tutta la classe
- Variabili statiche → condivise in tutta la classe
Se ti capita di pensare “Non capisco perché non posso usarla,”
sospetta prima lo scope.
8.5 Usa var e final in Base allo Scopo
var→ Usalo solo quando il tipo è chiaro e la leggibilità migliorafinal→ Usalo per esprimere chiaramente l’intento “questo valore non dovrebbe cambiare”
Entrambi sono comodi, ma fai attenzione a non trasformare “usarli” nell’obiettivo stesso.
8.6 Linee Guida per Principianti per Scrivere in Sicurezza
Durante la fase di apprendimento, le seguenti politiche riducono gli errori:
- Inizializza le variabili quando le dichiari
- Scrivi i tipi esplicitamente il più possibile
- Usa nomi significativi
- Se non sei sicuro, prova ad aggiungere
final
Anche solo questo ti avvicina a un codice Java leggibile e sicuro.
8.7 Prossimi Argomenti da Imparare per una Comprensione più Profonda
Dopo aver compreso le variabili, è consigliato passare a:
- Condizionali (
if/switch) - Cicli (
for/while) - Array e collezioni (List / Map)
- Metodi e parametri
- Fondamenti di programmazione orientata agli oggetti
Le variabili sono il fondamento di tutto il codice Java.
Comprendendole a fondo, il tuo apprendimento futuro diventa notevolmente più fluido.

