软件构造学习心得——第二部分ADT+OOP(4-8讲)(下)

软件构造学习心得——第二部分ADT+OOP(4-8讲)(下)

内容

基本数据类型、对象数据类型
静态类型检查、动态类型检查
Mutable/Immutable
值的改变、引用的改变
防御式拷贝
Snapshot diagram
Specification、前置/后置条件
行为等价性
规约的强度
ADT操作的四种类型
表示独立性
表示泄露
不变量、表示不变量RI
表示空间、抽象空间、AF
以注释的形式撰写AF、RI
接口、抽象类、具体类
继承、override
多态、overload
泛型
等价性equals()和==
equals()的自反、传递、对称
hashCode()
不可变对象的引用等价性、对象等价性
可变对象的观察等价性、行为等价性

接口、抽象类、具体类

在这里插入图片描述

接口:确定ADT规约;类:实现ADT
也可以不需要接口直接使用类作为ADT,既有ADT定义也有ADT实现,但实际往往用接口
在这里插入图片描述
注意接口不能有构造器,用工厂方法替代
在这里插入图片描述
default:在接口中统一实现某些功能,无需在各个类中重复实现它。
可以用来以增量式的为接口增加额外的功能而不破坏已实现的类

继承、override

父类中加了fina——严格继承:子类只能添加新方法,无法重写超类中的方法

父类型中的被重写函数体不为空:意味着对其大多数子类型来说,该方法是可以被直接复用的。也可以实现自己的特殊要求;如果父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写。

重写后要用super()复用父类型中函数的功能,并对其进行扩展
在这里插入图片描述
在这里插入图片描述
子类:Java中的子类型一定要确保其规格说明不弱于超类型
避免:
加强方法某些输入的前置条件
削弱后置条件
削弱接口抽象类型对用户的保证

抽象类和接口的区别:

定义:有抽象方法就叫抽象类,全部是抽象方法的叫接口
在这里插入图片描述
如果某些操作是所有子类型都共有,但彼此有差别,可以在父类型中设计抽象方法,在各子类型中重写。所有子类型完全相同的操作,放在父类型中实现,子类型中无需重写。有些子类型有而其他子类型无的操作,不要在父类型中定义和实现,而应在特定子类型中实现。

多态、overload

3种类型:特殊多态(功能重载)、参数化多态(泛型)、子类型多态/包含多态
重载:多个方法具有同样的名字,但有不同的参数列表或返回值类型
重载是在编译阶段决定,静态检查;重写是在运行阶段决定,动态决定
在这里插入图片描述

泛型

泛型编程是一种编程风格,其中数据类型和函数是根据待指定的类型编写的,随后在需要时根据参数提供的特定类型进行实例化。
泛型编程围绕“从具体进行抽象”的思想,将采用不同数据表示的算法进行抽象,得到范型化的算法,可以得到复用性、通用性更强的软件。
注:
泛型类/接口,是在实例化类的时候指明泛型的具体类型(类型擦除);
泛型方法,是在调用方法的时候指明泛型的具体类型。
在这里插入图片描述
注:泛型要有父子关系必须使用通配符,否则只要基类型不一样就没有父子关系

等价性(必考)

在这里插入图片描述
注意对象类型要比较时必须重写hashcode和equals,缺一不可,除非不用hash集合
在这里插入图片描述在这里插入图片描述
注意重写的签名要一致,用重写不用重载!
如果equals比较相等,则要求hashcode相等;如果equals不等,则hashcode是否相等均可,但最好不等(提升性能,避免了调用不必要的equals操作)
构造hashcode时考虑对象的所有字段,以避免不相等对象产生相同hashcode
除非对象可变,否则hashcode不能修改。

等价 == VS equals()
要满足3个特性:自反、对称、传递
用AF判断等价:f(a)=f(b). AF映射到同样的结果,则等价
用观察判断等价:站在外部观察者角度:对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的。反之亦然!

如果一个类只有构造函数没有其他的操作,就不能用观察判断!

==是引用等价性,而equals是对象等价性
在自定义ADT时,需要重写Object的equals(),在Object中实现的缺省equals()是在判断引用等价性,一般非所需
注意不是重载,用@Override来检测
在这里插入图片描述
可变对象:
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致
by calling only observer, producer, and creator
行为等价性:调用对象的任何方法都展示出一致的结果

Note: for immutable objects, observational and behavioral equality are identical, because there aren’t any mutator methods.对不可变对象来说,两者一致,因为不可变对象没有mutator
在这里插入图片描述
eg:
在这里插入图片描述
hashcode改变了但set没意识到应该让它换个哈希位置(哈希桶/散列桶)

总结:
对可变类型,实现行为等价性即可,也就是说,只有指向同样内存空间的objects,才是相等的。所以对可变类型来说,无需重写这两个函数,直接继承Object的两个方法即可。如果一定要判断两个可变对象看起来是否一致,最好定义一个新的方法。
而对不可变类型,一定要重写两个方法

另外

Integer x = Integer.valueOf(30);
Integer y = Integer.valueOf(30);

x.equals(y)//true
x == y//true

Java缓存了从-127到127的对象,若改成3000

Integer x = Integer.valueOf(3000);
Integer y = Integer.valueOf(3000);

x.equals(y)//true
x == y//false

精译链接

于7/1开始写,因实验延迟至7/3完成,7/5又做了些补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值