Java 嵌套作用域和变量名称隐藏

Java nested scopes and variables' name hiding

本文关键字:隐藏 变量名 嵌套 作用域 Java      更新时间:2023-10-16

我正在学习在Java中查找名称,并且来自c++,我发现有趣的是,即使Java允许我嵌套许多代码块,我也只允许在第一个嵌套作用域中隐藏名称:

// name hiding-shadowing: local variables hide names in class scope
class C {
  int a=11;
  {
    double a=0.2; 
  //{
  //  int a;             // error: a is already declared in instance initializer
  //}
  }
  void hide(short a) {  // local variable a,hides instance variable
    byte s;
    for (int s=0;;);    // error: s in block scope redeclares a
    {
      long a=100L;      // error: a is already declared in (method) local scope
      String s;         //error: s is alredy defined in (method) local scope 
    }                   
  }
}

这是奇怪的从c++的角度来看,因为在那里我可以嵌套多少范围,我想,我可以隐藏变量,因为我喜欢。这是Java的正常行为还是我错过了什么?

这不是关于"第一个嵌套作用域"的问题—这是Java允许局部变量隐藏字段,但不允许它隐藏另一个局部变量的问题。大概Java的设计者认为这样的隐藏不利于可读性。

注意,在实例初始化器中使用局部变量的例子不会产生错误——这段代码是有效的:

class C {
  int a = 11;
  {
    // Local variable hiding a field. No problem.
    double a = 0.2;
  }
}

我不是一个c++爱好者,但从c++的角度来看,这真的很奇怪,如果我是设计师,我会完全删除这种行为。这确实会导致错误和难以阅读的代码。

要在Java过上平静的生活,这种行为被完全消除了。如果你尝试这样做,编译器会显示一个错误,就像你现在看到的那样。