Ejemplo 3 - Demostración de las reglas de alcance de las variables

Objetivo

Comprender las reglas de alcance de variables

Enunciado

Observe el siguiente código y observe la diferencia entre las diferentes variables llamadas x.

 public class ClaseX {
   private int x; // atributo o variable de instancia
   public void setX(int x){ // El parámetro se llama x
     System.out.println("Se recibió parametro x con valor " + x);     
     this.x = x; // Asigna valor del parámetro a variable de instancia x
     System.out.println("Atributo x antes de salir el método vale: " + x);
   }
   public void setX2(int x){ // El parámetro se llama x
      System.out.println("Se recibió parametro x con valor " + x);
      x = x; // Note que este solo modifica el parámetro
      System.out.println("Atributo x antes de salir el método vale: " + this.x);     
      System.out.println("Parámetro que se recibió, antes de salir vale: " + x);     
   }
   public void sumaUno(int x){ // El parámetro se llama x
      System.out.println("Se recibió parametro x con valor " + x);
      System.out.println("Se suma uno al parámetro x ");      
      // Se le suma uno al atributo
      x++;
      System.out.println("Atributo x antes de salir el método vale: " + this.x);     
      System.out.println("Parámetro que se recibió, antes de salir vale: " + x);     
   }   
   public int getX(){
     return x;
   }
   public static void main(String argv[]){
      ClaseX instancia = new ClaseX();
      int x = 10; // Se declara variable local al método main
      instancia.setX(x*2);
      System.out.println("Atributo x almacenado en variable de instancia vale "+instancia.getX());
      instancia.setX2(10);
      System.out.println("Atributo x almacenado en variable de instancia vale "+instancia.getX());
      System.out.println("Variable local x del main vale "+x);
      System.out.println("Se pasa variable local x del main como parámetro ");
      instancia.sumaUno(x);
      System.out.println("Variable local x del main todavía vale "+x);      
      System.exit(0);                   
   }
}

Solución

En el ejemplo se nota que existen tres versiones de variables con el mismo nombre "x".

Algunas x son parámetros en los diferentes métodos.

Otra "x" es local al método principal main.

Y la otra es un atributo privado de la clase en cuestión.

Note que no se genera ningún conflicto entre ellas.

Lo importante es distinguir el alcance de cada una. Note la salida que produce el programa:

Se recibió parametro x con valor 20
Atributo x antes de salir el método vale: 20
Atributo x almacenado en variable de instancia vale 20
Se recibió parametro x con valor 10
Atributo x antes de salir el método vale: 20
Parámetro que se recibió, antes de salir vale: 10
Atributo x almacenado en variable de instancia vale 20
Variable local x del main vale 10
Se pasa variable local x del main como parámetro 
Se recibió parametro x con valor 10
Se suma uno al parámetro x 
Atributo x antes de salir el método vale: 20
Parámetro que se recibió, antes de salir vale: 11
Variable local x del main todavía vale 10

Es importante notas que:

Los cambios a variables locales y parámetros solo persisten dentro del método en que ocurren.

Si en un método de clase hay una variable local y un atributo con el mismo nombre entonces la variable local tiene prioridad sobre el atributo de clase o variable de instancia.

Para referirse a la variable de instancias en el caso de haber conflicto con una variable local hay que utilizar la referencia this.

Código Fuente

El código de este ejemplo se encuentra en la clase siguiente.

ClaseX.java