2012-09-29 41 views
1

以下代码的多个声明内声明变量的给出了一个错误,这是因为变量m被定义两次。环路VS相同的变量名

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

但当声明一个循环内完成,这是确定的,即使m仍然被定义了两次。

class one { 
    public static void main(String args[]) { 
    for(int i=1;i<=2;i++) { 
     int m=10; 
    } 
    } 
} 

并且编译器不会返回错误消息。
你能解释一下两者之间的区别,以及如何来有时我可以声明同一个变量两次同样的方法中,有时不是?

+6

嗯,*读取错误信息*。对于第一次使用无效的原因应该不言自明。然后,如果有剩下的问题,请*后确切的错误信息*。 – 2012-09-29 17:38:56

+0

@adchilds这个术语似乎有误导性。就我所知,没有“覆盖”或“重新声明”。虽然证明引入了一个* new *变量绑定,但可以通过用final变量和匿名内部类嘲笑的闭包来观察。 (虽然我可能在这一点上是错误的,如果'final'被视为不超过匿名类的实例化副本)。 – 2012-09-29 17:43:50

+0

为什么这会被低估?我发现这是一个非常有效的问题! – CKing

回答

2

对于第一种情况米被引用,直到主方法的端部,从而可以不具有相同名称的两个变量在同一范围内。

而在第二种情况下,每执行一次循环,男最后一次迭代不再被引用,因此你能够重新声明,并重新初始化。

0

你的错误是因为你在相同的块(范围)定义两次相同的变量。当你在一个循环中运行,“开放”的新范围为循环的每一次迭代,所以你可以定义一个变量,只有这个范围内是可见的(会不会accible外循环虽然)。例如,如果你写了类似的东西:

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

它将被编译得很好,因为同名的变量不共享相同的作用域。

0

你不能用一个代码块不止一次多个同名声明一个变量。

在第一种情况下,你正在声明中的代码,即主要的块相同的变量。 在第二种情况下,for循环的第一次迭代之后,variable m被破坏并重新创建了第二次迭代

0

它在第一个创建的错误,因为你是两次宣布varible。

+0

我认为OP已经知道你不能两次声明一个变量。他想知道的是为什么在每次迭代再次声明变量时在循环内声明变量是可以的。不要触动快乐。了解问题:) – CKing

0

-在第一个代码中,您已经在同一个作用域中声明了m次两次,直到main()方法结束。

-凡作为loop每次一primitive int variable m是一个价值创造因此它显然不是一个问题之内。

0

在简单的话,你不能在两次第二示例声明此变量。作为可变寿命上在它被声明的块的闭合}结束时,你的时间在第二次迭代中声明m,第一个是“死”。这就是为什么你可以循环做到这一点。

在第一个例子中,你声明在同一个代码块,这是为了“活”同时两个同名变量。这是因为你不能告诉你写m参考过哪些变量禁止的。