2010-03-22 83 views
7

我正在讀一本關於java的書。它只是解釋瞭如何創建一個名爲「deck」的類,其中包含一組卡作爲其實例變量。這裏是代碼snippit:爲什麼不是「這個」。命令需要在這個構造函數中? (java)

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     cards = new Card[n]; 
    } 
} 

爲什麼不使用this.命令?

例如,爲什麼不代碼如下:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
     this.cards = new Card[n]; 
    } 
} 
+0

第二個示例中有錯誤。有2個'''。 – 2010-03-22 18:53:17

+0

注意:如果您想討論是否使用或省略'this.'是否是一個好主意*,那麼還有很多其他地方可以進行辯論。例如,看到這個問題:http://stackoverflow.com/questions/132777/do-you-prefix-your-instance-variable-with-this-in-java – 2010-03-22 19:16:16

回答

12

this.是隱含的。

一般來說,這是一個最佳實踐(至少認爲它)之一,只有在絕對必要時使用this。例如,當您有一個名爲cards的本地變量和一個名爲cards的成員變量時,您需要this.cards來引用成員變量,因爲cards引用了本地變量。

在這種情況下,this是一個好主意(儘管重命名成員變量可能更好)。

在其他所有情況下,如果隱含的this可以工作,請使用它。

+0

可以這樣做。總是被忽略呢? 還是你的意思是作者打算它在那裏,但不寫它,因爲它隱含的相對於讀者? – David 2010-03-22 18:37:33

+0

@大衛:它總是可以省略,除非你也有一個局部變量具有相同的名字(因爲'card'本身就是局部變量而不是實例變量,你需要'this.cards'來明確引用該實例)。 – Chris 2010-03-22 18:39:15

+0

@大衛,@克里斯史密斯:赫......我按照你的意見編輯。 – Randolpho 2010-03-22 18:40:02

1

在這種情況下,「this」關鍵字是多餘的。卡已經在類範圍內定義,編譯器知道該成員是「這個」類的一部分。

2

This是隱含的。

讓我們詳細:

class Deck { 
    Card[] cards; 
    public Deck (Card[] cards) { 
      this.cards = cards; 
    } 
} 

在這種情況下,你在共享相同的名稱的卡對象的數組卡的數組傳遞。 This引用您的對象的數據元,而不是構造函數的參數。

0

「this」暗示。沒有必要使用「this」。我通常只是爲了使代碼可讀,但它不是必需的。

20

因爲沒有歧義。只有一個cards變量。如果有兩個 - 其中一個是實例變量(類的一部分,就像現在這樣),另一個 - 構造函數的參數,則需要this

而btw,this不是「命令」。這是一個「關鍵字」。

3

當您在構造函數中使用標識符cards時,編譯器會注意到該字段(a.k.a.成員變量)cards處於作用域中並使用它。 this.cards僅用於解決歧義,例如,如果您還有一個局部變量或名爲cards的參數。

3

如果您還有一個名爲cards的參數,它會有意義。然後this.cards將指定您的意思是類cards的確切字段,而不是參數。

但無論如何,在您的示例中描述的情況下,在案例中使用this.是一種很好的做法。

+3

不,不好的做法是將視覺噪聲添加到您的源代碼中。 – Bombe 2010-03-22 19:01:56

+2

@Bombe:這取決於你問誰。 *有些人*認爲使用'this.'是一種好習慣,而其他人則不這樣做。 – 2010-03-22 19:12:31

+0

確實。所以,這不是一個好的做法,因爲無論如何沒有好的做法。 :) – Bombe 2010-03-22 20:51:48

4

該對象的this參考是隱含的,但它可以是爲了清楚有用(和它的必須的對象的部件和具有相同名稱的本地變量之間歧義消除,如在下面的構造函數):

public class Foo { 
     final private int x; 

     public Foo(int x) { this.x = x; } 

     public int getX() { return this.x; } 
    } 
8

您無需限制使用this關鍵字的所有成員訪問權限。每當其他變量隱藏成員方法時,您只需要使用它。

這是不是在所有方法侷限於構造一個功能,但可供選擇:

public class Test 
{ 
    private int member; 
    private int value; 
    public Test(int value) { 
     member = 5; 
     this.value = value; // required to differentiate from the parameter 
    } 
    public void f(int member) { 
     int value = 5 
     this.member = value; // assign local 'value' (5) to member 'member' 
     this.value = member; // assign parameter 'member' to member 'value' 
    } 
} 
0

我嘗試在不要求「this」關鍵字的方式來選擇變量名。也就是說,如果我有一個名爲「value」的屬性,我將傳遞給一個名爲val的參數。

「this」關鍵字的一個很好的用法是構造函數重載。考慮下面的(我會用這個來證明的區別。):

public class Person 
{ 
    int age; 
    public Person(int age) 
    { 
     this.age=age; 
    } 
    public Person() 
    { 
     this(25); //default age 
    } 
} 

如果可能的話,我會盡量避免在性能和參數名稱相同,以避免你行6然而看,使用this關鍵字調用另一個構造函數是防止代碼重複的好方法。這是一個微不足道的例子,但是當你開始發現自己的構造函數做了很多相同的工作並且它們之間的差別很小時,它就非常方便。

相關問題