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

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

术语解释

  • 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接口提供了实际的迭代行为,是遍历集合元素的工具。
相关推荐
一叶飘零_sweeeet32 分钟前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
艾伦~耶格尔1 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
一只叫煤球的猫1 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
最初的↘那颗心1 小时前
Flink Stream API 源码走读 - print()
java·大数据·hadoop·flink·实时计算
JH30732 小时前
Maven的三种项目打包方式——pom,jar,war的区别
java·maven·jar
带刺的坐椅3 小时前
轻量级流程编排框架,Solon Flow v3.5.0 发布
java·solon·workflow·flow·solon-flow
David爱编程3 小时前
线程调度策略详解:时间片轮转 vs 优先级机制,面试常考!
java·后端
阿冲Runner4 小时前
创建一个生产可用的线程池
java·后端
写bug写bug4 小时前
你真的会用枚举吗
java·后端·设计模式
张较瘦_5 小时前
[论文阅读] 软件工程工具 | EVOSCAT可视化工具如何重塑软件演化研究
论文阅读·软件工程