![](/img/trans.png)
[英]Java: Accessing private fields directly from another instance of the same class
[英]Accessing private method from different instance of the same class
我只是遇到了一個代碼。在一種情況下,我無法使用其實例訪問該類的私有成員(這很好),但在另一種情況下,我能夠使用其不同的實例訪問該私有成員(屬於同班)。 誰能解釋一下為什么會這樣?
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.*/
}
}
您可以從同一類中定義的任何代碼塊中訪問私有成員。 實例是什么,或者是否存在任何實例(代碼塊在靜態上下文中)都沒有關系。
但是您不能從不同類中定義的代碼訪問它們。
您的第一個參考文獻是在同一類Complex
,這就是為什么它起作用的原因。 第二個是在另一個類Main
,這就是為什么它不起作用的原因。
原因是類Main
無法訪問其他類的私有字段。 在這種情況下,可以使用Complex
類的私有字段。
您只能從此類中的方法訪問Complex
類中的私有字段。 換句話說,如果將main
方法移至Complex
類,則將編譯代碼。
如果要從Main
(或其他類)獲取/設置Complex
類中的值,則應在Complex
類中添加setter / getter。
從概念上講,訪問說明符是@類級別,而不是@實例級別。
以下可能是在類級別保留訪問說明符的原因。 從JLS文檔中 ,我們可以清楚地看到該訪問權限是針對正在根據合同實現(或使用類/包)的用戶的。
簡而言之,作為開發人員(用戶),我所關心的是有哪些可用的成員(變量,方法)以及它們的作用,如何使用它們(抽象概念的基礎)。
在您的情況下,它是同一類,並且具有訪問其成員的所有特權,因此也具有觀察到的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.