【问题标题】:Can fields of the class and arguments of the method interfere?类的字段和方法的参数可以干扰吗?
【发布时间】:2011-01-27 09:41:56
【问题描述】:

我有一个名为“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;
   }
}

顺便说一句,也有类似的情况。方法有一些局部(用于方法)变量,其名称与字段名称一致。如果我在方法中引用这样的方法局部变量(字段或局部变量),“看到”的方法会是什么?

【问题讨论】:

    标签: java concurrency methods field visibility


    【解决方案1】:

    更多的本地范围优先,所以参数a会隐藏字段a。实际上,您将参数a 的值设置为自身。避免名称冲突(并提高可读性)的正确习惯用法是使用this 显式标记类成员:

    public void setA(String a) {
      this.a = a;
    }
    

    局部变量VS成员变量也是一样:局部变量隐藏同名成员变量。

    【讨论】:

    • 在使用内部类时,您可以使用myClass.this.a 来引用myClass 实例。
    【解决方案2】:

    要添加到所有推荐的答案:

    public void setA(String a) {
       this.a = a;
    }
    

    重要的是要意识到省略this 只会将参数设置为自身。通过这样使用final

    public void setA(final String a) {
       this.a = a;
    }
    

    您可以消除因省略this 而导致的错误。每当指定不需要更改的参数和字段时,使用final 是一种很好的做法。

    【讨论】:

    • +1 用于推荐额外的东西,而不是像其他人一样写几乎重复的答案
    【解决方案3】:

    最近的一个。也就是说,

     a = a;
    

    在方法内部没有任何作用,因为两者都引用了参数 a。要引用实例变量 a,请使用 this 关键字。

     this.a = a;
    

    【讨论】:

    • 酷!我没有考虑this的用法。我虽然我需要重命名该方法的参数。但现在我认为this 提供了一个更优雅的解决方案。谢谢。
    【解决方案4】:

    本地版本将“隐藏”同名的实例变量。在像您这样的访问器中解决此问题的一种模式是:

    public void setA(String a) {
       this.a = a;
    }
    

    它使用this 关键字来明确范围。

    【讨论】:

      【解决方案5】:

      你需要使用this来访问class变量,否则总是取参数变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-15
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 2010-09-10
        • 2013-06-27
        相关资源
        最近更新 更多