编程中的数据类型
对象类型之间形成层次结构(继承关系)
静态 / 动态类型检查
静态类型语言:在编译阶段进行类型检查,如Java
动态类型语言:在运行阶段进行类型检查,如Python
静态>>动态>>无检查
静态 / 动态检查
静态检查主要检查语法错误、类名/函数名错误、参数数目及类型错误、返回值类型错误等。
动态检查主要检查非法的参数值/返回值、越界及空指针等。
静态检查:关于“类型”的检查,不考虑值
动态检查:关于“值”的检查
不可变性(inmutability) 与可变性(mutablity)
不可变性(inmutablity):
重要设计原则,更安全
不可变数据类型一旦被创建,其值不可改变
尽量使用final变量作为方法的输入参数和局部变量
如果编译器无法确定final变量不会改变,就提示错误,这也是静态类型检查的一部分
使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收)
可变性(mutability):
值可修改
可变类型最少化拷贝以提高效率,更好的性能
适合于在多个模块之间共享数据
考虑安全需进行防御式拷贝
具体例子:
见ppt chapter 4 p31
快照图(Snapshot Diagram)
描述程序运行时内部状态
便于程序员之间的交流
便于刻画各类变量随时间变化
便于解释设计思路
基本类型的画法
对象类型的画法
双线/单线椭圆——不可变/可变对象(String与StringBuilder)
双线/单线箭头——不可变/可变引用
注意:
不可变的引用其指向的值却可以是可变的;
可变的引用,也可指向不可变的值。