java內部類實現(可能導致記憶體洩漏)
阿新 • • 發佈:2018-12-12
在使用java內部類的時候要注意可能引起的記憶體洩漏 程式碼如下
package com.example;
public class MyClass {
public static void main(String[] args) throws Throwable {
}
public class A{
public void methed1(){
}
}
public static class B{
public void methed1(){
}
}
編譯生成了如下檔案
反編譯MyClass
反編譯MyClass$A
反編譯MyClass$B
從反編譯的結果可以知道,內部類的實現其實是通過編譯器的語法糖實現的,通過生成相應的子類即以OutClassName$InteriorClassName命名的Class檔案。並新增建構函式,在建構函式中傳入外部類,這也是為什麼內部類能使用外部類的方法與欄位的原因。我們明白了這個也就要小心,當外部類與內部類生命週期不一致的時候很有可能發生記憶體洩漏,例如在一個Activity啟動一個Thread執行一個任務,因為Thread是內部類持有了Activity的引用,當Activity銷燬的時候如果Thread的任務沒有執行完成,造成Activity的引用不能釋放,Activity不能被釋放而引起了記憶體洩漏。這種情況下可以通過宣告一個static的內部類來解決問題,從反編譯中可以看出,宣告為static的類不會持有外部類的引用,如果你想使用外部類的話,可以通過軟引用的方式儲存外部類的引用。具體的程式碼就不上了。
--------------------- 本文來自 -SOLO- 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_22706515/article/details/51321718?utm_source=copy