2022-11-03|閱讀時間 ‧ 約 5 分鐘

靜態類與(Static)以及內存洩漏問題

    static 關鍵字主要用於管理記憶體,可用在variables, methods, blocks, nested classed。加上static關鍵字的物件,會在啟動程式當下就會賦予記憶體位置給此物件,後續無論實例化多少次,記憶體的位置都相同。

    以class舉例,static class 與 非static class的差別:

    1. 在class內部的class加上static,稱為內部靜態類,而內部靜態類不需要指向外部類的引用,但非靜態內部類需要。
    2. 靜態內部類只能訪問外部類的靜態成員,非靜態內部類能夠訪問外部類的靜態和非靜態成員。
    3. 當進行外部class創建時,非靜態內部類不能脫離外部類實體被創建,非靜態內部類可以訪問外部類的方法和參數。
    class OuterClass {
    private static String msg = "Hello!";
        private String msg2 = "Moto";    
    //加上static的類別
    public static class NestedStaticClass {

    //靜態class只能調用外部class的靜態成員
    public void printMsg() {

    System.out.println("msg = " + msg);
            }
    }

        //非static類
    public class InnerClass {
            //外部不管static還是無static都能調用
    public void display() {
                System.out.println("Msg = " + msg + msg2);
    }
    }

    class Main { // 創建static內部類以及非static內部類
        public static void main(String args[]) {
            //創建static內部類實例
    OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
            printer.printMsg();
            //創建非static內部類的方法,需要先創建外部類的實例。
            OuterClass outer = new OuterClass();
    OuterClass.InnerClass inner = outer.new InnerClass();
            inner.display();
    }

    Final

    與static相同可以用來宣告一個類別、函數或變數。

    final 類別:無法被繼承。

    final 函數:繼承的子類別無法override。

    final變數:變數值無法被修改。

    內存洩漏

    而有時有沒有加上static會影響到內存泄露的問題,像是以下Handler出現的問題,說由於Handler類沒有設置為static 所以導致了內存洩漏的問題。

    具體的原因為,因為非static內部類和匿名內部類都可以調用外部類的方法或參數,而當我們要結束外部類(例如MainActivity時),Handler還有消息並沒有被處理完畢,系統會判斷MainActiviy還有可能被使用到,所以不能回收,導致內存洩漏。

    具體來說,問題出在:

    1. 存在未解決的消息,導致Handler尚未結束。
    2. Handler的生命週期>外部類的生命週期。

    所以要想辦法解決上方的問題,以下是可以的幾個解決辦法:

    1. 將Handler設置為Static
    2. 將Handler內部的消息清除(removeCallbacksAndMessages(null))

    以上是這次簡單的整理。

    參考資料:

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.