java中的嵌套作用域

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


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 年里有变化吗?


万千封印
浏览 216回答 2
2回答

慕少森

在嵌套作用域中创建同名的新变量称为变量隐藏,Java 在多种情况下确实允许这样做。这x是在嵌套范围内声明四次的示例:class MyTest {&nbsp; String x = "class member";&nbsp; void foo() {&nbsp; &nbsp; System.out.println("x = " + x);&nbsp; &nbsp; String x = "local variable";&nbsp; &nbsp; System.out.println("x = " + x);&nbsp; &nbsp; new Runnable() {&nbsp; &nbsp; &nbsp; String x = "inner class member";&nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("x = " + x);&nbsp; &nbsp; &nbsp; &nbsp; String x = "inner local variable";&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("x = " + x);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }.run();&nbsp; }&nbsp; public static void main(String[] list) {&nbsp; &nbsp; new test().foo();&nbsp; }}如您所见,它已经有些令人困惑。当您不小心使用错误的变量时,这可能会导致严重的错误,即使代码在不同的范围内非常好并且编译时没有警告。例如,这段代码应该做什么?for(int i=0; i<10; i++) {&nbsp; for(int i=0; i<10; i++) {&nbsp; &nbsp; System.out.println(i);&nbsp;&nbsp; }}C++ 会说“这些应该是两个单独的变量”JavaScript 会说“这些应该是同一个变量”Java 说“这令人困惑,请选择更好的名称”,并且不允许在单个函数中隐藏局部变量。

慕后森

这没有改变。Java 就是这样设计的。局部变量不能被同一函数中定义的其他变量遮蔽。原因是一致性,所有外部变量对内部作用域也是可见的。这是一种情况,Java 的工作方式与 C 和 C++ 不同,后者允许同一函数中的变量相互遮蔽。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java