2014-09-02 130 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;或者其他。

相關問題