-2
    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”?

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

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

4

6 回答 6

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;
}
于 2014-09-02T20:27:37.850 回答
1

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

于 2014-09-02T20:51:51.190 回答
0

它打印“约翰”

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

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

于 2014-09-02T20:42:02.470 回答
0

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

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

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

于 2014-09-02T20:13:54.710 回答
0

如果您不使用this实例变量。然后,您只是在以下语句中使用方法变量:

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

结果,什么都不会改变

于 2014-09-02T20:14:17.993 回答
0

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

于 2014-09-02T20:25:00.633 回答