Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环内变量的声明与相同变量名的多个声明_Java_Variables_Scope_Syntax Error - Fatal编程技术网

Java 循环内变量的声明与相同变量名的多个声明

Java 循环内变量的声明与相同变量名的多个声明,java,variables,scope,syntax-error,Java,Variables,Scope,Syntax Error,以下代码给出了一个错误,因为变量m定义了两次 class one { public static void main(String args[]) { int m=10; int m=10; } } class one { public static void main(String args[]) { for(int i=1;i<=2;i++) { int m=10; } } } 但是当声明在循环中完

以下代码给出了一个错误,因为变量m定义了两次

class one {
   public static void main(String args[]) {
     int m=10;
     int m=10;
   }
 }
 class one {
   public static void main(String args[]) {
     for(int i=1;i<=2;i++) {
       int m=10;
     }
   }
 }
但是当声明在循环中完成时,它是正常的,即使
m
仍被定义了两次

class one {
   public static void main(String args[]) {
     int m=10;
     int m=10;
   }
 }
 class one {
   public static void main(String args[]) {
     for(int i=1;i<=2;i++) {
       int m=10;
     }
   }
 }
第一类{
公共静态void main(字符串参数[]){

对于(int i=1;i,对于第一种情况,m被引用到main方法的末尾,因此不能在同一范围内有两个同名的变量


而在第二种情况下,每次循环执行时,最后一次迭代的m将不再被引用,因此您可以重新声明并重新初始化它。

出现错误是因为您在同一块(范围)中定义了相同的变量两次。当您在循环内运行时,您“打开”循环的每个迭代都有一个新的作用域,因此您可以定义一个仅在此作用域内可见的变量(但在循环外是不可访问的)。例如,如果您编写了类似的内容:

class one {    
    public static void main(String args[]) {     
        {
            int m=10;
        }
        {
            int m=10;
        }
    }
}

它本来可以被很好地编译,因为同名的变量不共享相同的作用域。

在一个代码块中,不能多次声明同名的变量

在第一种情况下,在代码块(即main)中声明相同的变量。
在第二种情况下,在for循环的第一次迭代之后,
变量m
被销毁,并在第二次迭代中重新创建它在第一次迭代中创建了一个错误,因为您要声明变量两次。

-在第一次代码中,您在同一范围内声明了m两次,并且它一直持续到main()方法结束


-
循环中
每次
原语int变量m
用值创建时,这显然不是问题。

简单地说,在第二个示例中,您没有两次声明此变量。因为变量的生命周期在结束时结束
在声明它的块中,当您在第二次迭代中声明
m
时,第一个是“死的”。这就是为什么您可以在循环中执行它


在第一个示例中,您在同一代码块中声明了两个名称相同的变量,它们应该是“活动的”同时。这是禁止的,因为你不能通过写
m

来分辨你引用的变量。好吧,请阅读错误消息。第一次使用无效的原因应该是不言自明的。然后,如果还有问题,请发布准确的错误消息。@adchilds这个术语似乎有误导性。。没有据我所知,“覆盖”或“重新声明”。尽管通过使用
final
变量和匿名内部类模拟的闭包可以观察到引入了新的变量绑定。(虽然我在这一点上可能是错的,但如果
final
被视为在实例化匿名类时只做了一个副本。)为什么会被否决?我发现这是一个非常有效的问题!我想OP已经知道你不能两次声明一个变量。他想知道的是,如果每次迭代都再次声明变量,为什么在循环中声明一个变量是可以的。不要被触发。理解这个问题:)