2009-06-10 23 views
3

我正在學習Java,而我正在閱讀的這本書有以下克隆示例。在clone()中,我的第一個實例能夠在新對象上設置緩衝區,即使緩衝區爲private。它似乎應該需要該字段爲protected才能正常工作。爲什麼克隆可能會在另一個對象上設置私有字段?

爲什麼允許這樣做? clone()是否有特殊權限允許它訪問private字段?

public class IntegerStack implements Cloneable { 
    private int[] buffer; 
    private int top; 

    // ... code omitted ... 

    @Override 
    public IntegerStack clone() { 
     try{ 
      IntegerStack nObj = (IntegerStack) super.clone(); 
      nObj.buffer = buffer.clone(); 
      return nObj; 
     } catch (CloneNotSupportedException e) 
     { 
      throw new InternalError(e.toString()); 
     } 
    } 
} 

回答

15

private修飾符並不意味着只有相同的實例才能訪問該字段;這意味着只有同一類的對象才能訪問它。

Java Language Specification說,在§6.6, Access Control

...如果成員或構造函數聲明爲private,則允許訪問,當且僅當它的頂層類(§7.6)的身體包圍內發生成員或構造函數的聲明。

換句話說,類裏的任何東西可以隨時訪問它。甚至嵌套類也可以訪問private成員和封閉類中的構造函數,反之亦然。

(你不是一個人在誤解它;檢查出this much-upvoted answer to "What is your longest-held programming assumption that turned out to be incorrect?

+0

謝謝!我也知道PHP,所以我已經驗證了PHP的private版本實際上是以相同的方式工作的。 – 2009-06-10 15:28:49