3.1Data Type and Type Checking数据类型与类型检验
1. 静态/动态类型检查
2. 可变/不变的数据类型
3. 可变数据类型的危险性
4. 不变数据类型的优越性
5. 用snapshot图理解数据类型
6. 用集合类表达复杂数据类型
7. 知道Null reference的危害并避免它
1 Data type in programming languages数据类型
primitive types 基本数据类型
object types 对象数据类型
1.Object类型是所有对象类型的父类
2.基本类型可以包装为对象类型,通常在定义集合类型的时候使用他们
3.重载overloading 同样的操作名可用于不同类型
2 Static vs. Dynamic data type checking静态和动态代码分析
Java是静态类型语言,在编译阶段进行类型检查
动态类型语言在运行阶段进行类型检查
无检查:语言不帮你检查,自己看
静态类型检查 >> 动态 >> 无检查
1.静态类型检查:可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性 /健壮性
可检查出的错误:
语法错误(标点符号啥的);类名函数名错误(ex:Math.sine(30,20) 应该是sin)
参数数目错误( ex:Math.sin(30,20) );参数类型错误(Math.sin("30"))
返回值类型错误
2.动态类型检查
可检查出的错误:
非法的参数值(ex:/0错误);非法的返回值;越界;空指针
静态检查:关于“类型”的检查,不考虑值
动态检查:关于“值”的检查
一些样例:
1为静态检查235为无错误只是答案不正确 4为动态检查
3 Mutability and Immutability可变性和不可变性
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
不变性:重要设计原则
不变数据类型:一旦被创建,其值不能改变
如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变(加上final关键字)
不可变数据类型需要频繁的垃圾回收,可变数据类型有时效率更高。但前者更安全
Risk:在参数传入mutable的数据类型然后更改,或者返回可变的数据类型可能出现风险,在用户端被更改。 解决:防御式拷贝(创建新的对象)或者直接使用不可变数据类型。
4.4 Snapshot diagram as a code-level, run-time, and moment view
Snapshot图用于描述程序运行时的内部状态,刻画各类变量随时间变化。
如何画snapshot:
1.基本类型的值
2.对象类型的值
3.不可变对象:用双线椭圆表示
4.可变的对象
5.不可变的引用 (final),不可变的引用:用双线箭头
PS:引用是不可变的,但指向的值却可以是可变的;可变的引用,也可指向不可变的值
练习:
ex1:
ex2:
5 Complex data types: Arrays and Collections复杂数据类型
数组:固定长度
List:长度可变的类型
Set:无序的,含有0个或多个独一无二的对象
Set是一个抽象接口
Map:类似字典,可以从key的值得到value
从数组中构建
Arrays.asList(new String[] { "a", "b", "c" })
Iterator迭代器
有next()方法得到下一个元素
有hasNext()方法确认是否到collectiion的最后
6 Useful immutable types有用的不可变类型
基本类型及其封装对象类型都是不可变的
Collections提供了一些包装器来得到不可变的collection
PS:!!! 但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查
编译阶段修改不会报错,运行时报错
不可变collections的静态方法
List.of Set.of Map.of
7 Null references空引用
基本类型不能为空,编译器会报错
null可以作为值使用,但最好不要这样做
ex: list.add(null);
非基本类型可以为null,但是不能使用方法或属性 (throws NullPointerExceptions)