数据类型和类型检查
第三章 ADT OOP
3.1 数据类型和类型检查
- 动态 静态类型检查
- 可变 不可变类型检查
- 可变数据的危险性
- 不变数据的优越性
- 用snapshot图理解数据类型
1 数据类型
数据类型
基本数据类型 | 对象数据类型 |
---|---|
int long byte short char float double boolean |
Classes interfaces arrays enums annotations |
只有值 无ID | 有值 有ID |
不可变 | 可变或不可变 |
在栈中分配空间 | 在堆中分配空间 |
无法统一表达 | 可以统一表达 |
代价低 | 代价高昂 |
基本数据类型小写:int,long,byte,short,char,float,double,boolean
对象数据类型首字母大写:类,接口,数组,枚举,标注
基本数据类型、局部变量都是存放在栈内存中的,用完就消失。
new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。
封装
把基本数据类型封装为对象类型 通常是在定义集合类型时使用它们
2 静态类型 动态类型
静态类型
- 类型检查通常发生在编译阶段
- 数据类型在定义后就确定 通常无法更改
动态语言
- 在运行阶段检查
3 类型检查
三种检查策略
- 静态类型检查
- 动态类型检查
- 不检查
折中
静态>动态>无检
静态类型检查
在编译阶段进行检查 避免将错误带入运行阶段 可提高程序正确性 健壮性
- 语法错误
- 类型错误
- 参数数目错误
- 函数名 类名错误
- 返回值类型错误
动态类型检查
- 非法参数值
- 非法返回值
- 越界
- 空指针
易变性 永恒性
改变一个变量 和 改变它的值有什么区别
- 改变一个变量 该变量指向另一个值得存储空间
- 改变一个值 将变量指向的空间的值换成另一个值
不变性
不变数据类型 一旦建立 不能更改
例如final标签 尽量使用final作为方法的输入和局部变量
注意:
- final类无法派生子类
- final无法改变值 引用
- final无法被子类重写
不变对象 和 可变对象
可变类型
不可变类型
差异
两种类型的效率上有差别
- 不可变类型:频繁修改 需要垃圾回收
- 可变类型:无需拷贝 效率高
但是不可变类型更加安全 其他质量指标表现更好
风险实例:
- 1 改变源数据
- 2 返回可变类型
4.Snapshot diagrams
快照图Snapshot diagrams:表示运行时程序的内部状态 - 它的堆栈(正在进行的方法和它们的局部变量)及其堆(当前存在的对象)。
Primitive values:
Object values:
Immutable objects:(double border):