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

时间:2016-01-02 14:01:40

标签: java variables scope

我正在尝试理解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(..);
}

但那会改变我的全局变量的内容,我真的不希望这样。是否有任何方法可以使用与我用于全局变量的局部变量相同的名称?

3 个答案:

答案 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;
        }             
    }
}      

但它可能对你的需求有些过分。