数据类型
基本数据类型
在java中为小写字母
int long boolean double char
只有值,没有id
immutable
对象数据类型
在java中大写字母开头
String BigInteger
有id
some mutable,some not
static vs. dynamic types
静态类型语言在编译阶段进行类型检查
动态类型在运行阶段进行类型检查
Java是静态的
类型检查
静态类型检查和动态类型检查和上面是一样的道理
static checking
语法错误
类名/函数名错误
参数数目错误
参数类型错误
返回值类型错误
dynamic checking
非法参数值
非法的返回值
越界
空指针
一些例子
- 整数不能取代boolean
- int sum = 0; int n = 0; int average = sum/n;【抛出异常】
- double sum = 7; double n = 0; double average = sum/n;【输出infinity】
- int a = 5; // (1) int b; // (2) if (a > 10) { // (3) b = 2; // (4) } b *= 3; 【b可能没有初始化】
mutability and immutability
改变一个变量(该笔那指向的存储空间)、改变一个变量的值(空间不变)是不一样的
不变对象:一旦被创建,始终指向同一个值
可变对象:拥有方法可以修改自己的值
immutability
不变数据类型:一旦被创建,其值不能被改变
如果compiler不能确定final类型的变量不会改变,就提示错误,static checking
final类无法派生子类
final变量不能改变值,但是对于引用类型变量,可以改变值,但是不能指向新的内存
final方法无法被子类重写
mutability优点
- 使用不可变类型,对其频繁修改会产生大量的临时拷贝,需要垃圾回收
- 最少化拷贝提高效率
- 模块共享数据
immutability 优点
线程安全
defensive copy
使用new
snapshot diagram
这是code-level,run-time,moment view
用于描述程序运行时的内部状态
便于程序员之间的交流
刻画各类变量随时间的变化
解释思路
基本类型的值
对象类型的值
不可变对象
使用双线椭圆
可变对象
不可变的引用
使用双箭头
law
引用是不可变的,但是指向的值确是可变的(stringBuilder)
可变的引用,也可指向不可变的值(string)
复杂数据类型:Arrays and Collections
Array
List
building a list from an array:Arrays.asList(new String[] { “a”, “b”, “c” })
Set
Map
iterator is mutable
请看两个例子:
第一个例子是不安全的,第二个安全
有用的immutable类型
- 基本类型及其封装类型都是不可变的
- Date类型是mutable
- 通常的collections的实现都是mutable
但是collections有将这些类转变成不可变类型的
Collections.unmodifiableList
并且这种包装器得到的结果是不可变的,只能看
在运行阶段得到,不能进行静态检查
Null references
欢迎关注公众号BBIT
让我们共同学习共同进步!