Java中的局部变量与全局变量同名

Fra*_*fka 6 java variables scope

我正在尝试了解 Java 中的作用域。在 Perl 中,我可以执行以下操作:

my $x = 1;
{
    my $x = 2;
    say $x; # prints 2
}
say $x; # prints 1
Run Code Online (Sandbox Code Playgroud)

换句话说,由于我my在作用域内声明了变量 $x,因此该作用域中的 $x 变量是该作用域的本地变量(即,与全局 $x 变量不是同一变量)。现在,在Java中我尝试做类似的事情,但我收到错误

变量 rawURL 已在方法 run() 中定义

这是代码:

// Global rawURL
URI rawURl;
try {
  rawURL = new URI("http://www.google.com");
} catch (Exception e) {
  // Handle later
}

// Some time later
for (Element link : links) {
  // rawURL in this scope
  URI rawURL;
  try {
    rawURL = new URI(link.attr("abs:href"));
  } catch (Exception e) {
    // Handle later
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是,我不想对所有变量名称都进行创意,以确保每个变量名称都是不同的。我只是使用 rawURL 来构建规范化 URL,因此它本质上是一个临时变量。我可以这样做:

for (Element link : links) {
  rawURL = new URL(..);
}
Run Code Online (Sandbox Code Playgroud)

但这会改变我的全局变量的内容,我真的不希望这样。有没有办法为局部变量使用与全局变量相同的名称?

Pri*_*rim 4

您必须使用新名称定义新的局部变量,因为变量的范围如下:当前块 + 子块。因此,在您的情况下, rawURL 是为您所谓的“全局”定义的,并且它对子块可见,即进入 for 块。

在java中,你可以这样做:

{
   String myvar = "";
}

{
   String myvar = "";
}
Run Code Online (Sandbox Code Playgroud)

因为这里有两个不同的块在同一层

但你不能这样做:

String myvar = "";
{
    String myvar = "";
}
Run Code Online (Sandbox Code Playgroud)

因为同一块(子块)中的两个变量存在同名冲突。

  • @Dima警告仅在隐藏实例字段的变量之间,但变量不能隐藏其他变量,它不仅产生警告,而且产生错误 (3认同)