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; 或类似的东西。