Visibilità delle variabili globali

Nella pagine precedente si è detto che le variabili globali si possono usare in tutte le procedure e nel programma principale. In effetti esiste una eccezione molto importante. Non tenerne conto può portare a programmi che compilano senza errori ma non funzionano nel modo dovuto. La regola è:

una variabile globale non è utilizzabile in una procedura se nella procedura viene definita un'altra variabile con lo stesso nome.
Per esempio, se definiamo una variabile globale che si chiama x, e poi in una procedura c'è una variabile locale x, allora la procedura ``vede'' solo la sua variabile locale. Consideriamo questo programma:

class Prova {
  static int x;

  static void test() {
    int x;

    x=10;
  }

  public static void main(String[] args) {
    x=5;
    test();
    System.out.println(x);
  }
}
La situazione che si viene a creare nella memoria è la seguente:

x
    
      
 
test
x
    
      
 
 
main
    
      
 

La assegnazione x=10 mette il valore 10 nella variabile x locale della procedura, e non in quella globale. Come risultato, la operazione di stampa che si trova nel programma principale stampa 5 e non 10. Infatti, la prima istruzione del programma mette 5 nella variabile globale; viene chiamata la procedura, che mette 10 nella sua variabile x locale; si ritorna dalla procedura e si stampa il valore della variabile globale, che contiene ancora 5.

La stessa cosa succede se la variabile locale che ha lo stesso nome è uno dei parametri:

class Prova {
  static int x;

  static void test(int x) {
    x=10;
  }

  public static void main(String[] args) {
    x=5;
    test(24);
    System.out.println(x);
  }
}
In questo caso, la variabile x della procedura test è un parametro, ma è sempre una variabile della procedura (l'unica differenza fra i parametri e le variabili dichiarate dentro la procedura è che il suo valore iniziale è quello inviato dal programma). Quindi, la assegnazione x=10 mette il valore 10 nella variabile x locale di test e non nella variabile globale x. Anche se hanno lo stesso nome, queste due variabili sono distinte.

Il risultato della esecuzione di questo programma è identico a quello del precedente: la prima istruzione x=5 mette 5 nella variabile globale, si chiama la procedura che mette 10 nella sua variabile locale, si ritorna e si stampa il contenuto della variabile globale, che contiene ancora il valore 5.

Il motivo per cui il programma principale vede la variabile globale, mentre la procedura vede quella locale, è che nel programma principale non ci sono variabili locali con lo stesso nome x, mentre nella procedura c'è una variabile locale con lo stesso nome, per cui la procedure vede la sua variabile e non quella globale.