2013-01-21 100 views
3

我對教程有點誤解。這裏是從它削減:當「return x」被允許時,爲什麼必須使用「this.x = x」?

public class Test { 
    private int id; 

    public int getId() { 
    return id; 
    } 
    public void setId(int id) { 
    this.id = id; 
    } 
} 

無論如何,我不能理解的是如何引用id。例如,我可以看到,在getId方法中,我可以直接訪問以前定義的ID,只是說返回ID。但在setId方法中,先前定義的id被稱爲this.id,而方法參數是id。

現在,如果在get方法中會出現「return this.id」,那麼我會理解所有的東西。但目前我感到困惑。我假設,如果我會在集合方法中返回id,我會返回參數,而不是類定義的id。 所以最後,類定義的id可以通過只輸入「id」來接受,除非有一個參數傳遞給同一個名字?這聽起來有點奇怪,我錯過了什麼?

+1

'所以最後,類定義的id可以通過輸入「id」來接受,除非有一個參數傳遞給同一個名字?這聽起來有點奇怪,我錯過了什麼?「其實聽起來像你已經理解了。第二個'id'不一定是一個參數,它也可以是一個局部變量。 (在setId方法中聲明爲int id;) –

回答

5

在Java中,在正常情況下,類內部的this是可選的。任何屬性都可以用或不用this來引用。

當你有一個參數或一個局部變量具有相同的名稱時,模糊性使得必須寫入this

這叫做「shadowing」。據說局部變量正在隱藏屬性。

當你編寫id時,對Java的最合理的猜測是你的意思是最本地的引用,它是參數名稱而不是屬性。要覆蓋此行爲,您必須澄清您願意訪問this.id,這意味着該屬性,而不是本地變量。

希望把事情弄清楚!

1

你可以把this.id放在getId方法中,它仍然可以工作。實際上它是這樣說的。這將編譯和完全有效:

private int id; 

public int getId() { 
    return this.id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
+0

當你說「其他人」時,它聽起來像可能意味着「另一個對象」(或「另一個寵物所有者」),儘管你正確地使用這個.id'。然而,爲了讓事情變得更糟,如果有一個帶有參數「Test anotherTest」的方法,你可以直接使用anotherTest.id,而不必使用getter。 (還有你的「別人」 - 對象 - 在這種情況下,簡單地使用「id」將意味着「this.id」,除非該名稱的*局部變量/參數*存在。) –

+0

是的,我想你是對。我會刪除我的答案的第二部分 –

2
this.id = id; 

問題是你也有相同名稱的局部變量。因此,您不能直接訪問類成員,因爲id將引用局部變量。這就是爲什麼需要this來在這裏訪問類成員變量。

您可以通過更改名稱來改寫如下,現在不需要this了。

public void setId(int locID) { 
    id = locID; 
} 
-3

如果您已經從測試類中創建對象,並您試圖訪問id 這樣的:

int test; 
test=TestObject.id; 

你會得到錯誤,因爲id是私有的,所以你必須說

test=TestObject.getid(); 

現在getid()將返回給我們的私人id我們可以稱它爲公開的方法

+0

這不是問題所在。 –