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