2016-06-14 36 views
1

我有兩個類。它們都在構造函數中引用相同的變量。我很困惑,當我使用this.name時,我不需要更改參數的名稱,Java編譯器知道我指的是主變量?構造函數參數使用這種差異?

在第二個示例中,參數名稱已更改,但未使用this。 這兩個類別有什麼不同? 他們都認爲「好編程」?

class Account { 
    private string name; 
    private int amount; 

    Account(String name, int amount) { 
     this.name = name; 
     this.amount = amount; 
    } 
    } 

class Account { 
private string name; 
private int amount; 

Account(String n, int a) { 
    name = n; 
    amount = a; 
} 
} 
+0

第二種情況下的'this'是隱含添加的 – Ramanlfc

回答

1

Java允許爲實例變量和局部變量/參數使用相同的名稱。

當方法/構造函數參數名稱與實例變量名稱相同時,我們需要明確使用this關鍵字來通知JVM我們正在嘗試使用此實例變量;不是局部變量。否則,對於沒有this的相同命名變量,JVM將選擇更具體的範圍變量。

對於第一種情況下,你使用的是相同的變量名稱叫name參數和實例變量,所以你需要明確界定哪一個是使用this爲波紋管的實例變量:

this.name = name; 

對於第二種情況,有沒有命名混淆,所以如果你不使用this確定實例變量沒有問題。

N.B. 當您訪問實例變量時,最好使用this以提高可讀性。

1

無論是罰款。如果您希望私有實例變量也被稱爲名稱,則只能使用this.name。當你有一個與參數不同的實例變量時,它並不重要。

2

在這種情況下Account(String name, int amount)如果您的代碼說name = "ABC";,它是設置參數name,而不是成員。如果你想設置成員,你需要通過this.name來引用它。

因此name = name;什麼都不做(將參數設置爲自身)。 this.name = name;將成員設置爲參數。

2

您的兩個代碼都沒有錯。但是,在Java中,使用無意義的名稱前綴或後綴來區分實例變量和局部變量的參數被認爲是不好的做法。我想推薦使用任何名稱使代碼最容易理解。

1

這兩個類別有什麼不同?

功能無。編譯器會改變你的第二個示例如下:

Account(String n, int a) 
{ 
    this.name = n; 
    this.amount = a; 
} 

是左右逢源考慮「良好的編程」?

我更喜歡第一種寫代碼的方式。