【问题标题】:Java nested scopes and variables' name hidingJava 嵌套范围和变量的名称隐藏
【发布时间】:2015-09-28 09:21:57
【问题描述】:

我正在学习 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 的正常行为还是我遗漏了什么?

【问题讨论】:

  • 这是正常现象。
  • 其实你的 C++ 范式是错误的,你必须让你的头脑适应 Java 的思维方式
  • 对于未来的 Google 员工:另请参阅 Block scope variables

标签: java c++ name-hiding


【解决方案1】:

这与“第一个嵌套范围”无关 - 这是 Java 允许局部变量隐藏字段,但不允许它隐藏 另一个 局部变量的问题。据推测,Java 的设计者认为这种隐藏不利于可读性。

请注意,您在实例初始化程序中的局部变量示例确实不会创建错误 - 此代码有效:

class C {
  int a = 11;

  {
    // Local variable hiding a field. No problem.
    double a = 0.2;
  }
}

【讨论】:

  • 很高兴得到您的答复...:)
  • 正确答案!!有人在阅读第一章之前尝试使用一种语言的经典案例:-)
  • 是的,感谢您对嵌套的澄清。我注意到,即使我在本地范围(初始化程序块、方法或循环)中声明了一个新名称,也不会隐藏我无法隐藏的字段这个名字,编译器抱怨
  • @Geek 答案确实是正确的,你只是猜错了,因为我已经学习 C++ 和 Java 6 个月了,但我想你在手册的第一页上学到了一切,好给你!
  • @Luca:是的,没错——你不能用另一个局部变量隐藏一个局部变量。
【解决方案2】:

我不是 C++ 人,但从 C++ 方面来看确实很奇怪,如果我是设计师,我会完全消除这种行为。这确实会导致错误和难以阅读代码。

为了在 Java 中过上平静的生活,这种行为被完全删除。如果您像现在看到的那样尝试这样做,编译器会向您显示错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2020-01-07
    • 2016-06-25
    相关资源
    最近更新 更多