Costanti
"Amigo, lo sapevi che in Java non tutte le variabili possono essere modificate?"
"Come va, Kim? In effetti, la stessa parola 'variabile' parla di cambiamento."
"Non c'è dubbio su questo. Come molti altri linguaggi di programmazione, Java ha costanti , cioè variabili i cui valori non possono essere modificati . E la stessa parola 'costante' parla di costanza."
"E a cosa servono?"
"Di solito, sono usati per qualche tipo di cosa fondamentale come il numero Pi
o il numero di giorni nei mesi dell'anno. Detto questo, in linea di principio, un programmatore può rendere qualsiasi variabile una costante, se decide che facendo quindi è necessario."
"Vuoi dire come un nome, il colore di un'auto o il nome di un giorno della settimana?"
"Hai avuto l'idea giusta. Tutto ciò che non dovrebbe essere cambiato."
"E che aspetto hanno queste costanti in Java?"
"Java ha una parola chiave speciale per loro: final
. La creazione di una variabile immutabile ha lo stesso aspetto della creazione di una variabile ordinaria. L'unica differenza è che prima del tipo di variabile è necessario scrivere la parola final
, in questo modo:
final Type name = value;
"Cosa succede se crei una costante e poi provi ad assegnarle un valore diverso?"
"Questa è la domanda giusta da porre! E la risposta giusta è questa: se provi ad assegnare un valore diverso a una final
variabile, il tuo programma semplicemente non verrà compilato."
"E se dichiari una final
variabile ma non le assegni un valore?"
"Non ha senso farlo, quindi non è consentito nemmeno in Java. Una final
variabile deve essere inizializzata quando viene dichiarata, cioè devi assegnarle un valore. C'è un'eccezione a questa regola: puoi spostare l'inizializzazione di una variabile di classe statica in un costruttore, ma lo scoprirai più avanti.
"Detto questo, non tutto ciò che è final
è una costante. Per ridurre il numero di parole chiave, gli sviluppatori Java usano la parola final
per qualcosa di più della semplice dichiarazione di costanti. final
può anche essere applicata a metodi e persino classi. I metodi dichiarati come final
non possono essere sovrascritti e una classe dichiarato final
non ereditabile”.
"Uh... Sostituito? Ereditato? Che lingua parli ora?"
"Il linguaggio della programmazione orientata agli oggetti. Ci arriverai molto presto. Fino ad allora, goditi la bella terminologia."
"Okay. Quindi, final
possono essere messi prima di variabili, classi e metodi, e questa parola chiave li rende in qualche modo immutabili?"
"Sì. Inoltre, il final
modificatore può essere aggiunto prima di qualsiasi variabile: variabili locali, parametri di metodo, campi di classe e variabili di classe statiche.
"Ecco la cosa importante da ricordare: final
prima che il nome di una variabile sia solo una protezione contro qualsiasi modifica a quella variabile . Se una variabile memorizza un riferimento a un oggetto, allora l'oggetto può ancora essere modificato."
"Non capisco bene."
"Lo capirai molto presto. Ecco un esempio:
|
Creiamo un array. Questo non è consentito: la data variabile è dichiarata come final . Ma puoi farlo. E anche questo. |
"Capito. È complicato."
Costanti globali
"Cosa pensi che siano le costanti globali?"
"Immagino che le costanti globali siano probabilmente come variabili globali, solo costanti?"
"Esattamente. Se hai bisogno di dichiarare costanti globali nel tuo programma, crea variabili di classe statiche e rendile public
e final
. C'è uno stile speciale per i nomi di tali variabili: sono scritte tutte in maiuscolo, con un carattere di sottolineatura usato per parole separate.
Esempi:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
Ombreggiatura variabile
"Come ho detto prima, non puoi creare più variabili locali con gli stessi nomi in un singolo metodo. In metodi diversi, puoi farlo."
"So che!"
"Ma quello che probabilmente non sai è che le variabili in una classe e le variabili locali in un metodo potrebbero avere lo stesso nome.
Esempio:
Codice | Visibilità variabile |
---|---|
|
|
"Nel add
metodo, abbiamo dichiarato una variabile locale denominata sum
. Fino alla fine del metodo, oscura (o maschera ) la sum
variabile di istanza."
"Hmm... direi che in un certo senso questo è il comportamento previsto."
"Ma questa non è la fine della storia. Si scopre che se una variabile di istanza è ombreggiata da una variabile locale, c'è ancora un modo per fare riferimento alla variabile di istanza all'interno del metodo. Lo facciamo scrivendo la parola chiave prima del suo this
nome :
this.name
"Ecco un esempio in cui il conflitto di nomi è stato risolto correttamente:
Codice | Visibilità variabile |
---|---|
|
|
Le variabili count
e sum
sono disponibili ovunque con o senza la this
parola chiave. Nelle righe in cui la sum
variabile locale oscura la sum
variabile di istanza, sum
è possibile accedere alla variabile di istanza solo utilizzando la this
parola chiave.
"Ovviamente, dovrò esercitarmi in questo."
"Te la caverai."
"Cosa succede se una variabile di classe statica è ombreggiata anziché solo una variabile di istanza (non statica)? Non è possibile accedervi tramite this
?"
"Giusto. La parola chiave this non funzionerà. Devi fare riferimento ad essa tramite il nome della classe:
ClassName.name
Esempio:
Codice | Visibilità variabile |
---|---|
|
|
"Attenzione: puoi accedere alle variabili statiche count
e sum
ovunque con o senza utilizzare il nome della classe Solution
come prefisso. In quelle righe in cui la sum
variabile locale oscura la sum
variabile di istanza, l'accesso alla sum
variabile di classe è possibile solo quando si utilizza Solution
come prefisso.
Variabili all'interno di un for
ciclo
"E un altro fatto piccolo ma interessante. C'è anche un posto in cui una variabile è dichiarata in un modo speciale — sto parlando all'interno di un for
ciclo ." In genere, un for
ciclo ha una counter
variabile tra parentesi. E quale sarà la visibilità di questa variabile? Dopo tutto, non è nel corpo del ciclo. È l'intero metodo? O no?"
"Ne ho già sentito parlare. A quanto ho capito, una variabile dichiarata nell'intestazione di un for
ciclo è visibile solo nel corpo del ciclo e nell'intestazione del for
ciclo ."
"Ben fatto, Amigo. Tuttavia, dai un'occhiata a un esempio per rafforzare questo materiale:
Codice | Visibilità variabile |
---|---|
|
|
"Quindi stai dicendo che nel mio codice potrei scrivere diversi cicli uno dopo l'altro con una variabile contatore con lo stesso nome, e non ci saranno problemi?"
"Non ci sarebbero problemi. Ecco, guarda:
Codice | Visibilità variabile |
---|---|
|
|