第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
这是如何运作的?
声明变量不是操作。它在编译时添加到作用域,而不是运行时。
两个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行中声明并初始化了一个变量,因此在第2行中再次声明它是没有意义的并且正在给出错误。
在你的循环中,你只是创建一个新的字符串,然后当循环结束时,它被扔进垃圾箱。循环中声明的变量的范围仅限于循环本身。因此它不会给出错误。
String string1 = new String(“java”); //第1行string1 = new String(“java”);
什么是变量?
无论你在哪里编写像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
变量创建一个存储位置,而不是为每个循环迭代创建和销毁它。