声明同名对象时出错,但如果我们声明对象使用for循环则不会出错
Error occur while declare object with same name , but no error if we declare object use a for loop
for(i=0; i< 3; i++){
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
执行时,这段代码创建了 3 个 DescriptionInfoDTO 对象
'description' 作为名称并将其添加到列表中。此代码正确执行,没有显示任何错误...
但是如果我们像下面这样声明对象,即不使用 for 循环,就会发生错误,为什么?
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
两个代码做同样的事情吗?
这里的重点是:在for循环中,变量只存在于该循环的边界(范围)内,一旦循环结束就不存在了。
这样,变量永远不存在'at the same time'。
这使得重新声明它成为可能,只是不同时,因为您尝试在没有循环的代码中这样做。
由于您声明多个同名变量。
,所以出现多个声明错误
如果您在循环中声明一个变量,那么它只能在该循环范围内访问,这意味着一旦当前迭代完成,它就会被清除。
如果将第二个代码段更改为
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
它将等同于第一个片段并通过编译。
在第一种情况下,您在一个循环迭代的范围内声明对象。一次迭代后对象不再存在。
在第二种情况下,您在同一范围内定义了三个对象。这会导致编译时错误。
变量是 范围(有关详细信息,请参阅 JLS §6.3)。
循环体声明了它自己的作用域,所以这两个代码片段不是等价的。如果您也将这些行限定在范围内,它们将是:
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
for 循环中的对象的生命周期将在该次迭代后结束,但是如果您单独声明它,就像您显示的代码而不是 for 循环。它不能将多个具有相同名称的变量放在堆栈上,这就是您收到错误的原因。
第一个和第二个的区别在于,首先你是运行一个循环,在这个循环中你创建的所有变量都在循环完成时被销毁,所以当你进入下一次迭代时你可以创建一个新变量
for(i=0; i< 3; i++){
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
} //description is destroyed here
但在第二种情况下,您创建了一个新变量,而另一个变量已存在于同一范围内。这是不可能的
两个例子的实际区别在于变量所在的scope:
- 在第一个示例中,变量的范围是循环的单次迭代 - 每次迭代都会创建一个新范围,并且花括号内声明的所有内容对于该范围都是局部的(除非它在大括号外声明, 和
i
变量一样)
- 在第二个例子中,所有三个变量都存在于一个作用域中,并且一个作用域中只允许一个名称变量
for(i=0; i< 3; i++){
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
执行时,这段代码创建了 3 个 DescriptionInfoDTO 对象 'description' 作为名称并将其添加到列表中。此代码正确执行,没有显示任何错误...
但是如果我们像下面这样声明对象,即不使用 for 循环,就会发生错误,为什么?
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
两个代码做同样的事情吗?
这里的重点是:在for循环中,变量只存在于该循环的边界(范围)内,一旦循环结束就不存在了。
这样,变量永远不存在'at the same time'。
这使得重新声明它成为可能,只是不同时,因为您尝试在没有循环的代码中这样做。
由于您声明多个同名变量。
,所以出现多个声明错误如果您在循环中声明一个变量,那么它只能在该循环范围内访问,这意味着一旦当前迭代完成,它就会被清除。
如果将第二个代码段更改为
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
它将等同于第一个片段并通过编译。
在第一种情况下,您在一个循环迭代的范围内声明对象。一次迭代后对象不再存在。
在第二种情况下,您在同一范围内定义了三个对象。这会导致编译时错误。
变量是 范围(有关详细信息,请参阅 JLS §6.3)。
循环体声明了它自己的作用域,所以这两个代码片段不是等价的。如果您也将这些行限定在范围内,它们将是:
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
{
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
}
for 循环中的对象的生命周期将在该次迭代后结束,但是如果您单独声明它,就像您显示的代码而不是 for 循环。它不能将多个具有相同名称的变量放在堆栈上,这就是您收到错误的原因。
第一个和第二个的区别在于,首先你是运行一个循环,在这个循环中你创建的所有变量都在循环完成时被销毁,所以当你进入下一次迭代时你可以创建一个新变量
for(i=0; i< 3; i++){
DescriptionInfoDTO description = new DescriptionInfoDTO();
description.setLanguage("English");
description.setName("anu");
description.setState("Kerala");
descriptionInfoList.add(description);
} //description is destroyed here
但在第二种情况下,您创建了一个新变量,而另一个变量已存在于同一范围内。这是不可能的
两个例子的实际区别在于变量所在的scope:
- 在第一个示例中,变量的范围是循环的单次迭代 - 每次迭代都会创建一个新范围,并且花括号内声明的所有内容对于该范围都是局部的(除非它在大括号外声明, 和
i
变量一样) - 在第二个例子中,所有三个变量都存在于一个作用域中,并且一个作用域中只允许一个名称变量