文章目录
前言
今天做一个对快照图的简单讨论。`
一、什么是快照图?
快照图(Snapshot diagrams)作为一种图示能表示程序运行时的各种状态——栈上的状态(方法和局部变量)、堆上的状态(创建的对象)。它是位于Run-time-Moment-Code-level层级的软件视图上,也就是说它描述的是程序运行至某一时刻、堆栈上各种东西的状态。
绿圈最左边即快照图所处的位置
二、各种快照图
1、表示原始值的快照图
原始值(primitive values,应该是原始数据类型的值,它们有byte、char、short、int、long、float、double、boolean共8个)以裸露的(bare)常量表示,箭头的来源可以是一个变量或者一个对象的内部区域(field,对象的字段或者说它的成员变量)。
2、表示原始值的快照图
我们用一个圆表示对象的值,在圆的内部写上对象类型名(如上图中圆内的Point指的就是对象的类型是Point),当我们要展现更多细节时,就在类型名的下面写上对象各个字段的名字,如上图的第二个快照图,当要进一步展现细节时,可以加上字段的类型,也就是上图的第三个快照图。
一般来说默认用上图的第三个快照图的形式是最为完整、保险的。
在这里,箭头的来源即是对象的名字。
3、java聚合类型对象的快照图
(i)List
java的列表(List)可以包含0个或多个对象,值相同的对象可以在列表中出现多次。
可以看到,圆内第一行写的仍然是对象类型(List),下一行写的是列表的已有索引,每一个索引又伸出箭头指向相应的对象,列表对象的名字指向这个圆。
(ii)Map
映射(Map)是包含键/值对(key/value)的聚合类型,它可以包含0个或多个键值对。
可以看到,圆内并没有索引,而是三个方框,表示这个Map对象有3个键/值对。对于每个方框而言,方框左边伸出的箭头指向这个键值对的键,右边伸出的箭头指向这个键值对的值。
(iii)Set
集合(Set)是包含0个或多个不重复对象的聚合类型。
可以看到,由于集合内部元素是无序的,所以圆内也不用索引表示集合的元素,而是从圆内伸出3个箭头指向三个相应的对象。
4、快照图的其他细节
(i)带双圈的圆
若一个对象在快照图中表示的圆带有双圈,则说明它的对象类型是不可变的,也就是说对象一经创建,对应的内存空间上的值是不应当被改变的,因此对这种ADT的一个直观的设计处理就是它是没有也不能有mutator的。
从上图的例子可以看到,s变量的类型是String,String类型是不可变的,因此当对s重新赋值时,其实质就是改变了s的指向,使其指向了一片新的内存空间,而非改变原来内存空间的值。
(ii)带双线的箭头
快照图中,带双线的箭头可以理解为这个变量/字段加上了final修饰符,这意味着对这个变量/字段做第一次赋值之后,变量/字段的引用就无法改变了,也就是说这个箭头必须始终指着这片内存区域。
以上图为例,变量id指向值9208484,之后它也将一直指向这个值,它甚至连加减乘除都做不了,如果结果存给它自己的话。因为原始数据类型是不可变的,计算结果会放在新的内存空间,而初始化的id是不能改变其指向的。
之所以加final可能是为了让这个变量是只读的。
以上就是对快照图的简单讨论。注意,如果一个Rep仅仅是private的,则不需要写成双线。
总结
今天通过查找资料对快照图进行了一个简单的总结,因为快照图应该是必考的,所以应该提高对快照图的掌握程度。