数据类型和类型检查

第三章 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 改变源数据 
    风险1
  • 2 返回可变类型 
    风险2

4.Snapshot diagrams

快照图Snapshot diagrams:表示运行时程序的内部状态 - 它的堆栈(正在进行的方法和它们的局部变量)及其堆(当前存在的对象)。

Primitive values

 

Object values:

 

Immutable objectsdouble border):




猜你喜欢

转载自blog.csdn.net/ywh4214/article/details/80718782