Java中的嵌套作用域

时间:2018-10-17 19:39:20

标签: java scope nested

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

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的互联网上 在“同名变量在内部范围内发生”下,我们发现我们的错误是合法的。在过去的9年中,这种变化发生了吗?

2 个答案:

答案 0 :(得分:2)

在嵌套范围内创建同名的新变量称为变量影子,而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说“这很容易混淆,请选择更好的名称”,并且不允许在单个函数中隐藏局部变量。

答案 1 :(得分:1)

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

这是Java与C和C ++的工作原理不同的一种情况,C和C ++允许同一函数中的变量相互屏蔽。