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 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 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 finalvariabile, il tuo programma semplicemente non verrà compilato."

"E se dichiari una finalvariabile ma non le assegni un valore?"

"Non ha senso farlo, quindi non è consentito nemmeno in Java. Una finalvariabile 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 finalper qualcosa di più della semplice dichiarazione di costanti. finalpuò anche essere applicata a metodi e persino classi. I metodi dichiarati come finalnon possono essere sovrascritti e una classe dichiarato finalnon 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, finalpossono essere messi prima di variabili, classi e metodi, e questa parola chiave li rende in qualche modo immutabili?"

"Sì. Inoltre, il finalmodificatore 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: finalprima 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:

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.

"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 publice 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
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, sum
count, sum
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."

"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 thisnome :

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.sum
this.count, this.sum
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 counte sumsono disponibili ovunque con o senza la thisparola chiave. Nelle righe in cui la sumvariabile locale oscura la sumvariabile di istanza, sumè possibile accedere alla variabile di istanza solo utilizzando la thisparola 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
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

"Attenzione: puoi accedere alle variabili statiche counte sumovunque con o senza utilizzare il nome della classe Solutioncome prefisso. In quelle righe in cui la sumvariabile locale oscura la sumvariabile di istanza, l'accesso alla sumvariabile di classe è possibile solo quando si utilizza Solutioncome prefisso.

Variabili all'interno di un forciclo

"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 forciclo ." In genere, un forciclo ha una countervariabile 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 forciclo è visibile solo nel corpo del ciclo e nell'intestazione del forciclo ."

"Ben fatto, Amigo. Tuttavia, dai un'occhiata a un esempio per rafforzare questo materiale:

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