關於類和物件的詳解可以參考:https://blog.csdn.net/wei_zhi...
本文主要記錄下類物件的初始化順序、finalize函式以及物件克隆。
類物件初始化順序
- 父類靜態屬性變數初始化
- 父類靜態程式碼塊
- 子類靜態屬性變數初始化
- 子類靜態程式碼塊
- 父類普通屬性變數初始化
- 父類構造程式碼塊
- 父類建構函式
- 子類普通屬性變數初始化
- 子類構造程式碼塊
- 子類建構函式
通過結論我們可以很明顯的看出: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