3.java類和物件

weixin_34253539發表於2019-02-27

關於類和物件的詳解可以參考:https://blog.csdn.net/wei_zhi...

本文主要記錄下類物件的初始化順序、finalize函式以及物件克隆。

類物件初始化順序

  1. 父類靜態屬性變數初始化
  2. 父類靜態程式碼塊
  3. 子類靜態屬性變數初始化
  4. 子類靜態程式碼塊
  5. 父類普通屬性變數初始化
  6. 父類構造程式碼塊
  7. 父類建構函式
  8. 子類普通屬性變數初始化
  9. 子類構造程式碼塊
  10. 子類建構函式

通過結論我們可以很明顯的看出:static欄位、程式碼塊的執行順序優先於非static欄位、程式碼塊。這是因為在靜態域是屬於類的,在類載入後就一直存在;而普通域需要建立物件才能訪問。而在建立物件時,需要先載入父類,然後再載入子類,因此父類的靜態欄位初始化和靜態程式碼塊執行先於子類。

finalize 解構函式

java物件也有類似解構函式的功能,如果想要在垃圾回收的時候對某個物件進行一些收尾工作,可以重寫Object類的finalize()方法。
定義如下:

protected void finalize() throws Throwable

在物件回收時,即使丟擲了異常,也不會影響程式的正常執行。

示例:

class Demo {
    public Demo(){
        System.out.println("物件建構函式");
    }
    @Override
    protected void finalize() throws Throwable{
        System.out.println("物件解構函式");
    }
}
public class testDemo {
    public static void main(String[] args) throws Exception {
        Demo demo = new Demo();
        demo = null; //會產生垃圾
        System.gc(); //手工處理垃圾收集
    }
}
輸出結果:
物件建構函式
物件解構函式

可以看到異常資訊並未輸出。

final、finally、finalize的區別

  • final:關鍵字,其修飾的類不能被繼承,方法不能被重寫、常量;
  • finally: 關鍵字,異常的統一出口;
  • finalize:Object類的方法,解構函式;

物件克隆

物件克隆指的是物件的複製操作,在Object類裡提供有一個專門的克隆方法:

protected Object clone() throws CloneNotSupportedException

如果要使用的物件不支援Cloneable介面,呼叫該方法就會丟擲異常。

示例:

class Book implements Cloneable { //此類的物件可以被克隆
    private String title;
    private double price;
    
    public Book(String title, double price){
        this.title = title;
        this.price = price;
    }
    @Override
    public String toString(){
        return "書名:" + this.title + "價格:" + this.price;
    }

    //由於此類需要物件克隆操作,需要進行物件方法的重寫
    @Override
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
    
}
public class testDemo {
    public static void main(String[] args) throws Exception {
      Book bookA = new Book("java開發", 79.8);
      Book bookB = (Book)bookA.clone();

      System.out.println(bookA);
      System.out.println(bookB);

      System.out.println(System.identityHashCode(bookA));
      System.out.println(System.identityHashCode(bookB));
    }
}
輸出結果:
書名:java開發價格:79.8
書名:java開發價格:79.8
*****
366712642
1829164700

相關文章