【问题标题】:nested scopes in javajava中的嵌套范围
【发布时间】:2018-10-17 19:39:20
【问题描述】:

当我们尝试这段代码时,它不起作用。

public class f {

public static void main(String[] args) {
    { // aussen 
            int a = 1;
            int b = 2; 
             { // innen
                    System.out.println(a);
                    // gibt 1 aus
                    int b = 3;     
                    System.out.println(b); // gibt 3 aus
            }       

    }
}
}   

但是我们的教授。表示在内部作用域中可以再次声明变量,并且该内部声明用于变量b的内部作用域。但是在互联网上http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/08/scope.html 在“具有相同名称 r 的变量发生在内部范围内”下,我们发现我们的错误是合法的。这在过去 9 年中是否发生了变化?

【问题讨论】:

  • 另外,我对你在这里实际问的问题感到困惑 - 你能edit 澄清一下吗?
  • 据我所知,从 Java 1.0 版本开始,这点并没有改变,事实上,Java 对改变非常保守。
  • 最后一个问题的答案是“因为语言开发者如此决定”。请注意,此限制不适用于本地阴影类变量。老实说,你只需要转回你的导师并要求澄清。

标签: java scope nested


【解决方案1】:

在嵌套范围内创建同名的新变量称为变量遮蔽,Java 在某些情况下确实允许这样做。这是一个示例,其中x 在嵌套范围内被声明了四次:

class MyTest {
  String x = "class member";

  void foo() {
    System.out.println("x = " + x);
    String x = "local variable";
    System.out.println("x = " + x);

    new Runnable() {
      String x = "inner class member";

      public void run() {
        System.out.println("x = " + x);
        String x = "inner local variable";
        System.out.println("x = " + x);
      }
    }.run();
  }
  public static void main(String[] list) {
    new test().foo();
  }
}

如您所见,它已经有些混乱了。当您不小心使用了错误的变量时,这可能会导致严重的错误,即使代码在不同的范围内完全正常并且可以在没有警告的情况下编译。

例如,这段代码应该做什么?

for(int i=0; i<10; i++) {
  for(int i=0; i<10; i++) {
    System.out.println(i); 
  }
}
  • C++ 会说“这些应该是两个独立的变量”
  • JavaScript 会说“这些都应该是同一个变量”
  • Java 说“这很混乱,请选择更好的名称”,并且不允许在单个函数中隐藏局部变量。

【讨论】:

    【解决方案2】:

    这没有改变。 Java 就是这样设计的。 局部变量不能被同一函数中定义的其他变量遮蔽。 原因是一致性,所有外部变量对内部范围也是可见的。

    这是一种情况,Java 的工作方式与 C 和 C++ 不同,后者允许同一函数中的变量相互影响。

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2010-12-18
      • 2011-01-01
      • 2018-05-23
      • 1970-01-01
      • 2017-11-30
      • 2021-03-13
      • 2023-04-10
      相关资源
      最近更新 更多