簡體   English   中英

Java中的局部變量,與全局變量同名

[英]Local variable in Java with the same name as a global variable

我正在嘗試理解Java中的范圍。 在Perl中,我可以執行以下操作:

my $x = 1;
{
    my $x = 2;
    say $x; # prints 2
}
say $x; # prints 1

換句話說,由於my在范圍內使用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(..);
}

但那會改變我的全局變量的內容,我真的不希望這樣。 有沒有辦法使用與我用於全局變量的局部變量相同的名稱?

您必須使用新名稱定義新的局部變量,因為變量的范圍如下:current block + subblocks。 因此,在您的情況下,rawURL是為您所謂的“全局”定義的,並且它對子塊可見,即進入for塊。

在java中,你可以這樣做:

{
   String myvar = "";
}

{
   String myvar = "";
}

因為在這里,同一級別有兩個不同的塊

但你做不到:

String myvar = "";
{
    String myvar = "";
}

因為同一個塊(子塊)中的兩個變量存在同名沖突。

在java中,您有公共和私有訪問修飾符來控制變量的可訪問性,但是如果在類中聲明一個變量,它將是一個全局變量,而類方法中的變量將是本地變量,而不是方法之外的變量。 。 沒有絕對的全局變量和局部變量,您必須聲明和定義新變量的新變量名稱。

public class abc{
    public int a; //global and accessible by every class outside this class too 
    private int b; //global and accessible only within this class
    private void m(){
        int x; //local and accessible only within this method 
    }
}

另外你可以做到這一點

public void m(){
    for(;;){
        int a;
    }
    for(;;){
        int a;
    }
}

但你不能這樣做

public void m(){
    int a;
    for(;;){
        int a;
    }
}

希望這可以幫助你。

在Java中我試圖做類似的事情,但我收到錯誤

變量rawURL已在方法run()中定義

JLS解釋了為什么會出現錯誤:

6.4。 陰影和遮蔽

如果使用局部變量v的名稱來聲明v的范圍內的新變量,那么這是一個編譯時錯誤,除非在聲明在v的范圍內的類中聲明了新變量。

並解釋一下v的范圍是什么,我在解釋它的答案

基本上,如果將它與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;
        }             
    }
}      

但這對你的需求來說可能是一種過度殺傷力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM