软件构造复习的一些经验笔记
术语解释
- 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
接口提供了实际的迭代行为,是遍历集合元素的工具。
- 实现