软件构造复习的一些经验笔记

软件构造复习的一些经验笔记

术语解释

  • LSP原则(里氏替换原则)

什么是LSP原则,就是A类继承B类,A类应该比B类的spec(规约)更强

换句话说:你爹会做鱼香肉丝,你爹的手艺遗传给了你,所以你肯定会做鱼香肉丝,而且你还有可能比你爹做的鱼香肉丝更好吃

  • 防御性拷贝

什么是防御性拷贝,防御性拷贝就是我传给客户端数据的时候,不能直接把原来的数据给他,我得复制一个新的,把新的给他。因为万一客户把我旧的数据改变了,我手里只有这一份数据,我在用这个数据的时候就成了被改变了的数据了。所以我不得不复制一份新的给他,防止他给我改变了我的数据。

  • AF是啥,RI是啥

AF

想象一下你有一个玩具箱(表示域R),里面有很多不同形状和颜色的积木。这些积木代表的是你玩具箱里的具体玩具。

现在,你想用这些积木来搭一个漂亮的城堡(抽象域A)。城堡就是你心里想象出来的东西,是用积木搭出来的。这时候,你需要一个"魔法配方",告诉你哪些积木可以搭成城堡。这就是AF,抽象函数。

抽象函数(AF)就像一个魔法配方,它告诉你怎么样用玩具箱里的积木搭成你心里想象的城堡。

RI

想象你的玩具箱里的积木有一些规则,比如:

1.积木不能破损,要完整的。

2.不能有超过50块积木。

这些规则确保了你的玩具箱里的积木是好的,可以用来搭城堡。这些规则就是RI,表示不变量。

表示不变量(RI)就像玩具箱里的规矩,确保里面的积木是完好和正确的,这样你才能用这些积木搭成你想要的城堡。

重要知识

hashCode和equals方法

  • hashCode方法返回对象的哈希码值,它是一个整数。哈希码通常用于散列表中的散列算法,例如Java中的HashMapHashSet等集合。
  • equals方法用于判断两个对象是否相等。它是从Object类继承而来的,默认实现是比较对象的内存地址。
  • 根据Java的规范,hashCodeequals方法必须满足以下条件:
    1. 如果两个对象相等(即 equals(Object obj) 返回 true),那么它们的哈希码值必须相等 。即对于任何两个对象 ab,如果 a.equals(b)true,那么 a.hashCode() == b.hashCode() 也必须为 true
    2. 如果两个对象的哈希码值相等,它们并不一定相等 。即对于任何两个对象 ab,如果 a.hashCode() == b.hashCode()truea.equals(b) 不一定为 true
    3. 如果对象在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接口

  1. 用途
    • Iterable:定义一个集合可以被迭代,但不提供具体的迭代实现。实现Iterable接口的类可以使用增强型for循环。
    • Iterator:提供具体的迭代功能,可以在迭代过程中删除元素。
  2. 方法
    • Iterable只有一个方法iterator(),返回一个Iterator对象。
    • Iterator有三个方法:hasNext()next(),和remove(),用于遍历和修改集合。
  3. 关系
    • 实现Iterable接口的类必须提供一个iterator()方法,该方法返回一个Iterator对象。
    • Iterator接口提供了实际的迭代行为,是遍历集合元素的工具。
相关推荐
代码方舟21 分钟前
O2O二手车交易平台B端车商管理后台:基于天远车信盟出险构建自动化车况评估网关
java·运维·人工智能·自动化
爱学堂IT分享23 分钟前
图灵Java互联网架构师六期
java·开发语言
坐吃山猪25 分钟前
【多线程】Semaphore使用
java·数据库·oracle·多线程
秋名RG44 分钟前
Java 核心特性一览
java·开发语言
霸道流氓气质1 小时前
Spring AI 技术细节:RAG QuestionAnswerAdvisor 设计与实现
java·人工智能·spring
斑马1391 小时前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络
冬栈程序设计1 小时前
Springboot宿舍管理系统【670099】 -附源码(开箱即用)
java·毕业设计·springboot·课程设计·程序设计·大作业
2601_962284502 小时前
北京Java全栈开发培训 Web前端开发 软件测试就业培训班
java·软件测试·web前端·全栈开发·就业培训
qiaosaifei2 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟2 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python