首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 初始化與清理:構造器、重載、finalize 與垃圾回收機制深度解析

     編輯:Java 相關知識

構造器與初始化保證

構造器確保對象創建即合法初始化。無參構造器(默認構造器)僅在類無任何顯式構造器時由編譯器自動生成;一旦定義任意構造器,默認構造器消失。

方法重載規則

  • 參數列表不同(類型、數量、順序)
  • 返回類型不可作為區分依據
  • 基本類型自動提升(char→int→long→float→double),可能導致歧義

this 關鍵字與構造器鏈調用


class Flower {
    String name;
    Flower() { this("Unknown"); } // 調用另一構造器
    Flower(String name) { this.name = name; }
}
  • this(args) 必須置於構造器首行
  • 一個構造器只能調用一個其他構造器

static 與非靜態上下文

  • static 方法屬於類,無 this,不可直接訪問非靜態成員
  • 非靜態方法可訪問靜態成員

清理機制:finalize() 與 GC 真相

finalize() 定位

用於釋放非 new 分配的資源(如 JNI 本地內存、文件句柄)。不是析構函數:

  1. 對象可能永遠不被 GC(程序結束前內存足夠)
  2. GC 觸發時間不確定,finalize() 執行時間更不確定
  3. 異常會被忽略,導致對象「復活」但資源未釋放

正確清理模式:顯式釋放 + try-with-resources


class Resource implements AutoCloseable {
    private native long handle; // JNI 句柄
    public void close() { nativeRelease(handle); }
    @Override protected void finalize() { close(); } // 最後防線
}

// 使用
try (Resource r = new Resource()) {
    // 使用資源
} // 自動調用 close()

垃圾回收器工作原理

  • 引用計數:簡單但循環引用無法處理,Java 不用
  • 可達性分析:從 GC Roots 遍歷,標記-清除/標記-整理/複製
  • 分代自適應:Young Gen 複製、Old Gen 標記-整理,動態切換策略

成員變量初始化順序

  1. 靜態字段/靜態塊(按聲明順序,類加載時一次)
  2. 實例字段/實例塊(按聲明順序,每次 new 時)
  3. 構造器體

class Order {
    static int a = init("static a");
    int b = init("instance b");
    { System.out.println("instance block"); } // 實例塊
    static { System.out.println("static block"); } // 靜態塊
    Order() { System.out.println("constructor"); }
}

數組與可變參數

  • int[] a = {1,2,3} 或 new int[3]
  • void foo(int... args) 內部接收 int[]

枚舉類型增強


enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING }
// 自動提供:toString()、ordinal()、values()、valueOf()
// 支持 switch、實現接口、擁有字段方法

總結

初始化靠構造器強制保證,清理靠顯式 close()/try-with-resources主動釋放,finalize() 只是兜底不可依賴。理解成員初始化順序、靜態塊時機、枚舉編譯器增強,編寫更健壯的資源管理代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved