我正在尝试理解Java中的范围。在Perl中,我可以执行以下操作:
my $x = 1;
{
my $x = 2;
say $x; # prints 2
}
say $x; # prints 1
换句话说,由于我在范围内使用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
}
}
现在,问题是,我不想让我的所有变量名都有创意,确保每个变量名都不同。我只是使用rawURL来构建规范化的URL,因此它本质上是一个临时变量。我可以这样做:
for (Element link : links) {
rawURL = new URL(..);
}
但那会改变我的全局变量的内容,我真的不希望这样。是否有任何方法可以使用与我用于全局变量的局部变量相同的名称?
答案 0 :(得分:3)
您必须使用新名称定义新的局部变量,因为变量的范围如下:current block + subblocks。因此,在您的情况下,rawURL是为您所谓的“全局”定义的,并且它对子块可见,即进入for块。
在java中,你可以这样做:
{
String myvar = "";
}
{
String myvar = "";
}
因为在这里,同一级别有两个不同的块
但你不能这样做:
String myvar = "";
{
String myvar = "";
}
因为同一个块(子块)中的两个变量存在同名冲突。
答案 1 :(得分:1)
在java中,你有公共和私有访问修饰符来控制变量的可访问性,但是如果在类中声明一个变量,它将是一个全局变量,而类方法中的变量将是本地变量,而不是在方法之外。没有绝对的全局和局部变量,您必须声明和定义新变量的新变量名称。
public void m(){
for(;;){
int a;
}
for(;;){
int a;
}
}
另外你可以这样做
public void m(){
int a;
for(;;){
int a;
}
}
但你不能这样做
{{1}}
希望这可以帮助你。
答案 2 :(得分:1)
Java中的我正在尝试做类似的事情,但我收到了错误
变量rawURL已在方法run()
中定义
JLS解释了您收到错误的原因:
6.4。阴影和模糊
如果使用局部变量
范围内的类v
的名称来声明v
范围内的新变量,那么这是一个编译时错误,除非在a中声明了新变量声明在v
。
并解释 v
的范围是什么,我会在answer解释一下。
基本上,如果你将它与Perl进行比较,范围是"单向"而不是"双向"。
void method1() {
int x;
{
int y = x; // O.K. - x is in scope.
int x = y; // Not O.K. - x is in scope and was already declared.
}
x = y; // Not O.K. - y is not in scope.
}
你可以做什么,它是这样的:
void method2() {
int x;
class InsideClass {
{
int y = x;
int x = y;
}
}
}
但它可能对你的需求有些过分。