2011-05-12 122 views
4

Java中的私有成員是否與其他編程語言私有成員不同?因爲我很驚訝我只能將某種類型的對象傳遞給compareTo,然後訪問該對象的私有成員而不使用任何getMethod。Java中的私人成員

E.g.

public class Foo implements Comparable<Foo>{ 

    private int bar; 

    public Foo() { bar = 1; } 

    public int compareTo(Foo o) { 
     if(bar == o.bar) 
      return 0; 
     return 1; 
    } 
} 
+0

在Smalltalk中,私有的邊界不是類,而是對象(如預期的那樣)。 – scravy 2012-06-20 21:26:13

回答

3

即使我爲Java生活11年,當我在兩年前發現這個事實時,我嚇了一跳。我以前一定讀過它,但不知怎的,它從來沒有沉入其中。我同意這個看起來很奇怪,但是當你考慮一下它時,它會變得非常有意義。

什麼是OO?關於問題和信息隱藏的分離,對嗎?因此,在你的設計中,你總是(應該)儘量避免在你自己關心的事情之外「知道」事情,因爲這等於做出了假設;在設計時你所「知道」的事情可能會在以後發生變化,並使你的班級正在制定的假設無效。

在這種情況下,您允許Foo訪問另一個Foo的私人酒吧,這個酒吧最初感覺就像「知道」Foo關注的事情。但是因爲我們正在談論兩個完全相同的類(Foo),所以這實際上並不在我們的擔憂之外!例如,如果我們將bar從int更改爲double,我們在同一個類中這樣做,並且任何編譯錯誤都會立即顯示出來。

此外,想象這種訪問被禁止。那麼,如果Foo稱自己的compareTo,傳遞'this'作爲參數呢?那麼我們將不得不禁止Foo訪問它自己的私人酒吧?那麼私人靜態字段呢?這會很混亂,你不同意嗎?

也許有點囉嗦,但我希望你能體會到第一次震動後,這實際上是有道理的! ( - :

10

是,在Java中的私有成員來自不同一些其他語言。例如,我不認爲認爲在C++中的等效代碼將是有效的。

另一方面,它將在C#中有效。在從封閉或嵌套類訪問私有成員方面,C#和Java之間仍然存在一些差異,但它們基本上是相似的。

你不應該期望任何兩種語言具有相同的行爲。值得諮詢你真正感興趣的語言規範 - 在這種情況下,它是section 6.6 of the JLS

+0

不,但它有點粉碎有私有變量的想法,不是嗎? – starcorn 2011-05-12 08:25:18

+1

@starcom,爲什麼?我想,你有一間私人臥室,然而那種混亂並不意味着你必須睡在地板上。這隻意味着沒有人可以在那裏睡覺。 – Ingo 2011-05-12 08:27:15

+1

那麼,'private'具有詞法範圍,不是動態的。這是一個定義和實施的問題。 – musiKk 2011-05-12 08:27:38

1

在Java中,作用域基於類而不是對象。如果某些內容是私有的,則意味着它對該類中定義的代碼可見 - 即使它是實例的字段,並且代碼正在另一個實例中執行。

你也許可以將同一班級的對象想象成雙胞胎一樣彼此分享一切,但是誰又會將大多數事物都隱藏起來。

1

我可以只通過一些 類型的對象的compareTo

你沒你通過Foo類型的對象的compareTo()的Java的允許訪問的規則。到Foo類中的任何Foo的成員,C++更具限制性,因爲您只能訪問您自己的 Foo的私有成員。