字符串对象的局部变量重复

时间:2018-10-06 12:02:08

标签: java

第1行和第2行将编译错误显示为“重复的局部变量”。但是第3行和第4行中的代码使用单个字符串对象进行了10次迭代,没有任何错误。

String string1 = new String("java");            //line 1
String string1 = new String("java");              //line 2


for(int i=0;i<10;i++)                        //line 3
            String string2 = new String("abc");    //line 4 

这是如何工作的?

4 个答案:

答案 0 :(得分:4)

声明变量不是操作。它是在编译时而非运行时添加到作用域的。

两个string1处于同一范围内,这就是为什么不允许这样做的原因。

循环中定义的任何变量对于该循环的作用域都是局部的。即只有一个string2,如果不是这种情况,则可以在循环中使用一个变量。

for (int i = 0; i < 10; i++) { // scope starts here
    String string2 = "abc";
} // scope ends here and string2 doesn't exist after this.

答案 1 :(得分:1)

由于您已经在第1行中声明并初始化了一个变量,因此在第2行中再次声明它是没有意义的,并且会产生错误。

在循环中,您只是在创建一个新字符串,然后在循环结束时将其丢弃。在循环中声明的变量的范围仅限于循环本身。因此它不会给出错误。

答案 2 :(得分:1)

String string1 = new String(“ java”); //第1行 string1 = new String(“ java”);

答案 3 :(得分:0)

什么是变量?

  • 在这里可以存储东西。
  • 它有一个名称,以便以后您可以使用变量名读取或修改存储的值。

无论编写String string1 = new String("java");之类的语句,都是在创建一个新变量,为其命名(string1),并在其中存储一个值(new String("java"))。

在您的代码段中(稍作修改)

String string1 = new String("one");
String string1 = new String("two");

您(尝试)创建了两个不同的变量,但都给了它们相同的名称。所以,如果您以后写例如System.out.println(string1),您希望打印哪个string1,是“一个”还是“两个”?对于您和机器而言,都难以决定,因此不允许这样做。

如果要两个存储位置,请为它们使用不同的名称。如果要更改现有变量的值,请执行以下操作

String string1 = new String("one");
string1 = new String("two");

现在,第二行只是将一个不同的值分配给一个已经存在的变量。

循环是另一种情况:

for(int i=0;i<10;i++)
    String string2 = new String("abc");

首先,这也不会编译。为什么?您创建了一个变量string2,但是没有地方可以引用它。该名称仅在循环体内有效,并且循环体仅由这一行组成,因此没有“后”位置可以使用变量名。因此,让我们修改循环:

for(int i=0;i<10;i++) {
    String string2 = new String("abc");
    System.out.println(string2);
}

在这里,我们创建一个变量string2,该变量有效至循环的右括号为止。理解此过程(*)的模型可以是,每当我们执行String string2 = new String("abc");语句(执行10次)时,都会创建一个名为string2的地方,并在退出该地方时被销毁。循环体(我们也做10次)。因此,在任何给定时间,最多存在一个string2变量。并且,System.out.println(string2);语句将永远不会看到来自先前迭代的string2值(先前的string2变量已被销毁),因此在循环情况中没有歧义。

顺便说一句:

  • 无需编写string1 = new String("abc"),简单的string1 = "abc"即可完成工作。

(*)只是一个模型,实际上Java会在方法输入时为string2变量创建一个存储位置,而不是为每次循环迭代创建和销毁它。