iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

Java SE系列 第 7

Day07:始祖巨人

在學習Java繼承的部分時,就想到進擊巨人的設定,九大巨人的能力只要被其他人吃掉,能力就會被傳承過去,不覺得很像Java的類別繼承嗎哈哈。

不過Java更複雜了一點,因為繼承不會只有單線,而是像樹狀圖般開枝散葉,其中最頂端的源頭就是Object類別。

我們知道在宣告變數時,可以用父類別宣告型態,實際裝入的實例只要是這個父類別的子類別,都可以裝進來:

Number num = new Integer(10);

而Object為最源頭類別的意思,就是只要宣告為Object的變數,他能夠裝進一切的實例,甚至是基本型別:

Object num = new Integer(10);
Object primitive = 10;

作為始祖類別還有一個實質上的意義,那就是所有實例都繼承了Object類別中定義的方法,可以直接呼叫使用。這些方法是必須要認識一下的:

  • clone()
    可以拷貝物件至新的Heap Memory,返回Object型態,但object內部的field如果也是Heap Memory的參考,那就是直接照搬地址值,所以算是淺拷貝。
  • equals(Object obj)
    定義如何知道兩個物件是否相等的方法,返回boolean。
  • finalize()
    在物件即將要被垃圾回收機制(garbage collector)回收前,所呼叫的方法。所以若有甚麼事情希望在被垃圾回收前執行,就可以覆寫這個方法來實作。
  • getClass()
    返還Class類別,代表該變數的型態。
  • hashCode()
    返回int型態,代表該物件的hash code值。
  • notify()
    在有執行緒設計的程式中使用,可以通知此物件等待集中的隨機一個執行緒。
  • notifyAll()
    在有執行緒設計的程式中使用,可以通知此物件等待集中的所有執行緒。
  • toString()
    平常使用的System.out.println(Object x),此方法實作中實際就是呼叫x.toString(); 可以在定義類別時覆寫為自己想要的代表文字。
  • wait()
    在有執行緒設計的程式中使用,讓當前的執行緒進入等待集。
  • wait(long timeout)
    在有執行緒設計的程式中使用,讓當前的執行緒進入等待集,並等待timeout毫秒的時間後自動離開等待集。
  • wait(long timeout, int nanos)
    在有執行緒設計的程式中使用,讓當前的執行緒進入等待集,並等待1000000*timeout+nanos 奈秒(nanosecond)的時間後自動離開等待集。

其中最常用到的2個方法是equals(Object obj)、hashCode()和toString();只要有任何程式會用到比較2個物件是否相等時,就會預設去呼叫equals及hashCode,這已經是Java程式的公認規則了,所以不管是官方API或者我們自己下載引用的第三方套件,這些套件的原始碼一定都是呼叫物件的equals和hashCode來進行物件實例相等與否的判斷,原因也很明確,因為Object類別的這2個方法是所有Java實例一定會有的方法。
toString()就比較單純了,它就是我們常用的System.out.println()方法底層原始碼所呼叫的方法,如果我們今天要System.out.println(一個物件),那底層程式就是呼叫這個物件的toString()方法得到代表這個物件的字串,然後印給我們看。


上一篇
Day06:爸爸這麼做都是為你好
下一篇
Day08:別為了錢而放棄權力
系列文
Java SE30

尚未有邦友留言

立即登入留言