软件构造复习(4)
Chapter 3: Data Type and Type Checking
重点:
3.1 Data type in programming languages
类型(type):一组值以及可以对这些值执行的操作。
变量(variables):用特定数据类型定义,可存储满足类型约束的值。
基本数据类型(primitve types)以及对象数据类型(object types):通常前者小写开始,后者大写开始。
基本数据类型只有值没有ID也就代表,可以按照值来区分基本数据类型,而对于对象数据类型,即使值相同也未必相等。
对象类型形成层次结构:object类是所有类的父类;一个类是它所有父类的一个实例。
3.2 Static vs. dynamic data type checking
静态类型语言(statically-typed language):Java就是一个静态类型语言,会在编译时进行类型检查,所有变量类型须已知,编译器可以判断所有表达式类型。
静态类型检查发生在程序运行前,优点是可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。
静态类型检查可以检查出以下错误: 语法错误、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误。
动态类型语言(dynamically-typed language):例如Python,在运行阶段进行类型检查,变量类型在运行过程中可以变化。
动态类型检查发生在在代码运行过程中,可以检查出以下错误:非法的参数值、非法的返回值、越界、空指针等。
总体来说,静态检查是关于“类型”的检查,不考虑值;而动态检查是关于“值”的检查。
静态类型检查好于动态好于无检查
3.2 Static vs. dynamic data type checking
静态类型语言(statically-typed language):Java就是一个静态类型语言,会在编译时进行类型检查,所有变量类型须已知,编译器可以判断所有表达式类型。
静态类型检查发生在程序运行前,优点是可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。
静态类型检查可以检查出以下错误: 语法错误、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误。
动态类型语言(dynamically-typed language):例如Python,在运行阶段进行类型检查,变量类型在运行过程中可以变化。
动态类型检查发生在在代码运行过程中,可以检查出以下错误:非法的参数值、非法的返回值、越界、空指针等。
总体来说,静态检查是关于“类型”的检查,不考虑值;而动态检查是关于“值”的检查。
静态类型检查好于动态好于无检查(no checking)
StringBuilder是一个可变类,含有删改、删除其某个字符的方法。
3.4 Snapshot diagram(关系快照图)
关系快照图(Snapshot diagrams):用于描述程序运行时的内部状态,例如栈(包括方法和变量)、堆(存在的对象),便于程序员之间交流、刻画各类变量随时间变化和解释设计思路。
如下图所示,画关系快照图时,对于基本类型的值,直接用箭头指向就可以了,对于对象类型要先圈出来再用箭头指向。
不可变对象要用双线椭圆:
不可变的引用要用双线箭头:
3.5 Complex data types: Arrays and Collections(复杂数据类型)
1. Array类 Array:int [] a = new int[100];
2. List类 List:List list = new ArrayList();
3. Set类
4. Map类
5. 总结
List、Set和Map作为接口,都定义了类型的工作方式,但不提供实现代码,所以用户可以自行选择不同实现。例如:ArrayList、LinkedList;HashSet;HashMap等。
6. 迭代器(Iterator)
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。我们可以使用isinstance()来判断一个对象是否是Iterable对象。而可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
迭代器有两个方法,next()方法返回下一个元素,hasNext()可以检查迭代是否结束。
3.6 Useful immutable types
基本类型及其封装对象类型都是不可变的。java集合类(List、Set、Map)的常用实现都是可变的(ArrayList、HashMap等)。
Immutable Wrappers:但是Collections实用类中存在获取这些可变集合的不可修改视图的方法,也就是Collections.unmodifiableList,Collections.unmodifiableSet和Collections.unmodifiableMap。但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理