天天看點

ADT與OOP中的等價性

一:等價關系

ADT是對資料的抽象,展現為一組對資料的操作。

抽象函數AF:内部表示->抽象表示

ADT上的等價性是基于AF定義的

關系等價性

1.自反

2.對稱

3.傳遞

二:不可變類型的等價性

1.用觀察的方法定義等價性

占在外部觀察者的角度,對兩個對象調用任何相同的操作,得到的結果一樣,則認為兩個對象等價。

例:

ADT與OOP中的等價性
ADT與OOP中的等價性

分析:外部隻能通過getlength得到資料秒數,故d1、d3、d4等價。

三:= = 和.equals比較

1. = = 比較兩個引用是否指向記憶體中相同的存儲地點,同,則相等。

2. .equals 為自定義ADT是重寫object的euals而來,比較的是兩個對象是否具有等價性

四:實作.equals

ADT與OOP中的等價性

分析:d1、d2傳入對象具有等價性,故,true。

d1為Duration類,o2為Objects類,調用參數為Object that版本,使用等于号比較兩者,兩者所處存儲位置不同,故不相等。

一種好的實作方式:

ADT與OOP中的等價性

分析:重寫了預設的Object類的.equals方法,首利用instanceof判斷是否為Duration的執行個體,是進行下一步getlength值的判斷。

A instanceof B:雙目運算符,判斷A是否為B的執行個體對象、是否為B的接口實作類、是否為直接子類或間接子類

A為null傳回false

為動态檢查

不應再處.equals方法外使用

五:重寫equals方法的一般約定

1.滿足等價關系

2.多次調用傳回結果相等,除非被修改

3.x.equals(null)傳回值為false

4.相等對象,hashCode( )産生的結果必須一緻

5.重寫equals必須重寫hashCode

重寫Hashcod例子:

ADT與OOP中的等價性

六:可變類型的等價性

1.觀察等價性:在不改變狀态情況下,兩個可變類型對象看起來一緻

2.行為等價性:調用對象的任何方法都展示出一緻的結果

3.如果某個mutable的對象包含在Set 集合類中,當其發生改變後,集合類的行為不确定

4.對可變類型,實作行為等價性即可,也就是說,隻有指向同樣記憶體空間的objects,才是相等的。是以對可變類型來說,無需重寫這兩個函數,直接繼承Object的兩個方法即可。如果一定要判斷兩個可變對象看起來是否一緻,最好定義一個新的方法。

5.Clone()in object

ADT與OOP中的等價性

七:自動裝箱

ADT與OOP中的等價性