在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就是这样设计的,因为您可以随意命名任何新变量,所以很容易找到一个不冲突的名称。隐藏局部变量没有任何好处——它只会剥夺访问它们的能力。它们仍然存在并占据着记忆。对于用局部变量或方法参数隐藏字段名,有一些有用的情况(见下文)。
您编写示例的方式,这两种情况都会让读者感到困惑:"x
或y
是什么意思?"方法中的局部变量x
与字段无关。但你给这两种不同的东西起了相同的名字。因此,我建议在这里避免名称冲突。
但是有两种常见的情况,开发人员通常会引入与实例字段同名的局部变量(或者在本例中是参数):
- 像
public Hello(int x) { this.x = x; }
这样的构造函数 - 像
public void setX(int x) { this.x = x; }
这样的设置程序
这里的值与最初保存在参数x
中,后来保存在字段x
中的值相同,因此它们非常相关。在同一行,你可以看到这两个表达式,这又暗示了它在技术上是两个不同的变量/字段。
特别是对于构造函数,我总是投票支持该命名方案,因为从构造函数声明Hello(int x)
中可以清楚地看出,它是x
字段,用于获取构造函数的参数。
总结:允许第一种"隐藏"模式是一种有用且被广泛接受的应用程序,但我从未见过需要第二种模式的情况。