第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
这是如何工作的?
答案 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
变量创建一个存储位置,而不是为每次循环迭代创建和销毁它。