Java为什么不能隐藏局部范围变量,但全局范围变量可以隐藏?

时间:2017-11-19 09:59:23

标签: java scope

在Java中,为什么不能隐藏局部范围变量,但全局范围变量可以隐藏? 例如:

public class Hello {
  static int x = 10; 
  public static void foo() {
    int x = 20; // Hides the global variable with the value of "20" within the  
     method foo. 
     }
  }

但这不可能:

public class Hello {
    public static void foo() {
      int x = 20; 
      int y = 1;
      if(x >= 20) {
       int y = 10; // Cannot hide this
     }
} 

据我所知,我无法隐藏在本地范围更广的范围内具有局部范围的变量,但问题是为什么会发生这种情况?是因为Java的设计方式吗?还有其他例外情况吗?

2 个答案:

答案 0 :(得分:0)

当局部变量和全局变量具有相同名称时,局部变量优先于全局变量。

如果你想要打印局部变量的值,那么可以使用this运算符来完成它。这不会被编译器添加,我们需要显式地添加它来指定实例变量。

答案 1 :(得分:0)

首先,这就是Java的设计方式,而且你可以随意命名任何新的变量,但很容易找到一个不会碰撞的名字。隐藏局部变量没有任何好处 - 它只会剥夺访问它们的能力。它们仍然存在并占据记忆。对于使用局部变量或方法参数隐藏字段名称,有一些有用的案例(见下文)。

您编写示例的方式,两种情况都会给读者带来疑惑:“xy是什么意思?”方法中的局部变量x与字段无关。但你给这两个不同的东西同名。所以我建议在这里避免碰撞名称。

但是有两种常见情况,开发人员通常会引入一个与实例字段同名的局部变量(或者在本例中为参数):

  • public Hello(int x) { this.x = x; }
  • 等构造函数
  • 像[{1}}
  • 这样的设置者

这是与参数public void setX(int x) { this.x = x; }以及后面的x字段中首次保存的值相同,因此它们非常相关。在同一行上你会看到两个表达式,另外提示它在技术上是两个不同的变量/字段。

特别是对于构造函数,我总是投票支持该命名方案,因为它只是通过查看构造函数声明x来表明它是Hello(int x)字段获取构造函数的参数。

总结:有一个有用且被广泛接受的应用程序允许第一个“隐藏”模式,但我从未见过要求第二个模式的情况。