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

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

术语解释

  • 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接口提供了实际的迭代行为,是遍历集合元素的工具。
  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值