Java 类的字段和方法的参数会相互干扰吗?

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方法

我有一个名为“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方法)变量,这些变量的名称与字段的名称一致。如果我在方法(字段或局部变量)中引用这样一个方法局部变量,“看到”该方法是什么?

局部范围越大,优先级越高,因此参数
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推荐其他内容,而不是像其他人一样编写几乎重复的答案