2013-05-16 26 views
6

最近,我觀察到訪問Java中priavte字段的意外行爲。請看下面的例子,它說明了行爲:爲什麼允許訪問另一個對象的私有字段?

public class A { 

    private int i; <-- private field! 

    public A(int i) { 
     this.i = i; 
    } 

    public void foo(A a) { 
     System.out.println(this.i); // 1. Accessing the own private field: good 
     System.out.println(a.i);  // 2. Accessing private field of another object! 
    } 

    public static void main(String[] args) { 
     (new A(5)).foo(new A(2)); 
    } 
} 

爲什麼允許我在foo方法(第二種情況)內訪問A類的其他對象的私有字段?

+0

請使用代碼格式設置代碼,輸入/輸出和結構化文檔,如HTML或XML。爲此,請選擇樣本並單擊郵件發佈/編輯表單上方的「{}」按鈕。 –

回答

13

私人領域保護一個類,而不是一個實例。主要目的是允許一個類獨立於其API實現。隔離它們之間的實例,或者保護實例的代碼與同一類的靜態代碼不會產生任何影響。

+3

社區wiki?這是先發制人的downvote盾? :) –

+0

@MarkoTopolnik號在實踐中,我甚至觀察到,當用戶看到用戶的照片時,他們更喜歡upvote。一個CW回答收集較少upvotes和較少接受(我不能肯定地說downvotes)。如果你認爲它不好,你可以修復它,但是。 –

+0

這是一個upvote盾imho :) –

3

這是因爲它們屬於同一類。這在Java中是允許的。

您將需要此訪問用於多種目的。例如,在等號的實現:

public class A { 
    private int i; 

    @override public boolean equals(Object obj){ 
    if(obj instanceof A){ 
     A a = (A) obj; 
     return a.i == this.i; // Accessing the private field 
    }else{ 
     return false 
    } 
    } 
} 
+0

你不一定需要它,但它使得訪問它不那麼冗長。 – NilsH

+0

是的,你可以做一個'obj.getI()',如果它定義了一個公共訪問器! – NINCOMPOOP

+0

@NoobUnChained:你所有的私人領域都有公共訪問者嗎?如果是封裝,封裝的意義何在? – Mohayemin

0

foo的方法屬於同一類一樣變量i存在允許這樣的訪問沒有壞處。

相關問題