2010-03-22 84 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关键字调用另一个构造函数是防止代码重复的好方法。这是一个微不足道的例子,但是当你开始发现自己的构造函数做了很多相同的工作并且它们之间的差别很小时,它就非常方便。

相关问题