数据类型和类型检查
前两章回答了:什么是“高质量的软件”、 如何从不同维度刻画软件、软件构造的基本过程和步骤。
本章主要内容是软件构造的理论基础——ADT(抽象数据类型) 和软件构造的技术基础——OOP(面向对象编程)。
目录
- Data type in programming languages
- Static vs. dynamic data types
- Type checking
- Mutability & Immutability
- Snapshot diagram
- Complex data types: Arrays and Collections
- Useful immutable types
- Null references
Data type in programming languages
Types and Variables
数据类型(type)是一组值,以及可以对这些值执行的操作。例如:
- boolean: Truth value (true or false)
- int: Integer (0, 1, -47)
- double: Real number (3.14, 1.0, -2.1)
- String: Text (“hello”, “example”)
变量(Variables):用特定数据类型定义,可存储满足类型约束的值。形式:TYPE NAME
Types in Java
primitive types 基本数据类型,例如:
- int (for integers like 5 and -200, but limited to the range ± 2^31, or roughly ± 2 billion)
- long (for larger integers up to ± 2^63)
- boolean (for true or false)
- double (for floating-point numbers, which represent a subset of the real numbers)
- char (for single characters like ‘A’ and ‘$’ )
object types 对象数据类型,例如:
- String represents a sequence of characters
- BigInteger represents an integer of arbitrary size
按照Java约定,基本类型是小写字母,而对象类型以大写字母开头。
对象类型形成层次结构
所有对象的根结点都是 Object
Boxed primitives
将基本类型包装为对象类型,例如Boolean, Integer, Short, Long, Character, Float, Double。通常是在定义集合类型的时候使用它们。一般情况下,尽量避免使用。一般可以自动转换。
Operations
操作符:执行简单计算的符号。例如+,-,*,/,=。
操作:是获取输入并生成输出的函数(有时会自行更改这些值)。
重载(Overload):同样的操作名可用于不同的数据类型 。
Static vs. dynamic data types
Java是静态类型语言 ,在编译阶段进行类型检查 ,而动态类型语言,例如Python,在运行阶段进行类型检查。
Type checking
Conversion by casting 类型转换
Static Checking and Dynamic Checking
一种语言可以提供的三种自动检查:
- 静态类型检查:该程序甚至在运行之前自动发现该错误
- 动态类型检查:该代码执行时会自动发现该错误
- 无检查:该语言不会帮助您找到错误。 必须亲自检查,否则最终会得到错误的答案。
毫无疑问,静态类型检查 >> 动态 >> 无检查。
静态类型检查
静态类型检查:可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。具体分为以下几个错误:
- Syntax errors(语法错误)
- Wrong names (类名/函数名错误)
- Wrong number of arguments (参数数目错误)
- Wrong argument types (参数类型错误)
- Wrong return types (返回值类型错误)
动态类型检查
在运行时检查是否有错,具体分为以下几个错误:
- Illegal argument values (非法的参数值)
- Unrepresentablereturn values (非法的返回值)
- Out-of-range indexes (越界)
- Calling a method on a null object reference(空指针)
Static vs. Dynamic Checking
静态检查:关于“类型”的检查,不考虑值 。
动态检查:关于“值”的检查。
Mutability and Immutability
改变一个变量、改变一个变量的值,二者有何区别?
- 改变一个变量:将该变量指向另一个值的存储空间 。
- 改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
Immutability 不变性
不变性是一个重要设计原则 。
不变数据类型(Immutable types ):一旦被创建,其值不能改变 。如果是引用类型,也可以是不变的,