Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_For Loop - Fatal编程技术网

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

Java 如何在循环中重新声明变量?,java,loops,for-loop,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(in

此代码不起作用:

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);
       }
    }
}
公共类测试
{
公共静态void main(字符串[]args)
{

for(int a=0;a的生存期
int b
只到for循环的迭代,所以每次迭代都会得到新的声明值

在第一次约会中

您正在初始化
i
两次,而可能是

 int i=3;
 i=4;

所以i的值是4,记住int i使它成为一个变量,它的值可以在它的声明块中重新赋值,循环的每个迭代都有它自己的范围,所以以前迭代的声明不再在当前迭代的范围内

这相当于写:

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

您两次声明相同的变量名。 而且

公共类测试{
公共静态void main(字符串[]args){

对于(inta=0;a,您的第一个示例将使用块

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

这将创建一个新的“i”,它在块的词法范围内阴影第一个“i”。

这是因为变量的范围

案例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);
   }
 }
}
输出

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对象


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

具有循环作用域的局部变量被赋予内存loca初始化后,内存位置会在超出范围后立即被销毁,因此无法再次声明以前的“b”记录。但对于具有主作用域的变量“a”,情况并非如此,因为您在主作用域中再次声明a时,已经存在变量“a”的记录,因此无法复制它。

因为,关于变量的作用域,当你遍历循环时,已经有一个名为b的变量了。那么,我们不是刚刚声明了另一个b吗?看看我下面的评论,我已经给了你一个详细的解释。@请先考虑一下局部变量的寿命。谢谢!我知道这种做法是不可取的。我不知道一个变量当作用域结束时,e将被销毁。谢谢!!!没有资源浪费。变量分配一次,并在循环期间重复使用。通常,所有局部变量都是在输入方法时创建的,并且在方法内所做的任何事情都不能在执行期间创建新变量。此外,实际上鼓励这种做法,您应该总是将变量范围限制为最小的可能性。由于资源浪费,我认为时间对于这样一个小应用程序来说是可以忽略不计的,考虑一些需要创建许多对象的企业应用程序。@乔妮内部发生的情况类似于Eran在上面的注释中所解释的。再次强调。我确信您知道b的值不能在循环之外访问。@Joni请看一下我更新的注释。您将能够看到在循环中创建了新的变量。必须不惜一切代价避免这种做法。否则,为什么我们需要实现设计模式,如singleton、Factory等。?(答:因为它只返回类的一个实例。不管你实例化它多少次。)它是有效的,但我不认为这清楚地解释了OP问题中与循环相关的部分。
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);
   }
 }
}
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);

}
}
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