软件构造学习笔记-第六周
這周的重點是重載和重寫。重載要求兩方法的簽名必須不同,而重寫則要求兩方法的簽名必須相同。重載可以發生在同一個類中,也可以發生在父類和子類中;重寫必須發生在父類和子類中。接口/抽象類不具有構造方法,只有將內部的抽象方法全部實現后的子類才能創造對象。每個子類都是父類,父類能做的事子類必須能做,還要做的更好。
ADT不變量替換前置條件
用ADT不變量取代復雜的前置條件,相當于將復雜的前置條件封裝到ADT內部。如果對輸入數據的檢測代價較高,則將約束傳遞給用戶,即前置條件。
接口
1.實際中更傾向于使用接口定義變量,因為對于接口的多種實現都滿足條件。
2.接口中不能含有構造函數,因為接口不能被實例化。接口不能含有具體的實現(比如返回值不能為ArraySet類型)。
3.可以在接口中定義靜態方法,在靜態方法中返回實現接口的實例化對象。
繼承、重載和重寫
1.嚴格繼承:子類只能添加新方法,不重寫父類中的方法。
2.final修飾的類不可以被繼承,final修飾的方法不能被重寫,final修飾的屬性不能被繼承。
3.如果父類中的某個函數實現體為空,則說明其子類都具有這個功能,但是各有差異,沒有共性,在每個子類中都需要重寫。
4.用super調用父類中被重寫的方法。在構造方法中調用父類的構造方法,super語句必須在第一句。
5.含有抽象方法的類是抽象類。接口是一種特殊的抽象類。
6.多態
特殊多態:相同的方法名,不同的參數列表或返回值類型(方法重載)。
參數化多態:泛型。
子類型多態:用接口(父類型)聲明變量,用具體的實現賦值。
7.重載方法在編譯階段時決定具體調用哪個方法(靜態類型檢查),重寫在運行時決定具體調用哪個方法(動態類型檢查)。
8.重載必須有不同的參數列表;返回值、修飾詞、異常可相同可不同;可以在本類或者子類中重載。
9.重載調用例子。具體調用哪個方法,取決于變量被聲明的類型。
第二行:如果聲明的是子類型,賦值也是子類型。方法調用時不滿足子類方法參數要求,滿足了父類方法參數要求,則調用父類方法。(重載時父類方法在子類中有備份)
10.重載和重寫的區別
泛型
1.通配符:只能在使用時出現,不能在定義中出現。
2.運行時泛型會被擦除,不能使用instanceof()檢查泛型種類。
3.不能創建泛型的數組。
子類型
1.子類型的規約不能弱化父類型的規約(從集合角度,子類是父類的真子集)。父類型能做的事子類型同樣能做。
2.將子類型轉化成父類型是安全的。因為任意的子類都是父類。
不可變類
1.寫不可變類的要求
-沒有mutator方法
-保證沒有方法可以被重寫
-成員域用private、final修飾
-防止表示暴露
-重寫toString()、hashCode()、clone()、equals()等
2.一般將小的“值類型”設置成不可變類。如實驗2的Position類、Piece類。
不可變類型的相等關系
1.相等是一種等價關系。等價關系的性質:自反、對稱、傳遞。
2.用戶角度:AF映射到同樣的結果,則兩個對象等價。
3.外部觀察者角度:對兩個對象調用任何相同的操作,都得到相同的結果,則認為兩對象等價。
4.Java有兩種操作判斷相等:
-引用等價性(==)指向同一內存區域。一般用來判斷基本數據類型。
-對象等價性(equals()),如果不被重寫,和引用等價性相同。所以自定義ADT時要重寫Object的equals。
5.盡量避免instanceof方法
重寫equals方法時,使用繼承避免調用instanceof
6.“相等”的對象,其hashCode()的結果必須相等。
7.哈希表工作原理
相等對象的哈希值一定相同,不同對象的哈希值可以相同,但是要盡量避免哈希沖突。
可變類型的相等關系
1.觀察等價性:在不改變狀態的情況下,兩個對象是否看起來一致。
2.行為等價性:調用對象任何方法都展示出一致的結果。
3.可變類相等一般不需要重寫equals方法,因為相等即意味著指向同一對象。
4.如果某個可變類對象包含在Set集合類中,當其發生改變時,集合類的行為不確定。就像照完身份證照片再整容。
重寫equals方法參考:
List的contains()方法詳解以及重寫equals()方法時需要注意的地方
總結
以上是生活随笔為你收集整理的软件构造学习笔记-第六周的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 威联通发布 JBOD 系列 NAS 扩充
- 下一篇: 软件构造学习笔记-实验2