Java this.classProperty与classProperty在参数变量名冲突的情况下?

Java this.classProperty与classProperty在参数变量名冲突的情况下?,java,Java,如果第一个构造函数没有这个,有人能解释输出0吗 如果参数变量名与类属性名相同,并且我正在方法中使用该属性。java如何解释该类属性或参数变量 没有这一点: 为此: //0没有这个 //用这个 如果第一个构造函数没有这个,有人能解释输出0吗 当然-此声明是不可操作的: userId = userId; 它只是将userId参数的变量分配给它自己。它一点也不触地。在该方法中,参数userId隐藏了名为userId的字段,因此您必须明确表示希望引用该字段,这是第二个版本所做的: this.userI

如果第一个构造函数没有这个,有人能解释输出0吗

如果参数变量名与类属性名相同,并且我正在方法中使用该属性。java如何解释该类属性或参数变量

没有这一点:

为此:

//0没有这个

//用这个

如果第一个构造函数没有这个,有人能解释输出0吗

当然-此声明是不可操作的:

userId = userId;
它只是将userId参数的变量分配给它自己。它一点也不触地。在该方法中,参数userId隐藏了名为userId的字段,因此您必须明确表示希望引用该字段,这是第二个版本所做的:

this.userId = userId;
我希望任何现代IDE在第一个版本中都会突出显示无操作分配,并带有警告

顺便说一句,术语是值得一提的——参数是提供给方法的值;参数是作为方法签名的一部分声明的变量。同样,它是一个字段而不是属性

编辑:如果参数具有不同的名称,例如

public User(int id) {
    userId = id;
}
然后,参数不会对字段进行阴影处理,标识符userId仍然引用该字段。这完全是一个确定标识符含义的问题——在第一个示例中,简单的名称userId指的是参数,这就是问题的原因

编辑:来自:

某些声明可能在其部分范围内被另一个同名声明所掩盖,在这种情况下,不能使用简单名称来引用已声明的实体

一个名为n的字段或形式参数的声明d在d的整个范围内,隐藏了在d出现点的范围内任何其他名为n的变量的声明

因此,在本例中,d将是形式参数userId的声明,d的作用域是构造函数-因此通过构造函数,参数将隐藏字段

如果第一个构造函数没有这个,有人能解释输出0吗

当然-此声明是不可操作的:

userId = userId;
它只是将userId参数的变量分配给它自己。它一点也不触地。在该方法中,参数userId隐藏了名为userId的字段,因此您必须明确表示希望引用该字段,这是第二个版本所做的:

this.userId = userId;
我希望任何现代IDE在第一个版本中都会突出显示无操作分配,并带有警告

顺便说一句,术语是值得一提的——参数是提供给方法的值;参数是作为方法签名的一部分声明的变量。同样,它是一个字段而不是属性

编辑:如果参数具有不同的名称,例如

public User(int id) {
    userId = id;
}
然后,参数不会对字段进行阴影处理,标识符userId仍然引用该字段。这完全是一个确定标识符含义的问题——在第一个示例中,简单的名称userId指的是参数,这就是问题的原因

编辑:来自:

某些声明可能在其部分范围内被另一个同名声明所掩盖,在这种情况下,不能使用简单名称来引用已声明的实体

一个名为n的字段或形式参数的声明d在d的整个范围内,隐藏了在d出现点的范围内任何其他名为n的变量的声明

因此,在本例中,d将是形式参数userId的声明,d的作用域是构造函数-因此通过构造函数,参数将隐藏字段。

这是因为

您没有将参数值userId分配给成员变量,因为它被隐藏。因为int成员变量被初始化为0,所以您会看到没有this关键字的输出。

这是因为


您没有将参数值userId分配给成员变量,因为它被隐藏。因为int成员变量被初始化为0,所以您会看到没有this关键字的输出。

谢谢,但如果我使用public Userint Id{userId=Id;},它会更新类属性。@talktopk:Yes,因为在这种情况下,参数不会对字段进行阴影处理。所以我想在发生冲突的情况下会有一个首选项。@JonSkeet我正要对Sun/Oracle使用隐藏与阴影进行评论,但您已经编辑了您的答案:@milkPlusvelocet:是的,我以前没有详细查看过。现在也变得模糊了……谢谢,但是如果我使用公共Userint Id{userId=Id;},它会更新类属性。@talktopk:是的,因为在这种情况下,参数不会对字段进行阴影处理。所以我想在冲突情况下会有一个首选项。@JonSkeet我正要评论Sun/Oracle使用隐藏vs shadowin
但是你已经编辑了你的答案:@milkplusvellocet:是的,我以前没有详细看过。现在也变得模糊了。。。