为什么在存在局部变量时调用全局变量?

时间:2013-12-08 07:24:58

标签: java methods global-variables local-variables

提供由下面显示的Java代码生成的EXACT输出。

int x=1, y=-5, z=4; // global variables
int vals[] = {-6,2,-4,-8 ,-2,-3}; // global variables

public void setValues()
{
  char y = 'R';
  z=10;
  System.out.println("l1: "+x+" "+y+" "+z);

  y=call1(x,y,z);
  System.out.println("l2: "+x+" "+y+" "+z);

  x=call2(x,vals);
  System.out.println("l3: "+x+" "+y+" "+z);

  for (int i=0; i<3; i++)
      System.out.println("l"+(i+4)+": "+vals[i*2]);
 }

public char call1(int a, char b, int c)
{
    if (a >= c) return b;
    else
    {  
     c=15;
     z=25;
     return 'M'; // note the single quotes
    }
}

public int call2(int x, int [] anArray)
{
  int y = 0;
  for (int i=anArray.length-1; i>=0; i--)
  {
      if (anArray[i] > x)
      {
        anArray[i] = x + 5;y++;}
      }
      x = 100;
  return y; 
}

我提供了第一行"l1: 1 R 10"的输出。我为第二行提供了"l2: 1 M 10",但被告知它是"l2: 1 M 25"。我被告知局部变量覆盖全局(不是使用相同名称的最佳实践)。然而,z在setValues中设置为10(本地)并在第一行中引用。我知道全局z从call1设置为25,但是当执行第二次打印时,我认为它仍然会引用setValues'(local)z = 10,而不是全局z = 25。我看错了吗?

1 个答案:

答案 0 :(得分:3)

  

[...] z在setValues [...] setValues'(本地)中设置为10(本地)z = 10 [...]

setValues没有本地变量z;每当它引用变量z时,它指的是字段(“全局变量”)。

要使它有一个局部变量z,这一行:

  z=10;

将改为:

  int z=10;