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