Java 类的字段和方法的参数会相互干扰吗?
我有一个名为“a”的字段的类。在类中我有一个方法,在这个方法的参数列表中我也有一个“a”。那么,我将在方法内部看到哪个“a”?它是字段还是方法的参数Java 类的字段和方法的参数会相互干扰吗?,java,concurrency,methods,field,visibility,Java,Concurrency,Methods,Field,Visibility,我有一个名为“a”的字段的类。在类中我有一个方法,在这个方法的参数列表中我也有一个“a”。那么,我将在方法内部看到哪个“a”?它是字段还是方法的参数 public class myClass { private String a; // Method which sets the value of the field "a". public void setA(String a) { a = a; } } 顺便说一下,也有类似的情况。方法有一些局部(for方法
public class myClass {
private String a;
// Method which sets the value of the field "a".
public void setA(String a) {
a = a;
}
}
顺便说一下,也有类似的情况。方法有一些局部(for方法)变量,这些变量的名称与字段的名称一致。如果我在方法(字段或局部变量)中引用这样一个方法局部变量,“看到”该方法是什么?局部范围越大,优先级越高,因此参数
a
将隐藏字段a
。实际上,您将参数a
的值设置为自身。避免名称冲突(并提高可读性)的正确习惯用法是使用this
显式标记类成员:
public void setA(String a) {
this.a = a;
}
局部变量与成员变量的情况也是如此:局部变量隐藏具有相同名称的成员变量。最接近的一个。就是
a = a;
在方法内部没有效果,因为两者都引用参数a。要引用实例变量a,请使用this关键字
this.a = a;
本地版本将以相同的名称“隐藏”实例变量。在您的访问器中,有一种模式可以解决此问题:
public void setA(String a) {
this.a = a;
}
它使用
this
关键字来明确范围。您需要使用this
来访问类
变量,否则它将始终使用参数变量。要添加到所有答案中,建议:
public void setA(String a) {
this.a = a;
}
重要的是要认识到,省略this
只会将参数设置为自身。通过使用final
public void setA(final String a) {
this.a = a;
}
您可以消除由于忽略此而导致的错误。无论何时指定无意更改的参数和字段,使用
final
都是一种很好的做法。Cool!我没有想到这个的用法。我认为我需要重命名方法的参数。但是现在我认为这个提供了一个更优雅的解决方案。谢谢。在处理内部类时,您可以使用myClass.this.a
引用myClass
实例。+1推荐其他内容,而不是像其他人一样编写几乎重复的答案