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