声明同名对象时出错,但如果我们声明对象使用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 变量一样)
  • 在第二个例子中,所有三个变量都存在于一个作用域中,并且一个作用域中只允许一个名称变量