【问题标题】:Confusion over method parameter and instance variable having same name混淆方法参数和实例变量同名
【发布时间】:2014-10-27 04:52:02
【问题描述】:
    class Employee {
       public String name = "John";
       public void modifyName(String name)
       {
          name = name;     // I know using 'this' would be helpful, but I dont want to
       }
       System.out.println(name);
    }

     class Someclass {
         public static void main(String[] args)
         {
            Employee e1 = new Employee();
            System.out.println(e1.modifyName("Dave"));
            System.out.println(e1.name);  // Does this outputs John or Dave?
         }
     }

方法 modifyName 的行为是否类似于 setter 并将实例变量名称更改为“Dave”?

方法是否仅在遵循命名约定 setProperty 时才表现得像 setter?

modifyName 不起作用,如果命名为setName 会起作用吗?

【问题讨论】:

  • 编译器不会查看方法名称来试图找出您在做什么,即使它遵循 JavaBean 约定。你可以称它为destroyNamereverseName,但它会做任何你告诉它在体内做的事情,期间。
  • 请缩进你的代码!另外,你运行它时发生了什么?最后,我知道使用 'this' 会有所帮助,但我不想这样做是我们不能拥有美好事物的原因。

标签: java methods instance-variables method-parameters


【解决方案1】:

在方法中,方法参数优先于实例变量。方法 modifyName 指的是方法参数名,而不是实例变量名。

【讨论】:

    【解决方案2】:

    为了直接回答您的问题,方法的命名约定不会导致它充当 setter

    如果是这样,就不需要方法体了。

    public void setName(String name) {
    }
    

    行为与

    相同
    public void setName(String name) {
        this.name = "I don't care what name you gave";
    }
    

    事实并非如此。

    您的特定方法不起作用的原因是由于以下声明:

    // 我知道使用“this”会有所帮助,但我不想这样做

    之所以使用this.name,是为了区分方法参数和实例成员。实例成员被参数遮蔽,因此如果没有this.name,您只是用自身覆盖方法参数。

    如果您出于任何(愚蠢的)原因绝对拒绝使用this.name,那么您应该更改参数的名称:

    public void modifyName(String iHateUsingThis) {
        name = iHateUsingThis;
    }
    

    【讨论】:

      【解决方案3】:

      它打印出“约翰”

      说您不想使用“this”。只是荒谬。打字几乎不费吹灰之力,大大提高了代码质量。

      如果您不想遵循 Java 代码样式标准,请使用 inName 然后 name = inName;或类似的东西。

      【讨论】:

        【解决方案4】:

        在方法块中将使用局部变量(如果名称与全局变量的名称相同)。因此,全局变量不会发生变化。这就是为什么这里必须使用 this 运算符来访问全局变量的原因。

        【讨论】:

          【解决方案5】:

          modifyName 中,name 参数将隐藏实例成员,因此不会设置实例成员(e1.modifyName("Dave") 不会改变任何内容)。您应该写 this.name = name; 或为实例成员使用不同的名称。

          方法 modifyName 不能仅仅因为命名约定而成为 setter 吗? modifyName() 仅仅因为没有使用 JavaBean 命名约定而把 name 当作方法参数?

          该行为与方法的命名约定无关。如果将其更改为 setName,它的行为将相同。唯一会有所不同的是更改参数名称或实例成员名称,以使它们不同。

          【讨论】:

            【解决方案6】:

            如果您不使用 this 作为实例变量。那么你只是在以下语句中使用方法变量:

                  name = name;     // I know using 'this' would be helpful, but I dont want to
            

            结果,什么都不会改变

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-01
              • 1970-01-01
              • 2011-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-07
              相关资源
              最近更新 更多