天天看點

一文帶你了解Java其他基礎類庫 | 帶你學《Java語言進階特性》之十九

上一篇:Runtime類:為Java運作保駕護航 | 帶你學《Java語言進階特性》之十八

了解了幾個Java主要的基礎類庫後,還有如System、Cleaner等類庫在Java開發運作過程中起着重要的作用,來随作者一起來看看這些類庫為開發者提供了哪些幫助吧。

【本節目标】

通過閱讀本節内容,你将了解到貫穿整個程式的System類及其提供的幾個實用方法,了解到與AutoCloseable有相同功能的Cleaner類,學會通過實作Cloneable接口聲明對象的可克隆性。

System類

System類是一直陪伴着我們學習的程式類,之前使用的系統輸出采用的就是System類中的方法,而後在System類裡面也定義有一些其他的處理方法:

  • 數組拷貝:public static void arraycopy​(Object src, int srcPos, Object dest, int destPos, int length);
  • 擷取目前的日期時間數值:public static long currentTimeMillis();
  • 進行垃圾回收:public static void gc();

範例:操作耗時的統計

public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        long start=System.currentTimeMillis();
        String str="";
        for (int x = 0; x < 30000; x++) {
            str += x;//産生大量的垃圾空間
        }
        long end = System.currentTimeMillis();
        System.out.println("操作耗時:"+(end - start));   //操作耗時:984
    }
}           

在System類裡面也提供有一個gc()方法。但是這個gc()方法并不是重新定義的新方法,而是繼續調用Runtime類中的gc()操作(Runtime.getRuntime().gc();)。

Cleaner類

Cleaner是在JDK1.9之後提供的一個對象清理操作,其主要的功能是進行finalize()方法的替代。在C++語言裡面有兩種特殊的函數:構造函數、析構函數(對象手工回收),在Java裡面所有的垃圾空間都是通過GC自動回收的,是以很多情況下是不需要使用這類析構函數的,也正是因為如此,是以Java并沒有提供這方面支援。

但是Java本身依然提供了給使用者收尾的操作,每一個執行個體化對象在回收之前至少給它一個喘息的機會。最初實作對象收尾處理的方法是Object類中所提供的finalize()方法,這個方法的定義如下:

@Deprecated(since="9")
protected void finalize()  throws Throwable           

該替換指的是不建議繼續使用這個方法了,而是說子類可以繼續使用這個方法名稱。 但是這個方法上最大的特點就是抛出了一個Throwable異常類型,而這個異常類型分為兩個子類型:Error、Exception,平常所處理的都是Exception。

範例:觀察傳統回收

class Member{
    public Member() {
        System.out.println("【構造】在一個雷電交加的日子裡面,林強誕生了。");
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("【回收】最終你一定要死的");
        throw new Exception("我還要再活500年...");
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        Member mem=new Member();   //誕生
        mem = null;   //成為垃圾
        System.gc();
        System.out.println("太陽照常升起,地球照樣轉動。");
    }
}           
一文帶你了解Java其他基礎類庫 | 帶你學《Java語言進階特性》之十九

運作結果一

但是從JDK1.9開始,這一操作已經不建議使用了,而對于對象回收釋放,從JDK1.9開始建議開發者使用AutoCloseable或者使用java.lang.ref.Cleaner類進行回收處理(Cleaner也支援有AutoCloseable處理);

class Member implements Runnable{
    public Member() {
        System.out.println("【構造】在一個雷電交加的日子裡面,林強誕生了。");
    }
    @Override
    public void run() {//執行清除的時候執行的是此操作
        System.out.println("【回收】最終你一定要死的");
    }
}
class MemberCleaning implements AutoCloseable{    //實作清除的處理
    private static final Cleaner cleaner=Cleaner.create();  //建立一個清除處理
    private Member member;
    private Cleaner.Cleanable cleanable;
    public MemberCleaning() {
        this.member = new Member();//建立新對象
        this.cleanable=this.cleaner.register(this,this.member);  //注冊使用的對象
    }
    @Override
    public void close() throws Exception {
        this.cleanable.clean();   //啟動多線程
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception{
        try(MemberCleaning mc=new MemberCleaning()) {
            //中間可以執行一些相關的代碼
        }catch (Exception e){}
    }
}           
一文帶你了解Java其他基礎類庫 | 帶你學《Java語言進階特性》之十九

運作結果二

在新一代的清除回收處理的過程之中,更多的情況下考慮的是多線程的使用,即:為了防止有可能造成的延遲處理,是以許多對象回收前的處理都是單獨通過一個線程完成的。

對象克隆

所謂的對象克隆指的就是對象的複制,而且屬于全新的複制。即:使用已有對象内容建立一個新的對象,如果要想使用對象克隆需要使用到Object類中提供的clone()方法:

protected Object clone() throws CloneNotSupportedException;           

所有的類都會繼承Object父類,是以所有的類都一定會有clone()方法,但是并不是所有的類都希望被克隆。是以如果要想實作對象克隆,那麼對象所在的類需要實作一個Cloneable接口,此接口并沒有任何的方法提供,是因為它描述的是一種能力。

範例:實作對象克隆

class Member implements Cloneable {
    private String name;
    private int age;
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "【" + super.toString() + "】name = " + this.name + "、age = " + this.age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();   //調用父類提供的clone()方法
    }
}
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Member memberA=new Member("林強",30);
        Member memberB=(Member)memberA.clone();
        System.out.println(memberA);
        System.out.println(memberB);
    }
}           
一文帶你了解Java其他基礎類庫 | 帶你學《Java語言進階特性》之十九

運作結果三

如果在開發之中不是非常特别的需求下,很少會出現有對象克隆的需求。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:Math、Random類為你展現數學之美 | 帶你學《Java語言進階特性》之二十 更多Java面向對象程式設計文章檢視此處