前言:
在复习期间,复习snapshot图时,课件没有详细的总结,网络上也没有很好的教程,因此本人总结了snapshot图的基本概念以及相关示例,可以帮助学习理解。
一、什么是snapshot图?
snapshot图用于描述程序运行时的内部状态:如栈(方法和局部变量),堆(当前存在的对象)
在八维度三视图中属于:运行(Run-time)、时刻(Moment)、代码(Code-level)
构成要素为:带箭头的线、圈、字符
二、基本概念:
(一)对象、引用、数据类型
String s = new String(“logan”);
在这句代码中,s是引用,"logan"是对象,第一个String是数据类型
(二)可变与不可变
(1)数据类型
数据类型分为:基本数据类型和对象数据类型。
区分两者的技巧就是首字母,首字母大写的就是对象数据类型
如int,long,char等等基本数据类型,全都是不可变的数据类型;
如Double,Integer,String等等对象数据类型,是不可变的数据类型;
如Date,StringBuilder,List等等对象数据类型,是可变的数据类型
(2)对象
对于某一个不是引用的对象,如果它的数据类型是不可变的,那么他就是不可变的对象;如果它的数据类型是可变的,那么他就是可变的对象
如果这个对象是一个引用,则只有保证b是绝对不可变(不可变引用+不可变对象),才能认为b是不可变的对象
(3)引用
没有加任何修饰符的引用默认是可变的引用。
如果想让引用不可变,可以加final,static等等修饰词
三、基本画法:
(一)带箭头的线与圈
带箭头的线从【引用】指向【对象】,引用只需给出名称即可,对象的画法分为以下三种:
(1)基本数据类型的对象
对象无需用圈包围,并且不必注明数据类型,只需要给出对象的值即可
(2)对象数据类型的对象
需要用圈包围并注明对象的数据类型、值
(3)抽象数据类型的对象
需要用圈包围并注明抽象数据类型(下称ADT)的名称,以及该ADT的属性——包括属性的名称以及属性的数据类型,并根据上述(1)(2)画出每个属性引用的对象
(二)可变与不可变
对于可变的引用,画单线箭头
对于不可变的引用,画双线箭头
对于可变的对象,如果需要用圈包围,使用单圈包围
对于不可变的对象,如果需要用圈包围,使用双线椭圆包围
下面看四种引用与对象的组合:
(1)可变引用、不可变对象
String s = new String(“a”);
例子:
(2)可变引用、可变对象
StringBuilder t = new StringBuilder(“ab”);
StringBuilder 是一个可变对象代表者一个字母字符串,并且它有方法改变它的对象值
(3)不可变引用、可变对象
final StringBuilder st = new StringBuilder(“abc”);
(4)不可变引用、不可变对象
final String P = new String(“p”);
注:不可变引用进行静态检查
(三)复杂数据类型
除了上述的画法,还有一些典型的复杂数据类型,如List、Map、Set,接下来将介绍它们如何画:
(1)List
List是一个接口
List中的成员必须是一个对象
List< String > cities = new LinkedList< String >();
cities.add(“Boston”);
cities.add(“Bogotá”);
cities.add(“Barcelona”);
(2)Set
Set是一个抽象接口
Set< Integer > numbers = new HashSet< Integer >();
numbers.add("-7");
numbers.add(“42”);
numbers.add(“1024”);
(3)Map
Map< String, Integer > scores = new HashMap< String, Integer >();
scores.add(“James”, 100);
scores.add(“Bob”, 99);
scores.add(“Alex”, 98);
(四)变化
对于可变来说,望文生义,是可以变化的,下面介绍两种变化:
(1)引用可变但对象不可变
String s = new String(“a”);
s = “b”;
(2)对象可变但引用不可变
final StringBuilder st = new StringBuilder(“a”);
st.replace(0, 1, “b”);
(五)注意
从上述内容中,我们不难发现:
①可变引用可以指向不可变的对象
②引用虽不可变,但指向的值可以变化
③如果引用不可变且对象不可变,那么就绝对不可变