混淆方法参数和具有相同名称的实例变量

时间:2014-09-02 20:12:12

标签: java methods instance-variables method-parameters

    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

,是否有效?

6 个答案:

答案 0 :(得分:2)

要直接回答您的问题,没有该方法的命名约定不会使其充当设置者

如果是这种情况,则不需要方法体。

public void setName(String name) {
}

的行为与

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

根本不是这样。

您的特定方法无效的原因是由于声明:

  

//我知道使用'这个'会有所帮助,但我不想

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

  

方法modifyName是否因为命名对话而不能成为setter? modifyName()仅仅因为不使用JavaBean命名约定而将name视为方法参数?

该行为与方法的命名约定无关。如果将其更改为setName,它的行为将相同。唯一能产生影响的是改变参数名称或实例成员名称,使它们不同。

答案 3 :(得分:0)

如果您不使用this作为实例变量。然后你只是在下面的语句中使用方法变量:

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

结果,什么都不会改变

答案 4 :(得分:0)

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

答案 5 :(得分:0)

打印“John”

说你不想用“这个”。只是荒谬。输入并大大提高代码质量几乎不需要任何努力。

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