Java 为什么不是';";这一点;此构造函数中是否需要命令?(爪哇)

Java 为什么不是';";这一点;此构造函数中是否需要命令?(爪哇),java,constructor,class,Java,Constructor,Class,我正在读一本关于java的书。它只是解释了如何创建一个名为“deck”的类,该类包含一个卡片数组作为其实例变量。以下是代码snippit: class Deck { Card[] cards; public Deck (int n) { cards = new Card[n]; } } 为什么不使用这个。命令 例如,为什么代码不是这样的: class Deck { Card[] cards; public Deck (in

我正在读一本关于java的书。它只是解释了如何创建一个名为“deck”的类,该类包含一个卡片数组作为其实例变量。以下是代码snippit:

class Deck { 
    Card[] cards; 
    public Deck (int n) { 
        cards = new Card[n]; 
    } 
} 
为什么不使用
这个。
命令

例如,为什么代码不是这样的:

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

这是隐式的。
是隐式的

一般来说,最好的做法(至少我认为只有一个)在绝对必要时只使用<代码> <<代码>。例如,当您有一个名为
cards
的局部变量和一个名为
cards
的成员变量时,您需要
this.cards
引用成员变量,因为
cards
引用局部变量

在这种情况下,
这是一个好主意(尽管重命名成员变量可能是更好的主意)


在其他任何情况下,如果隐式
this
可以工作,请使用它

在这种情况下,“this”关键字是多余的。卡片已经在类别范围内定义,并且编撰人知道该成员是“该”类别的一部分。

这是隐含的

让我们详细说明一下:

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

在这种情况下,您传入一个与对象的卡片数组同名的卡片数组<代码>此
引用对象的datamember,而不是构造函数的参数。

暗示“This”。没有必要使用“this”。我通常把它放在那里只是为了让代码可读,但也不是必需的。

因为没有歧义。只有一个
变量
如果有两个(一个是实例变量(当前是类的一部分),另一个是构造函数的参数,则需要此


顺便说一句,
这不是一个“命令”。它是一个“关键字”。

当您在构造函数中使用标识符
cards
时,编译器会注意到字段(也称为成员变量)
cards
在范围内,并使用它
this.cards
仅用于解决歧义,例如,如果您还有一个名为
cards
的局部变量或参数,那么如果您还有一个名为
cards
的参数,那么它就有意义了。然后,
this.cards
将指定您所指的是类的字段
cards
,而不是参数


但是无论如何,使用
这个是一个很好的实践。
在您的示例中所描述的情况下。

对象的
这个
引用是隐含的,但为了清晰起见,它可能是有用的(并且对于消除对象成员和同名局部变量之间的歧义是必要的,如下面的构造函数中所述):


您不需要使用
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'
   }
}

我尝试以不需要“this”关键字的方式选择变量名。也就是说,如果我有一个名为“value”的属性,我将传递给一个名为val的参数

“this”关键字的一个好用法是用于构造函数重载。考虑下面的内容(我将用这个来演示差异):


如果可能的话,我会尽量避免让属性和参数名相同,以避免第6行出现的情况。然而,使用此关键字调用另一个构造函数是防止代码重复的好方法。这是一个很小的例子,但是当你开始发现自己的构造函数做了很多相同的工作,但它们之间的差异很小时,它就非常方便了。

可以这样做。那么总是省略吗?或者你的意思是作者希望它在那里,但没有写它,因为它相对于读者是隐式的?@David:它总是可以省略的,除非你还有一个同名的局部变量(此时,
cards
本身就是局部变量而不是实例变量,您需要
this.cards
来显式引用实例)为什么只有在绝对必要的时候才使用它呢?因为它是隐含的,每个人都应该知道,它也是多余的;5个额外的字符丝毫不利于可读性。好吧,我认为…显然这是主观的。在第二个例子中你有一个错误。有2个<代码>。[< /代码>注:如果你想讨论是否使用或省略<代码>这是一个好主意。,那么还有很多其他的地方可以争论。例如,看这个问题:不,把视觉噪声添加到你的源代码不是好的做法。@ Bube:这取决于你问的是谁。有些人考虑使用<代码>。< /代码>好的做法,而其他人则不然。事实上,这不是一个好的做法,因为没有好的做法
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'
   }
}
public class Person
{
   int age;
   public Person(int age)
   {
      this.age=age;
   }
   public Person()
   {
      this(25); //default age
   }
}