MIT软件构造 -- ADT Patterns: Interfaces, Generics, and Enums
接口(Interfaces)
基本概念不再赘述,值得注意(记住)的有几点:
- 接口不应该有构造函数
- 只有静态方法才能拥有方法体
- 接口实现不能破坏表示不变性
- 接口实现可以添加接口没有的方法,但是不能缺少接口声明的方法
- 接口实现不应该违背接口规约(比如接口规约声明为不可变类型,但在实现类里加入了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拥有了自己的特色。
接口的好处
- 接口可以让编译器帮忙检查ADT(实现类)的明显错误
- 提供多种功能,不同实现方法在不同操作上可能效率不同
子类(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相关推荐
- 软件构造—ADT的理解
最近学习了ADT,即抽象数据类型,刚学的时候理解的不是很好,在完成lab2的过程中,我对ADT的构造以及作用有了一定的理解.(以下仅是我个人理解,很可能会有错误,请批评指正) 一.ADT的定义: 首先 ...
- 哈工大软件构造期末知识点总结
哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...
- 软件构造LAB2心得
目录 1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 P ...
- 哈工大软件构造笔记1
1.1Multi-dimensional software views 1.软件构造中的多维视图 ·Moment维度关注于程序在某一时刻的表现,而Period关注的是程序在一段时间内的表现. ·Bui ...
- 软件构造Lab2问题解决思路及感想
1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3.1 Poetic Walks 1 3.1.1 Get the code and prepare Git repository 1 3. ...
- 软件构造Lab2总结
2020年春季学期 计算机学院<软件构造>课程 Lab2实验报告 ·· 1 3.1 Poetic Walks· 1 3.1.1 Get the code and prepare Git r ...
- 软件构造课程心得——软件构造实验二(Lab2)
软件构造课程心得--Lab2 1. 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象 编程(OOP)技术实现 ADT.具体来说: 针对给定的应用问题,从问题描述中识别 ...
- 软件构造lab2 - 实验报告
软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...
- 哈工大2020软件构造Lab2实验报告
本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...
最新文章
- 命令别名的设置alias,unalias
- 使用python实现多维数据降维操作
- 2020 ICPC 济南 F. Gcd Product
- Open Live Writer测试
- 索引体积_米家温湿度计体积虽小,耗电不小,如果经常离线,换颗电池吧
- Dining POJ - 3281
- BOMTool更新到1.3.0.10
- 27.TCP/IP 详解卷1 --- FTP: 文件传输协议
- mysql 注释几种方法
- 基于Spring Boot房产销售平台的设计与实现【源码+论文】分享
- spring及boot注解
- 《数据库系统概念》第一章:引言
- python matplotlib 双y轴图像实现
- 手把手教你如何快速制作电子书
- python itchat库_用python【itchat】库获取群聊信息的正确姿势
- 罗马音平假字复制_五十音图的那些平假字和片假字有罗马音吗?
- 一个小点阵图像JPG图片做吗?
- java走马灯_用java编写的一个简单走马灯程序
- android日历事件 简书,iOS EventKit 添加日历及提醒事项(重复提醒)
- iPhone换屏幕测试软件,iPhone7换屏前怎样测试
热门文章
- 2021 年软件工程现状:Python 或将成为第一大编程语言,中国开源涨势最猛
- 2所“双一流”大学官宣:博士招生考试,延期!
- 量子科技概念大火,国内现状如何?华为BAT均入局量子计算
- 干货!639页《深度学习:Deep Learning》硬核课程PPT
- 写给小白的计算机概论
- 结合图拉普拉斯的半监督学习
- c语言虚参传递字符串,c语言中,一个函数作为另一个函数的虚参是什么意思? 先谢了...
- linux中dump文件怎么生成,linux下设置core dump文件生成的方法
- 展望10年内VR技术的盈利模式的发展历程
- vue中 vue-router的路由的2种模式 (原生js模拟演示)