基本数据类型、对象数据类型:
数据类型:用于储存可进行操作的数据。
基本数据类型:共8种,为byte,int, long , short, char, float, double, boolean
-均为不可变类型
-只有值,无ID,不能和其他值区分
-在栈中保存
-无法实现表达统一
-代价低
对象数据类型:除基本类型外的所有类型
-有不可变和可变类型
-有值有ID
-在堆中保存
-可实现表达与泛型统一
-代价高
Object是所有对象类型的根,由object开始形成树形结构,若一个对象数据类型未用extend声明是谁的子类,则默认父类是object。(单亲继承)
静态/动态类型检查:
Java是静态类型语言。(在编译前进行相应变量类型检查)
静态类型检查:在代码运行前进行类型检查,可发现语法、类名/函数名、参数数量及类型、返回值错误
在运行前进行检查,防止错误带入程序运行,提升健壮性
动态类型检查:在代码运行时进行类型检查,检查非法参数值,非法返回值,越界等问题
静态检查类型、动态检查值
可变性/不可变性:
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值
不变性:一旦被创建,其值不能改变
引用不变:一旦确定其指向的对象,不能再被改变(但其值是可能变化的)[可能出现在诸如指针之类的引用类上]
Final:用以表示某表达不可变,具体作用如下
- final 类无法派生子类
- final 方法无法被子类重写
- final 变量无法改变其引用(而非值),即其值可能因针对值的改变而变化
不可变类型一旦被创建,就始终代表(对外表现出)同样的值。
可变类型则拥有方法可以修改自己的值。
此时,对于不可变类型,每当需要对其进行运算时,均需要对其进行临时拷贝,而可变类型则可直接对于数据本身进行修改。故不可变类型通常在效率上没有优势。
但对于可变类型,若存在多个对同一值的引用,则一个引用的值可能因为其他引用的变化而发生不希望的变化,这是非常危险的,故通常不可变类型的安全性相对较好。
保护可变类型变量,通常应当将其限定在函数的内部,防止其泄露,若需要传出可变变量,则应当进行防御式拷贝,给客户端返回一个全新的对象
Snapshot diagram快照图:
描述程序运行时的内部状态。使用快照图便于程序员之间的交流、刻画各类变量随时间变化、解释设计思路。
其中:基本类型值使用箭头表示,对象类型值使用圈加其名字表示,若详细表示,则可记录其内部属性。
对于可变引用,使用单线,不可变引用则使用双线
List类型的快照图
Set类型的快照图
Map类型的快照图
Iterator迭代器:可变数据类型,一个逐步遍历元素集合并逐个返回元素的对象。
拥有两个方法:
Mutator next() 返回容器的下一个数据
observer hasNext() 返回容器是否还有下一个数据

Iterator类型的快照图
Specification规约、前置/后置条件:
规约:是程序与客户端之间达成的一致,给“供需双方”都确定了责任,在调用的时候双方都要遵守。
使用时,客户端无需阅读调用函数的代码,只需理解spec即可。
客户端只需要知道规约,而无需得知规约内部结构。
前置条件:对于客户端输入的要求
后置条件:实现者编写的程序应当给出满足后置条件的结果
规约强度:
前置条件更弱,后置条件更强, 满足更强规约的方法一定能替代满足更弱规约 的功能,客户端肯定更喜欢强规约方法(有更大的自由度),但这增加了实现者的压力。
行为等价性:
对于函数的行为,不关注于其内在行为是否一致,而关注两行为是否对用户来说等价
可以根据规约判断是否行为等价,当两行为符合同一规约时,可以认为其行为上等价。
ADT操作的四种类型:
1.构造器creator,输入一些其它类型的对象,创建一个该ADT对象。例如创建一个新集合new() 或者现实中的构造函数。
2.生产器producer,通过该ADT的旧对象,创建一个该ADT的新对象,例如计算当前集合与S的 交集的方法ins(S)。
3.观察器observer,通过该ADT本身的数据以及传入参数,计算得到其它类型的值。例如检查 集合里是否有x的方法find(x)。
4.变值器mutator,作出“修改ADT内部数据”的行为,是可变对象与不可变对象的本质区别!例 如将x加入集合并返回加入x后的集合大小的方法add(x)。
表示独立性、表示泄露:
表示独立性是指,客户端使用ADT时无需考虑(也不应该知道,更不应该直接访问到)其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。 如果ADT不幸地让客户端得到了自己内部表示(可变对象)的引用,那么客户端就可以不通过ADT的操作,而可以通过非法后门修改ADT的内部表示,产生表示泄露。
防御手段:通过防御性拷贝,返回一个新对象的引用,从而防止可变类型内容的直接变化。
不变量、表示不变量RI:

AF:由实际的表示到抽象的形式间的映射,体现了实现抽象数据的过程。
是满射,但未必是单射,未必是双射。
RI:表示某一个具体表示是否合法
设计ADT:
(1) 选择R和A;
(2) RI --- 合法的表示值;
(3) 如何解释合法的表示值 ---映射AF
本文探讨了Java中的基本数据类型与对象数据类型,强调了不可变性在效率和安全性上的权衡。介绍了静态/动态类型检查,以及可变性与不可变性的概念。不可变类型提供了更好的安全性,但可能牺牲效率。此外,还讨论了对象的引用不变性,以及final关键字的作用。规约作为程序与客户端之间的约定,确保了前后置条件的遵循,增强了代码的健壮性。最后,提到了ADT操作的四种类型,并强调了表示独立性和防止表示泄露的重要性。
242

被折叠的 条评论
为什么被折叠?



