接口(Interfaces)

基本概念不再赘述,值得注意(记住)的有几点:

  1. 接口不应该有构造函数
  2. 只有静态方法才能拥有方法体
  3. 接口实现不能破坏表示不变性
  4. 接口实现可以添加接口没有的方法,但是不能缺少接口声明的方法
  5. 接口实现不应该违背接口规约(比如接口规约声明为不可变类型,但在实现类里加入了mutator)

子类型(subtype)

a是b的子类型,则a要么implement b,要么extend b。
a是b的子类(subclass),则a extend b。

(随着接口的提出,java似乎是第一个跳出来说出子类型与子类是有区别的语言,并在某种意义上不鼓励继承,而推崇接口与实现。)

Q: ArrayList是可变的,List.of()是不可变的,它们都是List的合法子类型,那么List到底是可变还是不可变的呢?
A: 答案是模糊的,事实上List、Map、Set等接口的规约中对此接口ADT到底是可变还是不可变的并没有明确的声明。同时要注意的是,子类型的规约强度应高于产生子类型的类型的规约强度(precondition变弱或postcondition变强)

泛型(Generic Types)

泛型的提出让java设计的重用性变得更上一层楼,它与接口相互结合,让java拥有了自己的特色。

接口的好处

  1. 接口可以让编译器帮忙检查ADT(实现类)的明显错误
  2. 提供多种功能,不同实现方法在不同操作上可能效率不同

子类(Subclass)与继承

继承父类与实现接口的区别在于rep也会从父类传到子类,但是非严格继承是容易产生错误的(此部分原文没有)

final对继承的影响:

final修饰父类方法,子类无法重写
final修饰父类,不能继承

非严格继承

子类中重写了父类的方法(难保证语义没有改变)
辨析下面的例子

 class Animal(){public void eat(){}}class Duck extends Animal(){public void eat(String food){}}

运行下面的代码,结果分别是什么?

Animal test = new Animal()
test.eat()      //正确使用Duck duck = new Animal()
duck.eat()      //正确使用  Duck中有父类的eat方法Animal test1 = new Duck()
test1.eat()     //正确使用Duck duck1 = new Duck()
test.eat("food")      //正确使用Animal test2 = new Animal()
test2.eat("food")     //错误使用Animal test3 = new Duck()
test3.eat("duck")     //错误!test3虽然是指向Duck的引用,但本身是Animal类,并没有eat(String s)方法

初学者很容易出现第第六块的错误,解决方法如下:

1、直接用Horse类声明,就像第四块
2、向下转型,原则上第六块的错误是向上转型导致的
3、在Animal类中声明eat(String s)方法

MIT软件构造 -- ADT Patterns: Interfaces, Generics, and Enums相关推荐

  1. 软件构造—ADT的理解

    最近学习了ADT,即抽象数据类型,刚学的时候理解的不是很好,在完成lab2的过程中,我对ADT的构造以及作用有了一定的理解.(以下仅是我个人理解,很可能会有错误,请批评指正) 一.ADT的定义: 首先 ...

  2. 哈工大软件构造期末知识点总结

    哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...

  3. 软件构造LAB2心得

    目录   1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 P ...

  4. 哈工大软件构造笔记1

    1.1Multi-dimensional software views 1.软件构造中的多维视图 ·Moment维度关注于程序在某一时刻的表现,而Period关注的是程序在一段时间内的表现. ·Bui ...

  5. 软件构造Lab2问题解决思路及感想

    1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3.1 Poetic Walks 1 3.1.1 Get the code and prepare Git repository 1 3. ...

  6. 软件构造Lab2总结

    2020年春季学期 计算机学院<软件构造>课程 Lab2实验报告 ·· 1 3.1 Poetic Walks· 1 3.1.1 Get the code and prepare Git r ...

  7. 软件构造课程心得——软件构造实验二(Lab2)

    软件构造课程心得--Lab2 1. 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说: 针对给定的应用问题,从问题描述中识别 ...

  8. 软件构造lab2 - 实验报告

    软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...

  9. 哈工大2020软件构造Lab2实验报告

    本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...

最新文章

  1. 命令别名的设置alias,unalias
  2. 使用python实现多维数据降维操作
  3. 2020 ICPC 济南 F. Gcd Product
  4. Open Live Writer测试
  5. 索引体积_米家温湿度计体积虽小,耗电不小,如果经常离线,换颗电池吧
  6. Dining POJ - 3281
  7. BOMTool更新到1.3.0.10
  8. 27.TCP/IP 详解卷1 --- FTP: 文件传输协议
  9. mysql 注释几种方法
  10. 基于Spring Boot房产销售平台的设计与实现【源码+论文】分享
  11. spring及boot注解
  12. 《数据库系统概念》第一章:引言
  13. python matplotlib 双y轴图像实现
  14. 手把手教你如何快速制作电子书
  15. python itchat库_用python【itchat】库获取群聊信息的正确姿势
  16. 罗马音平假字复制_五十音图的那些平假字和片假字有罗马音吗?
  17. 一个小点阵图像JPG图片做吗?
  18. java走马灯_用java编写的一个简单走马灯程序
  19. android日历事件 简书,iOS EventKit 添加日历及提醒事项(重复提醒)
  20. iPhone换屏幕测试软件,iPhone7换屏前怎样测试

热门文章

  1. 2021 年软件工程现状:Python 或将成为第一大编程语言,中国开源涨势最猛
  2. 2所“双一流”大学官宣:博士招生考试,延期!
  3. 量子科技概念大火,国内现状如何?华为BAT均入局量子计算
  4. 干货!639页《深度学习:Deep Learning》硬核课程PPT
  5. 写给小白的计算机概论
  6. 结合图拉普拉斯的半监督学习
  7. c语言虚参传递字符串,c语言中,一个函数作为另一个函数的虚参是什么意思? 先谢了...
  8. linux中dump文件怎么生成,linux下设置core dump文件生成的方法
  9. 展望10年内VR技术的盈利模式的发展历程
  10. vue中 vue-router的路由的2种模式 (原生js模拟演示)