此代码不起作用:
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
吗?
答案 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'的记录,因此您无法复制它。