基本数据类型vs对象数据类型
静态类型检查 & 动态类型检查
- 静态类型检查
- 关于“类型的检查”,不考虑值
- 在编译阶段发现错误,避免将错误带入运行阶段
- 提高程序的正确性、健壮性
- 静态类型检查错误:
- 语法错误
- 类名/函数名错误
- 参数数目错误
- 参数类型错误
- 返回值类型错误
- 动态类型检查
- 关于“值”的检查
- 动态类型检查错误:
- 非法的参数值
- 非法的返回值
- 越界
- 空指针
Mutable可变 & Immutable不可变
不变对象:一旦被创建,始终指向同一个值
可变对象:拥有方法可以修改自己的值/引用
final
- 尽量使用
final
作为方法的输入参数、作为局部变量 final
表明了程序员的一种“设计决策”final
类无法派生子类final
变量无法改变值/引用final
方法无法被子类重写
- String 不可变
- StringBuilder 可变
mutable 优点:
- 拷贝:不可变类型,频繁修改会产生大量的临时拷贝,需要垃圾回收;可变类型,最少化拷贝,以提高效率
- 获得更好的性能
- 模块之间共享数据
值的改变 & 引用的改变
- “改变一个变量”:将该变量指向另一个值的存储空间(引用)
- “改变一个变量的值”:将该变量当前指向的值的存储空间中写入一个新的值
表示泄露和防御式拷贝
通过防御式拷贝,给客户端返回一个全新的对象(副本),客户端即使对数据做了更改,也不会影响到自己。例如:return new Date(groundhogAnswer.getTime());
大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费
如果使用不可变类型,则节省了频繁复制的代价