public class Test{
 public void A(){
   int a=0;
   ....
   int a=1;  //重复定义变量a, 出错
 }
}但是如果:
public class Test{
  public void A(){
  while(true){
   double a=0;//在这里定义的a为什么不是重复的?
  }
 }
}
弱弱的问,谢谢!

解决方案 »

  1.   

    while(true){
       double a=0;//在这里定义的a为什么不是重复的?
      }
    是付值操作,又不是定义操作,所以可以了
      

  2.   

    while(true){
       double a=0;//在这里定义的a为什么不是重复的?
      }-- 循环内部是一个逻辑块,相当于一个函数
      

  3.   

    int a = 0;
    int a = 1;
    变量a被定义了两次,当然是重复定义拉。
    double a = 0;这里变量a只定义了一次,所以不会是重复定义阿。
      

  4.   

    我想是因为 double a 的作用域是在while循环中。也就是说每次进入while中都将声明a,并付值。
      

  5.   

    所谓重复定义,就是两个同名变量的作用域存在重叠。
    你的int a = 0;的作用域是A()。int a = 1;
    的作用域也是A(),他们的作用域相同,所以是重复定义。
    重复定义还有一种形式。
    public void a() {
      int a = 0;
      if (true) {
      int a =1;
     }
    }
    这里第一次定义的a的作用域比第二次定义的作用域要大,但是在if块中,他们的
    作用域是重叠的,所以也是重复定义。
    至于说while(true){
       double a=0;//在这里定义的a为什么不是重复的?
      }
    这里确实定义了很多的变量a,因为while是无限循环,但是每一次循环结束后定义的变量
    就超出了他的作用域因此会被回收,下一个循环又定义一个新的变量a,他和前面定义的那个已经不在了,所以不存在作用域重叠的问题。
      

  6.   

    while(true){
       double a=0;//在这里定义的a为什么不是重复的?
      }在执行到}后的时候double a的定义域消失,a的这一次生命周期结束,
    等再一次的循环时,重新定义,享受一个新的生命周期。
    这些类型的定义都由栈来管理的。