第5周作业-继承、多态、抽象类与接口
1. 本周学习总结
1.1 思维导图总结:
1.2在本周的学习中,主要学习了以下几点:
- 初步接触了接口的定义,用interface关键字定义接口,使用implements关键字操作接口
- Arrays.sort是面向Comparable接口的编程,要实现排序,就先要比较,也就是必须要先实现Comparable接口,实现该接口就是实现其中的CompareTo方法。还有Comparator接口的使用
- 接口的语法特性:不可以用new实例化;可以使用instancof运算符查看是否实现了接口;可以用extends进行扩展;接口中可以包含常量,用public static final修饰;一个类可以实现多个接口
- 继承体现了is—a关系,接口体现了has-a关系,两者均可体现多态
2. 书面作业
1.代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
答:出错是因为“i”被private权限修饰,被封装了,在其他的类中不能被直接引用。只能通过父类提供的方法实现。在Child类中,getParenti方法是想输出“i”的值,若Parent类可以被改变,则可将“i”定义为protected即可输出;不然则用this或super来调用父类的方法实现。因为被protected定义的在相同包内可以直接存取。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?
答:因为Parent类没有定义权限关键词,所以权限范围默认是包范围,不同包类的不可存取。修改如下:
import com.parent.*;
public class OutOfParentPackage {
public static void showParentj(Parent p){
System.out.println(p.getJ());
System.out.println(p.geti());
p.getj();
}
}
package com.parent;
public class Parent{
private int i=1;
protected int j=2;
public int geti(){
return i;
}
public void getj(){
System.out.println(j);
}
public int getJ() {
return j;
}
}
2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
答:这样改造可以构造出一个固定的一组行为的抽象描述,这组行为能够有任意个可能的具体实现方式。可以在文本模式下执行,也可以用窗口程序执行,也可以用网页,这就扩展了此模块的行为功能,大大增强了他的可行性。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
答:使用Swing组件,AWT图形界面库和Java2D绘图吧......
2.3 结合该例子,你觉得什么时候应该使用abstract?
答:abstract类可以使得类的设计者能够创建方法的原型,而真正的实现留给使用这个类的人。正如该例子,当我们在做一个比较复杂的项目时(假设),一些简单的方法(比如:游戏的主体go()方法部分),或者说一些项目的主干部分,就可以马上先写出来,但有一些方法比较复杂,或者说像例子中那样对搭建环境平台有要求,而且有可能具体环境都不清楚是哪个,这种时候在不同的类中就需要不同的实现,此时就需要用到abstract。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
答:不变的是游戏的主体,也就是go()方法。变化的是显示输出、取得用户输入的部分。在改造之前是直接输出,程序结构单一;改造之后,将游戏的主体写入抽象类GuessGame中,将执行输入输出的部分定义为抽象方法,然后再撰写ConsoleGame类,继承抽象类GuessGame,操作当中的抽象方法,然后再在main函数中创建出ConsoleGame实例,执行ConsoleGame中定义的流程,也就是游戏的主体go()方法。
3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
Comparable接口的用途是,当某些对象想实现接口的类时,会被强行排序。
答:Comparable接口的用途是强行对实现它的每个类的对象进行整体排序。因为Comparable位于包java.lang下,而java.util.Arrays类继承了java.lang.Object类,由继承的概念可知,相当于Arrays继承了这个接口的操作。所以当某个类实现了Comparable接口,就可以直接使用Arrays.sort对其进行排序了。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
答:1.Comparable位于包java.lang下,而Comparator位于包java.util下,显然默认为Comparable下的方法。
2.首先,Comparable是在集合内部定义的方法实现的排序,compareTo方法是放在对象类里面的,在集合内部现实compareTo的方法。Comparator是在集合外部实现的排序,compare是放在比较对象的类外面的,需要在集合外定义compare的方法,也就是再写一个类,而且需要导入java.util.Comparator类。
3.其次,自定义的类要加入List容器后才能够排序,如果不指定Comparator,那么就实现Comparable接口设定的排序方法。
4.Comparator是一个专用的比较器,当这个对象不支持自比较函数或者自比较函数不能满足要求时,可以写一个比较器来完成两个对象之间大小的比较。
5.简单说,Comparable接口是一个对象本身已经支持自比较所需要实现的接口。Comparator是一个另写一个外部类来实现的比较的接口。
6.例如:Student类实现Comparable接口,先按照age进行排序,如果age相等时再按照name进行排序。Comparator则是可以按照age进行排序或按照name进行排序等等。
4.面向接口案例分析,阅读Case-StudentDao.zip案例:
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
答:StudenDaoListImpl使用了ArrayList存储数据,实现了List接口。所以它的代码量就比较少,而且简洁明了,java.io.File;java.io.FileNotFoundException;java.io.PrintWriter后还能以文本形式存储。而StudentDaoArrayImpl使用了数组存储信息,主要是以一段连续内存保存数据的,随机访问是最快的,但不支持插入、删除、迭代等操作,适合在操作和数据较少时使用。
5.什么是面向接口编程?面向接口编程的好处是什么?结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
答:1.所谓面向接口编程,就是代码与接口相关联的(如StudentDao接口),而不需要考虑具体的实现类(如StudentDaoArrayImpl类,StudenDaoListImpl类)。如Test.java中,当StudentDaoArrayImpl类实现了StudentDao接口,其中编写的面向接口的代码(如:其中的writeStudent();readStudent();diplayAllStudent()方法)就可以使用了。
2.好处:IDP原则。接口和实现分离了。如Test.java所示,要往后台写数据时,因为这是面向面向接口编程,我可以选择写入不同的后台,数据库、文件、数组、List都可以,他们都具有相同的功能,只是实现的方式不一样罢了。既方便,又省事。
**6. 结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
第6题提交作业的结构:
6.1
学生A | 学生B | 项目地址 |
---|---|---|
学生A的博客连接 | 学生B的博客连接 | 项目码云地址 |
6.2 常用功能描述框架图 | ||
6.3 关键代码 | ||
6.4 运行界面** |
3. PTA实验总结及码云上代码提交记录
3.1本周Commit历史截图
3.2 实验总结
这周的实验不算很难,前两道题是对操作接口的简单应用,第二题里的NameComparator类和AgeComparator类采用了上机课时老师教的直接return的方法,一行代码就完事了,很简洁。所以以后在写代码的时候要善于利用一些巧妙的手法。比如说:Comparable接口的compareTo方法中只会返回0,1,-1
值,所以可以直接`return p1.getAge()-p2.getAge();