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)
但这会改变我的全局变量的内容,我真的不希望这样。有没有办法为局部变量使用与全局变量相同的名称?
您必须使用新名称定义新的局部变量,因为变量的范围如下:当前块 + 子块。因此,在您的情况下, rawURL 是为您所谓的“全局”定义的,并且它对子块可见,即进入 for 块。
在java中,你可以这样做:
{
String myvar = "";
}
{
String myvar = "";
}
Run Code Online (Sandbox Code Playgroud)
因为这里有两个不同的块在同一层
但你不能这样做:
String myvar = "";
{
String myvar = "";
}
Run Code Online (Sandbox Code Playgroud)
因为同一块(子块)中的两个变量存在同名冲突。