java - 在Java中,如何從 static 內部類訪問外部類的private 成員

  显示原文与译文双语对照的内容
70 4
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 關鍵字未觸發。

這是我的Manifest 文件的一部分。

<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>

這工作正常,但它有一些內存泄漏。不需要使用外部類的static 實例,就需要從 static 內部類訪問外部類方法,而沒有內存 leak.for 。

如果有人可以幫助我從內部類訪問 outerClass methodX,我真的很感激。

时间:原作者:0个回答

62 2

你可以將該方法標記為 methodX()之後,你將能夠在 static 內部類中訪問該方法。

原作者:
122 0

聲明一個 static 內部類類似於創建一個新文件,在這個術語中,需要一個outter類實例來工作。

非靜態內部類的工作方式類似於非靜態欄位:它們是特定實例。意味著需要outter對象的實例來初始化新的內部對象。

當它是 static 時,你不需要outter類的對象來工作。

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

outter.new Inner()

並訪問嵌套在其中的類。

但是由於類是 static,所以你必須通過像正常一樣的實例。I.e.

new Outter.Inner(outterInstance)

然而,: 類擴展BroadcastReceiver之後,它初始化為一個空的構造函數。因為BroadcastReceiver是系統初始化和處理的系統,所以使用值的構造函數將永遠不會被使用。在空構造函數中創建一個新實例,或者將所有的變數移到當前的內部類中

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

public Inner(Outter instance)

它不會被初始化,你可能會從它得到異常。但是,你可以這樣做:

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

或者,將所有的outter類域和方法移到BroadcastReceiver中。

你應該把這篇文章寫在主題欄上。

原作者:
...