軟體構造 3 5 ADT和OOP中的等價性

2021-09-14 07:23:26 字數 1599 閱讀 9164

adt:對資料的抽象;體現為一組對資料的操作

af:內部表示—>抽象表示

**基於af定義adt的等價操作

等價關係:自反、對稱、傳遞

從af的角度:af對映到同樣的結果—>等價

從外部觀察者角度:對兩個物件呼叫任何相同的操作都會得到相同的結果—>等價

==:引用等價性,即是否指向記憶體中同一位址(在快照圖中指向同乙個圈圈)

?對基本資料型別使用

.equals():物件等價性,自定義adt時需要重寫object的equals()

?對物件型別使用

在object中實現的預設equals()是在判斷引用等價性

錯誤的示例:

?是overload,不是override

正確的示例:

先用instanceof判斷型別,再呼叫私有的輔助函式判斷等價性

《在沒有af的前提下無腦判斷每個域是否相同不可取>

關於instanceof

用於判斷乙個物件是否是某一特定型別,動態檢查

除了實現equals()方法之外,最好不要使用

(1)滿足等價關係

(2)一致性:多次呼叫equals應返回相同結果,除非物件被修改

(3)x!=null?x.equals(null)==false

(4)相等物件的hashcode()結果必須一致(除非你能保證該類的物件不會被加入到某種雜湊結構中)?equals()和hashcode()必須同時重寫

觀察等價性:不改變狀態的情況下,兩個mutable物件是否看起來一致(通過呼叫除mutators外的方法)?比較常用

行為等價性:呼叫物件的任何方法都展示一致的結果(通過呼叫任何方法)

在jdk中,不同的 mutable類使用不同的等價性標準

《對immutable物件來說,觀察等價性和行為等價性是等價的,因為沒有mutator>

如果mutable的物件在集合類中:

當其發生改變後,集合類的行為不確定!

例:

listlist = new arraylist<>();

list.add("a");

set> set = new hashset>();

set.add(list);

set.contains(list)→true

list.add("goodbye");

set.contains(list)→false

原因:向list新增元素後,list的hashcode()改變了

總結:不可變型別必須重寫 equals() 和 hashcode();可變型別不應重寫 equals() 和 hashcode()

3 5ADT 和OOP 中的」等價性」

1.等價關係 2.不變型別的等價性 3.引用等價性和物件等價性 4.可變資料型別的觀察等價性和行為等價性 5.object契約 6.autoboxing and equality 1 equivalence relation 等價關係 adt 是對資料的抽象,體現為一組對資料的操作 抽象函式 af ...

第三章 ADT與OOP ADT與OOP中的等價性

首先先談一下引用等價性與物件等價性,試想有兩個同樣的產品ab,那麼a是否等價於b呢?先說結論從引用等價性來講a不等價於b,而從物件等價性來講a等價於b。原因 a與b是同樣的產品,所以樣子形狀等等屬性都是一樣的所以物件等價性等價,但a與b雖說一模一樣,但畢竟是兩個物品,所以引用等價性不等價。回到正題,...

android中ADT和SDK的關係

adt android development tools sdk software development kit 手機rom中包含兩個基本的image,乙個是boot.image,這個image中主要是kernel和檔案系統 目錄下的一些東西。kernel我就不說了,目錄下主要是init和相關的...