2014-09-02 176 views
-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”?方法参数和实例变量名称相同的混淆

当方法遵循命名规则setProperty时,它们的行为是否像一个setter?

modifyName不工作,如果它被命名为setName它会工作吗?

+0

编译器不会查看方法名称,试图弄清楚你在做什么,即使它遵循JavaBean约定。你可以称它为'destroyName'或'reverseName',但它会做你告诉它在body,period中做的任何事情。 – ajb 2014-09-02 20:27:01

+3

请缩进您的代码!另外,当你运行它时发生了什么?最后,*我知道使用'这'会有帮助,但我不想*是为什么我们不能有好东西。 – 2014-09-02 20:29:41

回答

1

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

0

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

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

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

0

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

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

ASA结果,什么也不会改变

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

它打印“约翰”

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

如果您不想遵循Java代码样式标准,请使用inName,然后输入name = inName;或者其他。

相关问题