作业05-继承、多态、抽象类与接口
1.本周学习总结
1.1写出你认为本周学习中比较重要的知识点关键词。
关键字:接口,interface关键字,implements关键字,has-a关系,Comparable,abstract。
1.2尝试使用思维导图将这些关键词组织起来。注:思维导图一般不需要出现过多的字。
1.3 可选:使用常规方法总结其他上课内容。
2. 书面作业
PTA题集:面向对象2-进阶-多态、接口与内部类
1. 面向对象设计大作业(团队项目,2-3人)
内容:继续完善上次的大作业。
注意:再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化较大的地方的是输入与输出部分。编码的时候,请不要将处理输入(System.in)与输出(System.out)的代码与某个业务处理方法绑死。
作业提交结构如下:
1.1 项目简介表格:
项目码云地址(点击后要求可直接跳到该项目首页)。
团队成员表格
学生 | 负责任务 | 博客地址 |
---|---|---|
郑玉波 | User类,ShoppingCart类 | 郑玉波的码云地址 |
占恒 | Commodity类,WalMart类 | 占恒的码云地址 |
1.2 系统常用功能框架图
提示:在XMind文本方框中,可通过按Shift+Enter将字竖起来。
1.3 系统总体类图
1.4 购物车、商品、系统关键代码截图(主要截取自己负责的部分)
因为还没有学到使用文件,所以现在的登录与注册只有大体框架。
1.5 其他:跟上次的系统比较,系统的设计等有何修改。其他感想。
和上次有所不同,在建议下将登录和注册作为方法而不是类,且放在了WalMart类中。
2. abstract:阅读GuessGame抽象类的设计与使用源代码
Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法,看起来更复杂,这样的改造到底有什么好处呢?
改造之前:
改造之后:
这样子改造将所要输入和输出的数字抽象化,这样子就可以不仅仅在控制台进行这个猜字游戏,如果想在图形界面等其他地方实现这个游戏就会非常方便,这个程序就非常灵活了。
2.2 GuessGame(改造后).java
中有抽象方法与非抽象方法,你觉得抽象类中什么样的方法应该声明为abstract
,什么方法不需要声明为abstract
直接实现即可。
显然输入输出这个方法需要声明为abstract,方便在不同环境下实现。而将所输入的数字与随机数字进行比较可以不用声明为抽象方法,因为不管在什么环境下这个方法都是一样的。
2.3 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract等概念进行说明。
很显然,运行环境是变化的,在文本下,在控制台上或者在图形界面等等,但是这些方法是不变的,都是输入输出,比较数字的函数也是相同的。虽然输入输出的方法是抽象的,但是当出现了某个类用来告诉我们实现的环境是在哪里时,这几个方法也变得具体了。正如三生万象,一个抽象最后会变成很多种的实现。当抽象的方法被用到了,就实现了继承的思想。
3. Comparable与Comparator
3.1 结合PTA 7-1中你的代码说明,为什么某个类实现了Comparable接口,就可以直接使用Arrays.sort对该类型的数组进行排序?
总所周知,Arrays类中的sort方法是可以对对象数组进行排序的,但是这是有前提的,就是所传入的对象必须实现了接口Comparable(java.lang),而且还要覆盖compareTo这个方法。
3.2 结合PTA 7-2 中你的代码说明,有了Comparable接口为什么还需要Comparator接口呢?
因为用到了Arrays.sort进行排序,而它是对所有实现Comparable的对象进行排序。如果这个时候相对某一个对象进行排序,那仅仅的Comparable是不行的,这时Comparator出场了,它和Comparable不一样的是,Comparator接口是在一个独立的类中进行比较的,而且它可以指定排序的顺序。
3.3 以前的作业Shape, Rectangle,Cirlce中,Shape类中什么方法应声明为abstract?说出原因。
方法1abstract double getArea();
和abstract double getPerimeter();
声明为抽象方法,因为对于抽象类Shape,可以是很多不同的图形,但是他们的面积和周长的求法不一样,所以要定义为抽象的。
3.4 有很多Shape类型对象如Rectangle、Circle。希望使用Arrays.sort对他们进行排序,请写出相应代码。并简述应在哪个类上实现Comparable接口比较好?
应在Shape类类里实现接口比较好。
3.5 以3.4你编写的代码为例,简述面向Comparable接口编程、面向父类编程的好处。(注意:一定要结合自己编写的代码)
我在Shape类中实现接口,那么在Rectangle类、Circle类中就能实现Comparable,这样最后可以直接对Shape使用Array.sort进行排序,增加了许多灵活性。
4. 面向接口案例分析
4.1 a.画出类关系图。b.StudentDao接口有什么用?
a.
b.StudentDao接口建立了三个方法,判断学生信息写入是否成功,读取学生的信息和展示全部学生信息。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何共同之处?有何区别?
公共点是都是实现对学生信息的写入等,不同点是StudenDaoListImpl是使用了ArrayList来动态实现的,但是StudentDaoArrayImpl是用数组来实现的。
4.3 结合Test.java中的main函数,简述面向接口编程的好处。
好处:
1.更加抽象,更加面向对象
2.提高编程的灵活性
3.实现高内聚、低耦合,提高可维护性,降低系统维护成本。
这个代码是来存放学生的信息的,在Test的类里面我们可以不用知道如何实现的,StudenDaoListImpl与StudentDaoArrayImpl两种不同的结构都能实现写入并读取学生的信息,方便了许多,更加的结构化并提高了编程的效率。
5. 什么是面向接口编程?面向接口编程的好处是什么?
结合题目4案例中的Test.java的代码进行分析。不要百度原封不动照搬!
面向接口的编程方式是面向对象设计的一个原则,使用这种编程思想,我们可以容易地写出具有可复用性的代码,这对于代码的理解和维护具有很大的帮助
都知道接口不允许实例化,也就是说面向接口的编程和面向实现编程不一样,比如对于汽车所用的轮胎,拿面向实现说,可能就要考虑轮胎的品牌,性能等,会降低编程的灵活和可复用的性能。但是面向接口编程不在乎轮胎的品牌,能转动就行。这样就大大增强灵活性和可复用性。
3.码云及PTA
题目集:面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 191 | 191 | 18 | 18 |
2 | 571 | 380 | 19 | 1 |
3 | 1027 | 456 | 20 | 1 |
4 | 0 | 0 | 0 | 0 |
5 | 1359 | 332 | 25 | 5 |
6 | 2061 | 702 | 35 | 10 |