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