如何在循环中重新声明变量?

时间:2014-10-23 05:58:24

标签: java loops for-loop

此代码不起作用:

public class Test
{
    public static void main(String[] args)
    {
       int i=3;
       int i=4;
       System.out.println(i);   
    } 
}

那为什么这段代码有用呢?

public class Test
{
    public static void main(String[] args)
    {
       for(int a=0;a<9;a++)
       {
           int b=a+1;
           System.out.println(b);
       }
    }
}

我们不是一次又一次地重新声明b吗?

6 个答案:

答案 0 :(得分:5)

循环的每次迭代都有自己的范围,因此先前迭代的声明不再在当前迭代的范围内。

它等同于写作:

   {
       int b=1;
       System.out.println(b);
   }
   {
       int b=2;
       System.out.println(b);
   }
   {
       int b=3;
       System.out.println(b);
   }
   ....

答案 1 :(得分:1)

int b的生命周期直到for循环的迭代,所以每次迭代它时都会获得声明的新值。

在第一个前,

   int i=3;
   int i=4;

你正在i两次,而不是

 int i=3;
 i=4;

所以i的值将是4,记住int我将它变成一个变量,它的值可以在其声明块中重新赋值

答案 2 :(得分:1)

    public class Test { 
     public static void main(String[] args) { 
          int i=3; 
          int i=4; 
          System.out.println(i);
    } 

您要两次声明相同的变量名称。 并在

     public class Test {
       public static void main(String[] args) { 
          for(int a=0;a<9;a++) { 
             int b=a+1; 
             System.out.println(b); 
          }
      } 
    }

这里b是for循环中的局部变量,你在循环开始时声明它。并且在此循环中没有重复的名称。

答案 3 :(得分:1)

您的第一个示例适用于块

int i=3; 
{
  int i=4;
  System.out.println(i);
}

这会创建一个新的'i',在块的词法范围内隐藏第一个'i'。

答案 4 :(得分:0)

这是因为变量的范围,

情况1:

public class Test
{
 public static void main(String[] args)
 {
  int i=3;
  int i=4;
  System.out.println(i);   
 }
}

在这里你有一个变量我在相同的范围内定义了两次。

情况2:

public class Test
{
 public static void main(String[] args)
 {
   for(int a=0;a<9;a++)
   {
       int b=a+1;
       System.out.println(b);
   }
 }
}

在这里,一次只有一个b实例,当循环结束时,变量被销毁并重新创建以用于下一次迭代。所以你不会得到你正在寻找的错误。

我建议你在JAVA中查看变量范围。

注意:我不会建议这种编程方式,因为资源被浪费在一次又一次地创建相同的变量。你所做的只是在循环中重置它。


更新

public class Test1 {
public static void main(String[] args) {

    Person p1=new Person();
    System.out.println("Person Object p1 before for loop "+p1);

    for(int i=0;i<5;i++){
        Person p2=new Person();
        System.out.println("Person object "+i+" "+p2);
    }

    System.out.println("Person Object p1 after for loop "+p1);

}
}

Dummy class Person

class Person{ }

输出

Person Object p1 before for loop com.project.CVS.Person@fd13b5
Person object 0 com.project.CVS.Person@118f375
Person object 1 com.project.CVS.Person@117a8bd
Person object 2 com.project.CVS.Person@471e30
Person object 3 com.project.CVS.Person@10ef90c
Person object 4 com.project.CVS.Person@a32b
Person Object p1 after for loop com.project.CVS.Person@fd13b5

这里我创建了一个名为Person的虚拟类,我在循环中声明并初始化了一个Person对象。现在,当我打印出person对象时,它会给出哈希码。

现在,在分析输出时,可以清楚地看到在每次迭代期间都会创建新对象,因为哈希码值不匹配。如果您的应用程序真的不需要这样的实现,那么您必须并且应该避免它。我希望我已经清除了你的怀疑。

答案 5 :(得分:0)

带有循环范围的局部变量在初始化时被赋予内存位置,并且一旦超出范围就会破坏内存位置,因此没有先前的'b'b记录可以再次声明。但是,对于带有主范围的变量'a',情况并非如此,因为您在主变量中再次声明了已经存在变量'a'的记录,因此您无法复制它。