2015-08-28 161 views
3

這是寫在JLS訪問(見8.3):私人領域是超

「超類的私有字段可能是訪問一個子類 - 例如,如果 兩個類的成員同一類。然而,私人領域永遠不會由一個子類繼承 。「

你可以給這個陳述的例子嗎?

我知道,我們可以這樣寫:

public class MyClass { 
    private int x = 1; 

    public void testExample(MyClass m) { 
     m.x = 2; 
    } 
} 

下面我們進入私人領域m.x但我們沒有「超班」 - 「子類」在這裏。

+1

另請參閱https://groups.google.com/d/msg/java-lang-fans/KVmmgeSCHkA/7nAQolGcsjwJ – ZhongYu

回答

3

這是談論嵌套類 - 這裏有一個例子:

public class Test { 
    public static void main(String[] args) { 
     new Subclass(10).foo(); 
    } 

    static class Superclass { 
     private int x; 

     Superclass(int x) { 
      this.x = x; 
     } 
    } 

    static class Subclass extends Superclass { 
     Subclass(int x) { 
      super(x); 
     } 

     public void foo() { 
      Superclass y = this; 
      System.out.println(y.x); 
     } 
    } 
} 

它是有效的,因爲JLS 6.6

否則,成員或構造函數聲明爲private,並允許訪問,當且僅如果它出現在包含成員或構造函數聲明的頂級類(§7.6)的主體內

這裏使用的xTest的身體,這是頂層類封閉的x的聲明中...但如果你嘗試使用x不合格的,或只是this.x,失敗......正是因爲x ISN」實際上繼承了(根據你引用的規範)。

+0

不是編譯錯誤 - 成員「this.x」不存在,因爲「x」不是遺傳。 – ZhongYu

+0

@ bayou.io:啊哈,很好的捕捉,以及一個很好的例子*完全*在問題中引用了什麼:) –

+0

謝謝喬恩,我認爲你是對的。這個問題是一個更常見規則的特例:所有嵌套類都可以訪問其他嵌套類的所有私有字段/方法 – Vitaly

0

方法「可見性」 - 顧名思義 - 關於方法和變量對程序員「可見」的地方。作爲一個通用契約,即使變量被聲明爲私有的,並且被該類的實例化對象(而非「this」)引用,類中定義的變量總是在類定義內可見。

有關可見性和封裝的規則在設計上是爲了幫助確保程序員不會意外地訪問會意外破壞功能的變量和方法。例如,你打破了java.util.Random是如何工作的,如果你要手動調用

private static long seedUniquifier() { 
    // L'Ecuyer, "Tables of Linear Congruential Generators of 
    // Different Sizes and Good Lattice Structure", 1999 
    for (;;) { 
     long current = seedUniquifier.get(); 
     long next = current * 181783497276652981L; 
     if (seedUniquifier.compareAndSet(current, next)) 
      return next; 
    } 
} 

(從Sun JDK源代碼源)

然而,碼範圍內接觸你寫的時候,一般認爲調用被定義爲該類的類型的對象上的私有變量/方法是可以的,因爲假定作爲相關代碼的程序員和編寫者,你擁有必要的權限,代理和專業知識正確管理代碼。

所以一般來說,不管變量是否被聲明爲private或沒有,下面的代碼:

public class Test { 
    private float internalValue; 
    public boolean isBigger(Test t) { 
     return internalValue > t.internalValue; 
    } 
} 

始終有效。

+0

您的示例正在聲明它的類的代碼*中訪問私有字段。我不相信這是OP所問的。 –