Java 對象生命周期


1.Java類的初始化

  • 只有在 Java類被第一次使用時,虛擬機才會對該Java類進行初始化。
  • 初始化過程中靜態代碼塊和靜態域會按照書寫順序依次執行。
  • 當訪問Java類或接口中的靜態域時,只有真正聲明這個域的類或接口會被初始化。如:在類A中聲明了靜態域value,類B繼承自類A。通過B.value可以直接訪問類A中聲明的靜態域value。雖然引用時使用的類B,但是由於value是在類A中聲明的,因此B.value只會初始化類A,類B不會被初始化。
/**
 * @author lzzz
 *
 */
public class J17101901 {
    public static void main(String[] args) {
        System.out.println(B.value);
        /*
         out:
         A static
         1
         */
    }
}

class A {
    static int value = 1;
    static {
        System.out.println("A static");
    }
}

class B extends A {
    static {
        System.out.println("B static");
    }
}
  • 下面可能造成類被初始化的操作
  1. 創建對象
  2. 調用類中的靜態方法
  3. 為類或接口中的靜態域賦值
  4. 訪問類或接口中聲明的靜態域
  5. 調用Class類和反射API

2.Java對象的創建於初始化

  • 在實際創建對象之前分配內存空間。所需的內存空間大小取決於Java類及其父類和祖先類包含的所有實例域的數量和類型。
  • 內存分配成功之后將所有實例域設為默認值。
  • 調用構造方法,類的構造方法調用過程分成三步:第一步是調用父類的構造方法,沒有顯示定義將會調用默認構造方法。第二步是按照書寫順序初始化類中的實例域。第三步是執行類的構造方法中的相應代碼。
/**
 * @author lzzz
 *
 */
public class J17100805 {
    static {
        System.out.println("father static{}");
    }
    {
        System.out.println("father {}");
    }
    private int id = print("father private int id");
    private static int staticId = print("father private static int"); 
    public static int print(String str) {
        System.out.println(str);
        return 1;
    }

    public static void main(String[] args) {
        J17100805 j1 = new J17100805(); 
        System.out.println("--------我在j1之后--------");
        J17100805 j2 = new J17100805();
        System.out.println("--------我在j2之后--------");
        J17100805 j3 = new J17100805();
        System.out.println("\n--------我是分割線--------\n");
        System.out.println("--------我在jj1之后--------");
        J171008051 jj2 = new J171008051();
        System.out.println("--------我在jj2之后--------");
        J171008051 jj3 = new J171008051();
        /*
         father static{}
         father private static int
         father {}
         father private int id
         --------我在j1之后--------
         father {}
         father private int id
         --------我在j2之后--------
         father {}
         father private int id
        
         --------我是分割線--------
        
         --------我在jj1之后--------
         child static{}
         child private static int
         father {}
         father private int id
         child {}
         child private int id
         --------我在jj2之后--------
         father {}
         father private int id
         child {}
         child private int id
         */
    }
}

 

  • 不要在構造方法中調用可以被子類覆蓋的方法。

3.對象終止

  • Java采用自動內存管理機制,對象回收工作由垃圾回收器自動完成。
  • 如果一定要手動處理相關工作,Java提供了finalize方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM