这周的重点是重载和重写。重载要求两方法的签名必须不同,而重写则要求两方法的签名必须相同。重载可以发生在同一个类中,也可以发生在父类和子类中;重写必须发生在父类和子类中。接口/抽象类不具有构造方法,只有将内部的抽象方法全部实现后的子类才能创造对象。每个子类都是父类,父类能做的事子类必须能做,还要做的更好。

ADT不变量替换前置条件

用ADT不变量取代复杂的前置条件,相当于将复杂的前置条件封装到ADT内部。如果对输入数据的检测代价较高,则将约束传递给用户,即前置条件。

接口

1.实际中更倾向于使用接口定义变量,因为对于接口的多种实现都满足条件。

2.接口中不能含有构造函数,因为接口不能被实例化。接口不能含有具体的实现(比如返回值不能为ArraySet类型)。
3.可以在接口中定义静态方法,在静态方法中返回实现接口的实例化对象。

继承、重载和重写

1.严格继承:子类只能添加新方法,不重写父类中的方法。
2.final修饰的类不可以被继承,final修饰的方法不能被重写,final修饰的属性不能被继承。
3.如果父类中的某个函数实现体为空,则说明其子类都具有这个功能,但是各有差异,没有共性,在每个子类中都需要重写。
4.用super调用父类中被重写的方法。在构造方法中调用父类的构造方法,super语句必须在第一句。
5.含有抽象方法的类是抽象类。接口是一种特殊的抽象类。
6.多态
特殊多态:相同的方法名,不同的参数列表或返回值类型(方法重载)。
参数化多态:泛型。
子类型多态:用接口(父类型)声明变量,用具体的实现赋值。
7.重载方法在编译阶段时决定具体调用哪个方法(静态类型检查),重写在运行时决定具体调用哪个方法(动态类型检查)。
8.重载必须有不同的参数列表;返回值、修饰词、异常可相同可不同;可以在本类或者子类中重载。
9.重载调用例子。具体调用哪个方法,取决于变量被声明的类型。
第二行:如果声明的是子类型,赋值也是子类型。方法调用时不满足子类方法参数要求,满足了父类方法参数要求,则调用父类方法。(重载时父类方法在子类中有备份)

10.重载和重写的区别

泛型

1.通配符:只能在使用时出现,不能在定义中出现。

2.运行时泛型会被擦除,不能使用instanceof()检查泛型种类。
3.不能创建泛型的数组。

子类型

1.子类型的规约不能弱化父类型的规约(从集合角度,子类是父类的真子集)。父类型能做的事子类型同样能做。
2.将子类型转化成父类型是安全的。因为任意的子类都是父类。

不可变类

1.写不可变类的要求
-没有mutator方法
-保证没有方法可以被重写
-成员域用private、final修饰
-防止表示暴露
-重写toString()、hashCode()、clone()、equals()等
2.一般将小的“值类型”设置成不可变类。如实验2的Position类、Piece类。

不可变类型的相等关系

1.相等是一种等价关系。等价关系的性质:自反、对称、传递。
2.用户角度:AF映射到同样的结果,则两个对象等价。
3.外部观察者角度:对两个对象调用任何相同的操作,都得到相同的结果,则认为两对象等价。
4.Java有两种操作判断相等:
-引用等价性(==)指向同一内存区域。一般用来判断基本数据类型。
-对象等价性(equals()),如果不被重写,和引用等价性相同。所以自定义ADT时要重写Object的equals。

5.尽量避免instanceof方法
重写equals方法时,使用继承避免调用instanceof

6.“相等”的对象,其hashCode()的结果必须相等。
7.哈希表工作原理
相等对象的哈希值一定相同,不同对象的哈希值可以相同,但是要尽量避免哈希冲突。

可变类型的相等关系

1.观察等价性:在不改变状态的情况下,两个对象是否看起来一致。
2.行为等价性:调用对象任何方法都展示出一致的结果。
3.可变类相等一般不需要重写equals方法,因为相等即意味着指向同一对象。
4.如果某个可变类对象包含在Set集合类中,当其发生改变时,集合类的行为不确定。就像照完身份证照片再整容。

重写equals方法参考:
List的contains()方法详解以及重写equals()方法时需要注意的地方

软件构造学习笔记-第六周相关推荐

  1. 软件构造学习笔记-第八周

    本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...

  2. 软件构造学习笔记(六)抽象数据类型

    目录链接 Part I Abstraction and User-Defined Types Part II Classifying Types and Operations Part III Abs ...

  3. 软件构造学习笔记-第三周

    本周介绍了软件开发的几种模型,并重点介绍了Git.Git是分布式版本控制系统,可以通过SSH key建立远程与本地的连接,通过Git Bash中的命令进行文件的上传和下载.对于这门课程,Git的主要作 ...

  4. 软件构造学习笔记-第十一周

    本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式.正则表达式用于对文本文件的处理.在实验3中有一项要求是对输入文本进行解析,构造航班.要求表达式不仅要读入合法数 ...

  5. 软件构造学习笔记-第五周

    本周讲了AF.RI.Safety from rep exposure.spec等概念.这些是辅助程序设计的重要部分,需要在代码中以注释的形式体现,可以显著提高代码可读性,明确设计的目的.必须要养成写的 ...

  6. 软件构造学习笔记-第十三周

    本周内容较少,主要介绍了断言以及防御式编程.断言一般用于程序开发阶段,用以快速发现错误,而在程序正式版本中则较少使用断言.一般来说,程序员使用(输入)的数据可以使用断言检测合法性,而用户输入数据则采用 ...

  7. 软件构造学习笔记-第七周

    本周只有一节课,内容较少.对于不可变类型的相等比较,需要重写equals和hashCode方法,实现观察等价性.对于可变类型,不建议重写以上两方法,按照默认比较方式(比较内存地址)即可. 可变类型的相 ...

  8. 软件调试学习笔记(六)—— 硬件断点

    软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...

  9. 软件构造学习笔记-第九周、第十周

    因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...

最新文章

  1. 2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片
  2. Thinkpad W520 完美安装Ubuntu14.04LTS
  3. 将列表转成数组_漫画 | 什么是散列表(哈希表)?
  4. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...
  5. ASP.NET MVC 2中的数据验证
  6. 异步编程的优势和难点
  7. oppo手机热点Android,OPPO手机怎么开启热点?OPPO手机共享网络的三种方法
  8. php trait 冲突的解决 insteadof
  9. 怎么安装vs2013配套的VASSISTX番茄助手
  10. 查看微信公众号的二维码
  11. Oracle_1th_查询语句
  12. ChatGPT 可以联网了!浏览器插件下载
  13. 如何创建内容安全策略(CSP 标头)
  14. PS学习笔记--操作篇
  15. 人工智能的“斯芬克斯之谜”
  16. web端 刷卡器_在WEB浏览器使用IC卡读卡器的几种方案的对比
  17. c语言遍历枚举,C# Enum 类型遍历
  18. 心跳PING PONG用法
  19. 无root卸载预装-adb的简单操作
  20. Nginx Rewrite研究笔记

热门文章

  1. Asp.Net Core 发布和部署(Linux + Jexus )
  2. 在ThoughtWorks工作12年的技术主管,所总结的12条技术人经验
  3. js ajax java传参_ajax参数传递与后台接收
  4. 【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据为例)
  5. 【ArcGIS遇上Python】ArcGIS Python中文编码问题案例详解
  6. 基于文本知识库的强化学习技术——Learning to Win by Reading Manuals in a Monte-Carlo Framework
  7. Oracle DBA
  8. 第4章 字符串和格式化输入/输出
  9. 抽走超大桌布之后保持桌面物体不掉,需要多快的速度?
  10. 三年租男友回家竟花了10万......