为了账号安全,请及时绑定邮箱和手机立即绑定

java中的嵌套作用域

java中的嵌套作用域

万千封印 2021-11-24 15:11:05
当我们尝试这段代码时,它不起作用。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 年里有变化吗?
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

在嵌套作用域中创建同名的新变量称为变量隐藏,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 说“这令人困惑,请选择更好的名称”,并且不允许在单个函数中隐藏局部变量。


查看完整回答
反对 回复 2021-11-24
?
慕后森

TA贡献1802条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信