Java为什么局部作用域变量不能隐藏,而全局作用域变量可以隐藏



在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的设计方式吗?还有其他类似的例外吗?

当局部变量和全局变量同名时,局部变量将优先于全局变量。

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

首先,Java就是这样设计的,因为您可以随意命名任何新变量,所以很容易找到一个不冲突的名称。隐藏局部变量没有任何好处——它只会剥夺访问它们的能力。它们仍然存在并占据着记忆。对于用局部变量或方法参数隐藏字段名,有一些有用的情况(见下文)。

您编写示例的方式,这两种情况都会让读者感到困惑:"xy是什么意思?"方法中的局部变量x与字段无关。但你给这两种不同的东西起了相同的名字。因此,我建议在这里避免名称冲突。

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

  • public Hello(int x) { this.x = x; }这样的构造函数
  • public void setX(int x) { this.x = x; }这样的设置程序

这里的值与最初保存在参数x中,后来保存在字段x中的值相同,因此它们非常相关。在同一行,你可以看到这两个表达式,这又暗示了它在技术上是两个不同的变量/字段。

特别是对于构造函数,我总是投票支持该命名方案,因为从构造函数声明Hello(int x)中可以清楚地看出,它是x字段,用于获取构造函数的参数。

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

最新更新