2010-03-14 27 views
0

我有一個類叫做「a」。在這個類中我有一個方法,在這個方法的參數列表中我也有「a」。那麼,我會在方法中看到哪個「a」?它會成爲領域還是它將成爲方法的論據?該方法的類和參數的字段可能會干擾?

public class myClass { 
    private String a; 
    // Method which sets the value of the field "a". 
    public void setA(String a) { 
    a = a; 
    } 
} 

順便說一下,也有類似的情況。一個方法有一些本地(對於方法)變量,其名稱與這些字段的名稱一致。如果我引用這種方法 - 方法中的局部變量(字段或局部變量),將「看到」方法是什麼?

回答

5

本地範圍更具優先級,所以參數a將隱藏字段a。實際上,您將參數a的值設置爲自身。正確的成語,以避免名稱衝突(和提高可讀性)是使用this明確標註類成員:

public void setA(String a) { 
    this.a = a; 
} 

這同樣適用於局部變量VS成員變量真:局部變量隱藏具有相同名稱的成員變量。

+1

當處理內部類時,可以使用'myClass.this.a'來引用'myClass'實例。 – Pindatjuh 2010-03-14 15:19:52

1

最接近的一個。也就是,

a = a; 

該方法內部沒有效果,因爲兩者都引用參數a。要引用實例變量a,請使用this關鍵字。

this.a = a; 
+0

酷!我沒有想到'this'的用法。我雖然我需要重新命名該方法的參數。但現在我認爲'這個'提供了一個更優雅的解決方案。謝謝。 – Roman 2010-03-14 15:04:17

1

本地版本將用相同的名稱「映射」實例變量。一種模式來解決這個問題像你的訪問者是這樣的:

public void setA(String a) { 
    this.a = a; 
} 

它使用this關鍵字要明確告知範圍。

0

您需要使用this來訪問class變量,否則它將始終採用參數變量。

2

要添加到所有的答案推薦:

public void setA(String a) { 
    this.a = a; 
} 

它認識到,省略this將參數簡單地設置本身是很重要的。通過使用final從而

public void setA(final String a) { 
    this.a = a; 
} 

可以消除因省略this錯誤。每當指定非故意需要更改的參數和字段時,使用final是一種很好的做法。

+1

+1用於推薦額外的東西,而不是像其他人一樣寫幾乎重複的答案 – 2010-03-14 16:53:49