Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java为什么局部范围变量不能隐藏,而全局范围变量可以隐藏?_Java_Scope - Fatal编程技术网

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 {

在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,我们需要显式添加它以指定实例变量。

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


如果您希望打印局部变量的值,则可以使用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中定义,