2012-04-15 71 views
1

能有人請解釋不this在第一個構造的情況下輸出0?Java this.classProperty與classProperty引入參數變量名稱衝突?

如果參數變量名是相同的類的屬性名稱和我使用的方法中該屬性。 java是怎樣解釋「class property」或「argument variable」的?

沒有this

public User(int userId){ 
    userId = userId; 

} 

隨着this

public User(int userId){ 
    this.userId = userId; 

} 


public void PrintUserId(){ 
    System.out.println(this.userId); 
} 

User firstUser = new User(123); 
firstUser.PrintUserId(); 

// 0沒有這個

// 123這個

回答

6

能有人請解釋Ø utput 0在第一個構造函數的情況下沒有這個?

當然 - 這種說法是無操作:

userId = userId; 

它只是userId參數的變量分配給本身。它根本不觸及該領域。在該方法中,參數userId陰影領域稱爲userId - 所以你必須明確地要指到外地,這是第二個版本則:

this.userId = userId; 

我會期望任何現代IDE都會在第一個版本中突出顯示禁止分配,並帶有警告。

(這是值得被明確術語,順便 - 一個參數是提供一種方法,一個值; 參數是被聲明爲方法簽名的一部分的變量同樣這是一個字段。 。而非財產

編輯:如果參數有不同名稱,例如

public User(int id) { 
    userId = id; 
} 

則參數陰影領域,並且所述標識符userId仍指字段。這只是一個解決標識符意義的問題 - 在第一個示例中,簡單名稱userId指的是引起問題的參數。

編輯:從section 6.4.1 of the JLS

一些聲明可能在它們的範圍的部分是由相同名稱的另一聲明,在這種情況下,一個簡單的名稱不能被用於指所聲明實體被隱藏。

...

字段或名爲N的陰影形式參數的聲明d,整個d的範圍,名爲N的任何其它變量,這些變量在範圍在其中d發生的點的聲明。

因此,在這種情況下,d是形式參數userId的聲明,d的範圍是構造函數 - 所以throught構造函數,參數陰影領域。

+0

感謝,但如果我使用公共用戶(INT編號){用戶id =標識;},它更新類屬性。 – talktopk 2012-04-15 19:01:28

+0

@talktopk:是的,因爲在這種情況下,參數不會影響字段。 – 2012-04-15 19:01:55

+0

所以有一個偏好我猜如果發生衝突。 – talktopk 2012-04-15 19:01:55

4

這是因爲shadowing

,因爲它在跟蹤你並沒有使用該參數值userId的成員變量。由於int成員變量初始化爲0,這就是爲什麼你看到的是輸出,而不this關鍵字。