Comprender las reglas de alcance de variables
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); } } |
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.
El código de este ejemplo se encuentra en la clase siguiente.