【问题标题】:Error occur while declare object with same name , but no error if we declare object use a for loop声明具有相同名称的对象时发生错误,但如果我们声明对象使用 for 循环则不会出错
【发布时间】:2015-04-14 07:23:23
【问题描述】:
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);

两个代码都做同样的事情吗?

【问题讨论】:

  • 不,这不是一回事。 in for 对象的块范围仅适用于该块。
  • 因为第一个只声明一次并重新分配了多次。没有歧义

标签: java list object dto


【解决方案1】:

如果把第二个sn-p改成

{
    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);
}

相当于第一个sn-p,会通过编译。

【讨论】:

    【解决方案2】:

    这里的重点是:在for循环中,变量只存在于该循环的边界(范围)内,一旦循环结束就不再存在了。

    这样,变量永远不会“同时”存在。

    这使得重新声明它成为可能,但不是在同一时间,因为您尝试在没有循环的代码中这样做。

    【讨论】:

      【解决方案3】:

      第一个和第二个的区别在于,首先你在运行一个循环,在循环中你创建的所有变量s都被销毁完成循环,所以当你进入下一次迭代时你可以创建一个新变量

      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
      

      但在第二种情况下,您创建了一个新变量,而另一个变量已经存在于同一范围内。这是不可能的

      【讨论】:

        【解决方案4】:

        由于您正在声明多个同名变量,因此出现多个声明错误。

        如果您在循环中声明一个变量,那么它只能在该循环的范围内访问,这意味着一旦当前迭代完成,它将被清除。

        【讨论】:

          【解决方案5】:

          变量是作用域(更多信息请参见JLS §6.3)。

          循环体声明了它自己的作用域,所以两个代码 sn-ps 是等价的。如果您还将这些行设为范围,它们将是:

          {
              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);
          }
          

          【讨论】:

            【解决方案6】:

            在第一种情况下,您在一个循环迭代的范围内声明对象。一次迭代后,该对象不再存在。

            在第二种情况下,您在同一范围内定义了三个对象。这会导致编译时错误。

            【讨论】:

              【解决方案7】:

              for 循环中对象的生命周期将在该迭代之后结束,但是如果您像显示的代码而不是 for 循环那样单独声明它。它不能将多个具有相同名称的变量放在堆栈上,这就是您收到错误的原因。

              【讨论】:

                【解决方案8】:

                两个例子的实际区别在于变量所在的scope

                • 在第一个示例中,变量的范围是循环的单次迭代 - 每次迭代都会创建一个新范围,并且在大括号内声明的所有内容对于该范围都是本地的(除非它在大括号外声明,如是i 变量)
                • 在第二个示例中,所有三个变量都存在于一个范围内,并且一个范围内只允许一个名称变量

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-07-24
                  • 1970-01-01
                  • 2016-12-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多