軟件構造復習的一些經驗筆記
術語解釋
- LSP原則(里氏替換原則)
什么是LSP原則,就是A類繼承B類,A類應該比B類的spec(規約)更強
換句話說:你爹會做魚香肉絲,你爹的手藝遺傳給了你,所以你肯定會做魚香肉絲,而且你還有可能比你爹做的魚香肉絲更好吃
- 防御性拷貝
什么是防御性拷貝,防御性拷貝就是我傳給客戶端數據的時候,不能直接把原來的數據給他,我得復制一個新的,把新的給他。因為萬一客戶把我舊的數據改變了,我手里只有這一份數據,我在用這個數據的時候就成了被改變了的數據了。所以我不得不復制一份新的給他,防止他給我改變了我的數據。
- AF是啥,RI是啥
AF
想象一下你有一個玩具箱(表示域R),里面有很多不同形狀和顏色的積木。這些積木代表的是你玩具箱里的具體玩具。
現在,你想用這些積木來搭一個漂亮的城堡(抽象域A)。城堡就是你心里想象出來的東西,是用積木搭出來的。這時候,你需要一個“魔法配方”,告訴你哪些積木可以搭成城堡。這就是AF,抽象函數。
抽象函數(AF)就像一個魔法配方,它告訴你怎么樣用玩具箱里的積木搭成你心里想象的城堡。
RI
想象你的玩具箱里的積木有一些規則,比如:
1.積木不能破損,要完整的。
2.不能有超過50塊積木。
這些規則確保了你的玩具箱里的積木是好的,可以用來搭城堡。這些規則就是RI,表示不變量。
表示不變量(RI)就像玩具箱里的規矩,確保里面的積木是完好和正確的,這樣你才能用這些積木搭成你想要的城堡。
重要知識
hashCode和equals方法
hashCode
方法返回對象的哈希碼值,它是一個整數。哈希碼通常用于散列表中的散列算法,例如Java中的HashMap
、HashSet
等集合。equals
方法用于判斷兩個對象是否相等。它是從Object
類繼承而來的,默認實現是比較對象的內存地址。- 根據Java的規范,
hashCode
和equals
方法必須滿足以下條件:- 如果兩個對象相等(即
equals(Object obj)
返回true
),那么它們的哈希碼值必須相等。即對于任何兩個對象a
和b
,如果a.equals(b)
為true
,那么a.hashCode() == b.hashCode()
也必須為true
。 - 如果兩個對象的哈希碼值相等,它們并不一定相等。即對于任何兩個對象
a
和b
,如果a.hashCode() == b.hashCode()
為true
,a.equals(b)
不一定為true
。 - 如果對象在equals比較中不相等,那么它們的hashCode值不要求一定不相等,但好的hashCode實現應該盡量避免這種情況。為了提高散列表的性能,不相等的對象盡量具有不同的哈希碼值。
- 如果兩個對象相等(即
異常
在Java編程中,異常分為兩大類:checked異常和unchecked異常。這兩類異常的主要區別在于它們的處理方式以及在編譯時和運行時的行為。下面是詳細的解釋:
Checked異常
定義
Checked異常是那些在編譯時就必須處理的異常。這意味著,如果某個方法可能會拋出checked異常,那么該方法要么必須在方法簽名中聲明該異常,要么必須在方法體內通過try-catch塊進行處理。
特點
- 編譯時檢查:編譯器會強制檢查這些異常是否被處理。
- 必須處理:如果不處理checked異常,代碼將無法通過編譯。
- 典型例子:
IOException
,SQLException
,ClassNotFoundException
等。
示例代碼
java復制代碼import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;public class CheckedExceptionExample {public static void main(String[] args) {try {File file = new File("non_existent_file.txt");FileReader fr = new FileReader(file);} catch (FileNotFoundException e) {e.printStackTrace();}}
}
在上面的例子中,FileNotFoundException
是一個checked異常,必須通過try-catch塊處理,否則編譯器會報錯。
Unchecked異常
定義
Unchecked異常是那些在編譯時不強制要求處理的異常。它們通常是由程序中的邏輯錯誤或程序員的疏忽引起的。這類異常在運行時才會拋出。
特點
- 運行時檢查:編譯器不強制檢查這些異常是否被處理。
- 不強制處理:程序員可以選擇處理或不處理unchecked異常。
- 典型例子:
NullPointerException
,ArrayIndexOutOfBoundsException
,ArithmeticException
等。
示例代碼
java復制代碼public class UncheckedExceptionExample {public static void main(String[] args) {int[] numbers = {1, 2, 3};System.out.println(numbers[3]); // 這將拋出ArrayIndexOutOfBoundsException}
}
在上面的例子中,ArrayIndexOutOfBoundsException
是一個unchecked異常,程序不會在編譯時提醒處理這個異常,但它會在運行時拋出。
異常的繼承關系
在Java的異常層次結構中:
-
java.lang.Throwable
是所有異常的根類。
-
java.lang.Exception
是所有checked異常的父類。
java.lang.RuntimeException
是所有unchecked異常的父類。
-
因此,checked異常是Exception
的直接子類(但不包括RuntimeException
及其子類),而unchecked異常是RuntimeException
及其子類。
Iterable接口和Iteator接口
- 用途:
Iterable
:定義一個集合可以被迭代,但不提供具體的迭代實現。實現Iterable
接口的類可以使用增強型for循環。Iterator
:提供具體的迭代功能,可以在迭代過程中刪除元素。
- 方法:
Iterable
只有一個方法iterator()
,返回一個Iterator
對象。Iterator
有三個方法:hasNext()
,next()
,和remove()
,用于遍歷和修改集合。
- 關系:
- 實現
Iterable
接口的類必須提供一個iterator()
方法,該方法返回一個Iterator
對象。 Iterator
接口提供了實際的迭代行為,是遍歷集合元素的工具。
- 實現