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


    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

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

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

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

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;
}

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

如果您不使用实例变量this。那么你只是在下面的语句中玩弄方法变量:

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

结果,什么都不会改变

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

方法modifyName不能仅仅因为命名

对流而成为setter吗?modifyName((仅仅因为不使用JavaBean命名约定而将name视为方法参数?

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

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

它打印"John">

说你不想用"这个"是荒谬的。它几乎不需要任何努力来键入,并且大大提高了代码质量。

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

相关内容

  • 没有找到相关文章

最新更新