簡體   English   中英

如何從Java中的靜態內部類訪問外部類的私有成員

[英]How to access private members of outer class from static inner class in Java

public  class OuterClass extends Something{

    private int unit = 0;

    private void methodX(int num){
        //Do something here
    }

     public static class InnerClass extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {     

        // Need to call methodX(100) here       
        }
     }      
}

我正在創建一個應用程序,並且運行良好。 但是當我使用

static OuterClass instance;

在OuterClass中並通過以下方式訪問其變量

instance.methodX(100)

內部類導致內存泄漏。 如果我從內部類中刪除static關鍵字,則不會觸發廣播接收器。

這是清單文件的一部分。

<receiver
    android:name=".OuterClass$InnerClass"
    android:enabled="true"
    android:exported="true">
    <intent-filter >
        <action android:name="com.xyz.abc.RESULT"/>        
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

這按我預期的那樣工作,但是有一些內存泄漏。 我需要從靜態內部類訪問外部類方法而不會發生內存泄漏。為此,我應該避免使用外部類的靜態實例。

如果有人可以幫助我找到一種從內部類訪問externalClass methodX的方法,我將非常感激。

聲明靜態內部類與創建新文件類似,在術語上,您需要外部類的實例才能使其工作。

非靜態內部類的工作方式與非靜態字段類似:它們是特定於實例的。 意味着您需要一個outter對象的實例來初始化一個新的內部對象。

當它是靜態的時,您不需要outter類的對象即可工作。

對於非靜態內部類,您可以執行以下操作:

outter.new Inner()

並訪問其嵌套的類。

但是由於您的類是靜態的,因此您必須像平常一樣傳遞一個實例。

new Outter.Inner(outterInstance)

但是:由於該類擴展了BroadcastReceiver,因此它將初始化為一個空的構造函數。 意味着將不會使用帶有要傳遞的值的構造函數,因為BroadcastReceiver是系統初始化和處理的系統。 而是在空的構造函數中創建一個新實例,或將所有變量移至當前內部類中

由於BroadcastReceiver需要一個空的構造函數,因此不可能這樣做

public Inner(Outter instance)

它不會被初始化,您也可能會從中獲取異常。 但是,您可以這樣做:

public Inner(){
    outter = new Outter();
}

或者,將所有外部類字段和方法移到BroadcastReceiver中。

您應該閱讀有關主題的這篇SO帖子

您可以將該方法methodX()標記為static 之后,您將可以在您的static內部類中訪問該方法。

暫無
暫無

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

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