Java 循环内变量的声明与相同变量名的多个声明
以下代码给出了一个错误,因为变量m定义了两次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; } } } 但是当声明在循环中完
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已经知道你不能两次声明一个变量。他想知道的是,如果每次迭代都再次声明变量,为什么在循环中声明一个变量是可以的。不要被触发。理解这个问题:)