Java 为什么不是';";这一点;此构造函数中是否需要命令?(爪哇)
我正在读一本关于java的书。它只是解释了如何创建一个名为“deck”的类,该类包含一个卡片数组作为其实例变量。以下是代码snippit: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
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
}
}