为什么不是“这个”。这个构造函数需要命令? (Java)的

时间:2010-03-22 18:35:54

标签: java constructor class

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

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];
    }
}

10 个答案:

答案 0 :(得分:20)

因为没有歧义。只有一个cards变量。如果有两个 - 其中一个是实例变量(类的一部分,就像它当前那样),另一个 - 构造函数的参数,则需要this

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

答案 1 :(得分:12)

this.是隐含的。

一般情况下,在绝对必要时仅使用this是最佳做法(至少认为是一个)。例如,当您有一个名为cards的局部变量和一个名为cards的成员变量时,您需要this.cards来引用成员变量,因为cards指的是局部变量。

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

在其他情况下,隐式this可以使用,使用它。

答案 2 :(得分: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'
   }
}

答案 3 :(得分:4)

隐含了对象的this引用,但为了清晰起见它是有用的(并且必须在对象的成员和同名的局部变量之间进行消歧,如下面的构造函数中所示):

   public class Foo {
       final private int x;

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

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

答案 4 :(得分:3)

当您在构造函数中使用标识符cards时,编译器会注意到该字段(a.k.a.成员变量)cards在范围内,并使用它。 this.cards仅用于解决歧义,例如,如果您还有一个名为cards的局部变量或参数。

答案 5 :(得分:3)

如果您还有一个名为cards的参数,那将是有意义的。然后,this.cards将指定您的类恰好是字段cards,而不是参数。

但无论如何,在你的例子中描述的情况下使用this.是一个好习惯。

答案 6 :(得分:2)

This是隐含的。

让我们详细说明:

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

在这种情况下,您传入一组卡片,这些卡片与对象的卡片阵列具有相同的名称。 This指的是对象的datamember,而不是构造函数的参数。

答案 7 :(得分:1)

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

答案 8 :(得分:0)

“这个”是隐含的。没有必要使用“这个”。我通常把它放在那里只是为了使代码可读,但同样不需要它。

答案 9 :(得分: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关键字调用另一个构造函数是防止代码重复的好方法。这是一个微不足道的例子,但当你开始发现自己的构造函数做了大量相同的工作时,它们之间的差异很小,它就非常方便。