Variabili locali e globali

Ad ogni variabile è associato un concetto di visibilità o scope, ossia l'ambito del codice in cui la variabile è visibile ed utilizzabile.
In generale, una variabile dichiarata all'interno di una funzione ha una visibilità locale alla funzione.
Essa, infatti, è utilizzabile dalla riga successiva alla sua dichiarazione, fino alla chiusura del blocco di codice (parentesi graffa chiusa) in cui è dichiarata.
Le variabili possono essere anche locali ad un blocco interno ad una funzione, ad esempio un blocco di selezione (if) o un blocco di iterazione (while/do/for).
Vediamo nel dettaglio alcuni esempi attraverso i frammenti di codice Java che seguono.

Nel frammento di codice seguente vediamo alcuni esempi di variabili locali ad una funzione o ad un blocco.

public int miaFunzione(int par1, int par2) {
    
    int i = 0;
    // la variabile i è locale alla funzione
    // quindi è visibile da questo punto 
    // fino alla fine di questa funzione

    while (i < 1000) {
        int c = 0;  
        // la variabile c è locale al ciclo while
        // quindi è visibile da questo punto 
        // fino alla fine di questo ciclo while

        // la variabile i è visibile qui 

        for (int j = 0; j < i; j++) {

            // la variabile j è locale al ciclo for
            // quindi è visibile qui

            // le variabili i e c sono visibili qui
        } // fine visibilità della variabile j

        // la variabile j non è visibile qui

    } // fine visibilità della variabile c

    // la variabile i è visibile qui
    // la variabile c non è visibile qui
    
} // fine visibilità della variabile i

Una variabile globale, invece, è visibile in qualunque funzione all'interno della classe in cui è definita.
Vediamo come si dichiara una variabile globale.
package miopackage;
                    
public class miaClasse {

    // esempi di dichiarazione di variabili globali
    // notare l'uso della parola chiave static
    static int var1;
    static float var2;
    static boolean var3;

    public static void main(String[] args) {
        // le variabili globali sono visibili qui
    }

    public static int miaFunzione1(int par1, float par2) {
        // le variabili globali sono visibili qui
    }

    public static boolean miaFunzione2(double par1, char par2) {
        // le variabili globali sono visibili qui

        if (var1 < 1000) {
            int var2 = 5;
            // la definizione della variabile locale var2
            // nasconde la variabile globale all'interno 
            // di questo blocco if, che costituisce 
            // l'ambito di visibilità della variabile
            // locale var2
        
        } // fine visibilità della variabile locale var2

        // da questo punto in poi ogni utilizzo della 
        // variabile var2 farebbe riferimento alla
        // variabile globale 
    }
}

Nota:
I parametri formali sono visibili all'interno di tutta la funzione, per cui sono assimilabili alle variabili locali della funzione.

All'interno di un blocco/funzione non è possibile dichiarare due volte una variabile con lo stesso nome.
È possibile tuttavia dichiarare una variabile locale con lo stesso nome di una variabile globale.
La variabile locale "nasconde" quella globale fino al punto in cui essa è visibile.