簡體   English   中英

從同一類的不同實例訪問私有方法

[英]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。

下表說明了訪問修飾符:

在此處輸入圖片說明

如您所見,在private行中,除列Class之外,其他所有內容均為N 這意味着您可以訪問私有成員,只要您在聲明它們的同一類中訪問它們即可。 您甚至可以使用實例從同一類中的靜態上下文訪問私有非靜態成員。 沒有訪問修飾符,僅允許來自同一實例的訪問。

為什么?

因為弄清楚在編譯時thisc是否是相同的實例很麻煩。 您必須實際運行代碼以查看它們是否引用相同的實例。

從概念上講,訪問說明符是@類級別,而不是@實例級別。

以下可能是在類級別保留訪問說明符的原因。 JLS文檔中 ,我們可以清楚地看到該訪問權限是針對正在根據合同實現(或使用類/包)的用戶的。

簡而言之,作為開發人員(用戶),我所關心的是有哪些可用的成員(變量,方法)以及它們的作用,如何使用它們(抽象概念的基礎)。

在您的情況下,它是同一類,並且具有訪問其成員的所有特權,因此也具有觀察到的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM