2013-08-05 130 views
1

我想從Ivor Horton的Java書中通過一個簡單的類實現一個二維點的以下代碼。現在私人訪問修飾符的澄清

public class Point 
{ 
    //x and y coordinates 
    private xVal,yVal; 
    //Constructor 
    public Point (double x, double y) 
    { 
    this.xVal = x; 
    this.yVal = y; 
    } 
    //Constructor 
    public Point (final Point aPoint) 
    { 
    this.xVal = aPoint.xVal; 
    this.yVal = aPoint.yVal; 

    } 

} 

,我不明白的一點是,在第二個構造這需要Point類型作爲參數的對象,新創建的Point對象可以直接訪問參數點對象的實例變量x和y 。這意味着對象的私有成員(方法和變量)可以從相同類型的另一個對象的內部方法中訪問,除了同一類中的方法之外。任何人都可以澄清這個問題,因爲根據我的理解,應該通過getter和setter來訪問arugment對象的變量,因爲它們是私有的。

+0

http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private – Sikorski

+1

你通常不應該修改'Point'的其他實例,因爲這是可能不是你的實例的責任,但由於任何訪問發生在某個'Point'內部,假定每個實例知道如何處理其他實例而不破壞封裝。畢竟你寫了這個課,所以你應該知道你做了什麼。 – zapl

回答

3

這是常見的誤解,即專用字段只能由同一實例訪問。

實際上,私有字段在該類中是私有的,而不是實例。因此,該類的任何實例都可以在該類中訪問私有字段。

JLS - Section 6.6.1

否則,如果成員或構造被聲明私人,然後訪問被許可,如果且僅當頂層類的主體內發生它(第7.6節),其包圍成員或構造函數的聲明。

強調我的。

+0

這正是我在編譯時沒有錯誤時推導出的結果。感謝您的澄清。 – user1107888

+0

@ user1107888。不客氣:) –

0

首先出現在代碼中的錯誤。 應該是:

public class Point 
{ 
    //x and y coordinates 
    private xVal,yVal; 
    //Constructor 
    public Point (double x, double y) 
    { 
    this.xVal = x; 
    this.yVal = y; 
    } 
    //Constructor 
    public Point (final Point aPoint) 
    { 
    this.xVal = aPoint.xVal; 
    this.yVal = aPoint.yVal; 
    } 
} 

注二等C'tor的aPoint變量。

其次,private意味着私有的類。不是這個例子。 因此,該類的其他實例可以訪問私有成員/方法。

+0

我糾正了錯誤 – user1107888

0

javadocs

私人修飾符指定了成員只能在 自己的類來訪問

您可以隨時訪問類的任何地方,包括構造函數中的類的私有成員。

0

這意味着對象 的私有成員(方法和變量)可以由相同類型的

對,這是正確的另一個對象的內部方法進行訪問。 「私人」訪問修飾符在文件級別上工作。

這意味着如果一個類是另一個類的嵌套(靜態或非靜態),本地或匿名類,並且如果您有一個有效的另一個類的對象引用(顯式或隱式)。這適用於兩個方向(外部< - >內部)。

0

請注意,訪問限制的目的是明確代碼部分之間的耦合範圍和範圍。

由此看來,類/實例的私人成員應該可以被該類—聲明所包含的所有代碼訪問,事實上他們也是如此。