【问题标题】:Java Why local scope variables cannot be hidden but the global ones can?Java为什么不能隐藏局部范围变量而全局变量可以?
【发布时间】:2017-11-19 09:59:23
【问题描述】:

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

【问题讨论】:

标签: java scope


【解决方案1】:

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

如果要打印局部变量的值,可以使用this操作符来完成。'this'不会被编译器添加,我们需要显式添加它来指定实例变量。

【讨论】:

    【解决方案2】:

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

    您编写示例的方式,这两种情况都会使读者感到困惑:“xy 是什么意思?”您方法中的局部变量x 与字段无关。但是你给这两个不同的东西取了同一个名字。所以我建议避免这里的名字冲突。

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

    • public Hello(int x) { this.x = x; } 等构造函数
    • public void setX(int x) { this.x = x; }这样的二传手

    这里的值与参数x 和后来的字段x 中的值相同,因此它们非常相关。在同一行上,您会看到两个表达式,这再次暗示它在技术上是两个不同的变量/字段。

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2017-02-17
      • 2014-03-02
      • 2011-06-05
      • 2012-11-05
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多