1. Costanti

Molti altri linguaggi di programmazione hanno costanti , cioè variabili i cui valori non possono essere modificati . Di solito vengono utilizzati per qualche tipo di cosa fondamentale come il numero Pio 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 è necessario farlo.

Quindi, come si dichiara una variabile immutabile (costante) in Java? C'è una parola chiave speciale per questo: 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;

Se provi ad assegnare un valore diverso a una finalvariabile, il tuo programma semplicemente non verrà compilato.

Una finalvariabile deve essere inizializzata (le deve essere assegnato un valore) quando viene dichiarata. C'è un'eccezione a questa regola: puoi spostare l'inizializzazione di una variabile di classe statica in un costruttore. Ma lo scoprirai nel Livello 10 .

Per ridurre il numero di parole chiave, gli sviluppatori Java usano la parola finalper qualcosa di più della semplice dichiarazione di costanti. finalpuò anche essere applicato a metodi e persino a classi. I metodi dichiarati come finalnon possono essere sovrascritti e una classe dichiarata come finalnon può essere ereditata.

Il finalmodificatore può essere aggiunto prima di qualsiasi variabile: variabili locali, parametri di metodo, campi di classe e variabili di classe statiche.

Si noti che finalprima di un nome di variabile è solo una protezione contro eventuali modifiche a quella variabile . Se una variabile memorizza un riferimento a un oggetto, l'oggetto può ancora essere modificato.

Esempio:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Creiamo un array.

Questo non è consentito: la datavariabile è dichiarata come final.

Ma puoi farlo.
E anche questo.

Costanti globali

Se decidi di dichiarare costanti globali nel tuo programma, devi creare variabili di classe statiche e renderle publice final. Esiste uno stile speciale per i nomi di tali variabili: sono scritte tutte in maiuscolo, con un carattere di sottolineatura usato per separare le parole.

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;
}


2. Ombreggiatura variabile

Come abbiamo detto prima, non è possibile creare più variabili locali con lo stesso nome nello stesso metodo. In diversi metodi, puoi.

Ma ecco cosa probabilmente non sai: le variabili di istanza e le variabili di metodo locale possono avere lo stesso nome.

Esempio:

Codice Visibilità variabile
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

Nel addmetodo, abbiamo dichiarato una variabile locale denominata sum. Fino alla fine del metodo, oscura (o maschera ) la sumvariabile di istanza.

Ok, dici, c'era da aspettarselo in un certo senso. Ma 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 thisparola chiave prima del suo nome:

this.name

Ecco un esempio in cui il conflitto di nomi è stato risolto correttamente:

Codice Visibilità variabile
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

Le variabili count e sum sono disponibili ovunque con o senza la thisparola chiave. Nelle righe in cui la sum variabile locale oscura la sumvariabile di istanza, sum è possibile accedere alla variabile di istanza solo utilizzando la thisparola chiave.

Se una variabile di classe statica anziché una variabile di istanza è ombreggiata, è necessario accedervi tramite il nome della classe anziché la thisparola chiave:

ClassName.name

Esempio:

Codice Visibilità variabile
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

Puoi accedere alle variabili statiche count e sum ovunque con o senza utilizzare il nome della classe Solutioncome prefisso. In quelle righe in cui la sumvariabile locale ombreggia la sumvariabile di istanza, l'accesso alla sum variabile di istanza è possibile solo quando si usa Solutioncome prefisso.



3. Variabili all'interno di un forciclo

E un altro fatto piccolo ma interessante.

C'è anche un punto in cui una variabile viene dichiarata in un modo speciale — all'interno di un forloop .

Ricorderete che un forciclo tipicamente ha una variabile contatore tra parentesi. E quale sarà la visibilità di questa variabile? Dopo tutto, non è nel corpo del ciclo. È l'intero metodo? O no?

La risposta corretta è: una variabile dichiarata nell'intestazione di un forciclo è visibile solo nel corpo del ciclo e nell'intestazione del forciclo .

Esempio:

Codice Visibilità variabile
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

Quindi, puoi sempre scrivere cicli uno dopo l'altro nel tuo codice e utilizzare variabili contatore con lo stesso nome, il che non creerà alcun problema.

Esempio:

Codice Visibilità variabile
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a