2017-04-22 125 views
0

我剛剛遇到了一個代碼。在一種情況下,我無法使用它的實例訪問該類的私有成員(這很好),但在其他情況下,我可以以不同的實例訪問私有成員(屬於同一個類)。任何人都可以請解釋我爲什麼發生?從同一類的不同實例訪問私有方法

class Complex { 
    private double re, im; 
    public String toString() { 
     return "(" + re + " + " + im + "i)"; 
    } 
    Complex(){} 

/*Below c is different instance, still it can access re,im(has a private access) 
    without any error.why? */ 

    Complex(Complex c) { 
     re = c.re; 
     im = c.im; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Complex c1 = new Complex(); 
     Complex c2 = new Complex(c1); 
     System.out.println(c1.re); /* But getting an error here , 
     which is expected as re and im has a private access in Complex class.*/ 
    } 
} 
+2

因爲這就是Java的工作原理?「否則,成員或構造函數被聲明爲private,並且只有當它出現在包含成員或構造函數聲明的頂級類(§7.6)的主體內時才允許訪問。」 (JLS 6.6.1)訪問控制是按類而不是Java實現的。 (無可否認,在這方面保護起來有點棘手。) –

回答

0

您可以從訪問私有成員在同一類定義的任何代碼塊。不管實例是什麼,或者即使有任何實例(代碼塊處於靜態上下文中)。

但是,您無法通過不同類別中定義的代碼訪問它們。

你的第一個參考是同一個班級,Complex,這就是它工作的原因。第二個是不同的課程,Main,這就是爲什麼它不起作用。

0

原因是類Main無法訪問其他類的私人字段。在這種情況下,Complex類的私人領域。
只能使用此類中的方法訪問Complex類中的私有字段。換句話說,如果您將main方法移動到Complex類,代碼將被編譯。
如果您想從Main(或其他類)獲得Complex類中的值,請在Complex類中添加setter/getters。

0

下面是表說明訪問修飾符:

enter image description here

正如你所看到的,private行中,一切都是除了列ClassN。這意味着只要您在宣佈的同一班級中訪問私人成員,就可以訪問私人成員。您甚至可以使用實例訪問同一類中的靜態上下文中的私有非靜態成員。沒有訪問修飾符只允許來自同一實例的訪問。

爲什麼?

因爲在編譯時確定thisc是否是相同的實例是一個痛苦。你必須真正運行代碼來查看它們是否指向同一個實例。

0

概念上,訪問說明符是@ class級別,而不是@ instance級別。

以下可能是在@ class級別保持訪問說明符的原因。 從JLS Documentation,我們可以清楚地看到,訪問是基於合同實施(或使用類/包)的用戶。簡而言之,作爲一名開發者(用戶),我所關心的是成員(變量,方法)的可用性以及他們做了什麼,我如何使用它們(抽象概念的基礎)。

就你而言,它是同一個類,它具有訪問其成員以及觀察行爲的所有特權。

相關問題