在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的设计方式吗?还有其他例外情况吗?
答案 0 :(得分:0)
当局部变量和全局变量具有相同名称时,局部变量优先于全局变量。
如果你想要打印局部变量的值,那么可以使用this运算符来完成它。这不会被编译器添加,我们需要显式地添加它来指定实例变量。
答案 1 :(得分:0)
首先,这就是Java的设计方式,而且你可以随意命名任何新的变量,但很容易找到一个不会碰撞的名字。隐藏局部变量没有任何好处 - 它只会剥夺访问它们的能力。它们仍然存在并占据记忆。对于使用局部变量或方法参数隐藏字段名称,有一些有用的案例(见下文)。
您编写示例的方式,两种情况都会给读者带来疑惑:“x
或y
是什么意思?”方法中的局部变量x
与字段无关。但你给这两个不同的东西同名。所以我建议在这里避免碰撞名称。
但是有两种常见情况,开发人员通常会引入一个与实例字段同名的局部变量(或者在本例中为参数):
public Hello(int x) { this.x = x; }
这是与参数public void setX(int x) { this.x = x; }
以及后面的x
字段中首次保存的值相同,因此它们非常相关。在同一行上你会看到两个表达式,另外提示它在技术上是两个不同的变量/字段。
特别是对于构造函数,我总是投票支持该命名方案,因为它只是通过查看构造函数声明x
来表明它是Hello(int x)
字段获取构造函数的参数。
总结:有一个有用且被广泛接受的应用程序允许第一个“隐藏”模式,但我从未见过要求第二个模式的情况。