2008-11-23 51 views
17

所以我做一個類有一天,使用Eclipse的方法來創建equals方法時,我意識到,它生成以下工作代碼:的Java私有字段能見度

class Test { 
    private int privateInt; 
    [...] 
    public boolean equals(Object obj) { 
    [...] 
    Test t = (Test) obj; 
    if (t.privateInt == privateInt) { 
    [...] 
    } 
} 

t.privateInt .. ????這是假設是私人的!所以我想除私人,保護,包裹保護和公開外,還有一個字段可見性。

那麼這裏發生了什麼?這是怎麼回事? 有人會用這個嗎?這不破壞封裝嗎?如果班級沒有增變器,我改變了這個呢?這是否也發生在C++上?這是一個面向對象的習語嗎?如果不是,那麼Java爲什麼要這樣做?

一般來說,我可以在哪裏找到關於此的信息?

謝謝。

回答

24

它可以從同一類的不同實例訪問。

根據this page(加粗礦):

在成員級別,你還可以使用公共改性劑或沒有修飾符(包私營)剛剛與頂級類,並用相同的含義。對於成員,還有兩個額外的訪問修飾符:private和protected。 私有修飾符指定成員只能在其自己的類中訪問。

爲清楚起見,我會改寫這一行:

if (t.privateInt == this.privateInt) 

我們都必須承認,「this.privateInt」應該被允許:你是從Test類的實例中訪問它的消息「等於」已發送至。

「t.privateInt」應該是可見的,因爲t是Test類的一個獨立實例,我們不在其equals方法中執行。然而,Java允許這樣做,因爲兩個對象(t和this)具有相同的類Test,並且可以看到每個其他私有成員。

+0

好的...我現在明白了...但爲什麼?爲什麼Java讓這種情況發生?你能想到一些真實生活的例子。我得到爲什麼它應該在等於..但是,必須有一個更好的例子.. – pek 2008-11-26 15:20:04

+0

唯一的其他例子將類似於等於你給你的類的另一個實例作爲參數。至於Java爲什麼這麼做,它在OO語言中是非常標準的 - C++的工作方式也是一樣的。在C++中重載==:http://artis.imag.fr/~Xavier.Decoret/resources/C++/operator.html – 2008-11-26 16:37:10

3

您正在同一個類中引用它。因此,你知道你在做什麼,不需要保護自己。

4

邁克的相當正確;你正混淆對象(類的實例)和類本身。該成員對類是私有的,而不是對該類的任何特定實例

我記得當我剛接觸Java時,對此感到驚訝。

1

可以訪問同一類的另一個實例的私有變量。這是因爲你正在直接處理類的實現,這需要你瞭解其內部的「私有」變量。

0

這個混淆的簡單答案是記住私人領域只是可見的,只在他們初始化(和定義)的類中。所以,當你在班級內製作一個類的對象時,你總是可以通過對象引用訪問該類的私有字段。也許你覺得它很困難,但只是認爲私人領域就像公共領域,當你在定義的類中使用它時。

3

允許訪問其他實例的私有成員的一個主要原因是允許「複製」功能 - 否則它們幾乎是不可能的。另外,如果你不允許其他實例訪問,你會允許什麼靜態方法?