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

问题描述 投票:-1回答:4

第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 

这是如何运作的?

java
4个回答
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行中声明并初始化了一个变量,因此在第2行中再次声明它是没有意义的并且正在给出错误。

在你的循环中,你只是创建一个新的字符串,然后当循环结束时,它被扔进垃圾箱。循环中声明的变量的范围仅限于循环本身。因此它不会给出错误。


1
投票

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


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变量创建一个存储位置,而不是为每个循环迭代创建和销毁它。

© www.soinside.com 2019 - 2024. All rights reserved.