1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
1.2 可选:使用常规方法总结其他上课内容。
答:关于接口:
1.接口是一种抽象,抽取出了共同行为;
2.能够更加清晰地把系统的实现细节与接口分离,调用时只需要关心接口就行了;
3.接口是用于描述系统对外提供的所有服务,客户只需要针对接口编程即可。
2. 书面作业
1. 代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
答:代码如下:
package parent;
public class OutOfParentPackage{
public static void showParentj(Parent p){
System.out.println(p.j);
System.out.println(p.geti());
p.getj();
}
}
class Parent{
private int i=1;
protected int j=2;
protected int geti(){
return i;
}
public void getj(){
System.out.println(j);
}
}
class Other{
public static void showParentj(Parent p){
System.out.println(p.j);
System.out.println(p.geti());
}
}
public class Child extends Parent{
public static void main(String[] args){
Parent p = new Parent();
Child c = new Child();
c.getParenti();
c.getParentj();
Other.showParentj(p);
}
public void getParenti(){
System.out.println(i);
}
public void getParentj(){
System.out.println(super.j);
System.out.println(j);
System.out.println(geti());
System.out.println(super.geti());
}
}
1.com.parent包中Child.java文件不能编译通过;
2.System.out.println(i);这一句会出错;
3.因为Parent()中的I被private(类外部无法对其直接访问)修饰,子类无法访问;
4.将private int i=1;改为protected int i=1;
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?
答:
1.另外一个包中的OutOfParentPackage.java不能编译通过;
2.提示的错误是The type Parent is not visible;Parent类无法访问;
3.原因是parent()没有被public修饰,系统默认只能在包内被访问,而OutOfParentPackage在包外,无法访问parent();
4.给parent()加上public关键字。
2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
答:
1.改造前,未使用抽象类,只能控制台输出;
2.改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入,能够更加清晰地把系统的实现细节与接口分离,只需要针对抽象类编程即可。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
答:设计一个用来猜数字的图形界面的类继承Guess中的抽象类,在图形界面进行输入输出的操作。
2.3 结合该例子,你觉得什么时候应该使用abstract?
答:抽象类就应该使用abstract进行修饰,这个类将不能生成对象实例,可以做为对象变量声明的类型。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
答:
1.变化的是输入输出环境(控制台、对话框、图形界面等);
2.没有变化的是抽象类(abstract),即输入输出是为了完成猜数游戏,与具体的环境无关,就像通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
3. Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
答:
1.通过接口可以实现不相关类的相同行为,让一个类具有了各种无限的可能,并且相同接口的类,不一定要有继承关系;
2.所有实现Comparable的对象都有一个共同的特性:可以被比较,Arrays.sort就是面向Comparable接口进行编程,所以实现了Comparable接口就可以直接使用Arrays.sort对其进行排序。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
答:Comparable接口和Comparator接口都可以用来实现集合中元素的比较、排序,但ComparableComparable 定义在 Person类的内部,是在集合内部定义的方法实现的排序,Comparator定义在Person的外部,是在集合外部实现的排序,Comparable接口是一个对象本身已经支持自比较所需要实现的接口。
3.3 可选:使用匿名内部类、Lambda表达式实现PTA编程5-2。
4. 面向接口案例分析
阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
答:
Student类:初始化String name,被StudentDaoArrayImpl和StudenDaoListImpl引用;
StudentDaoArrayImpl类:对StudentDao接口操作,用数组来存放学生信息,包含方法Student readStudent(String name) 、boolean writeStudent(Student student) 和void diplayAllStudent();
StudenDaoListImpl类:对StudentDao接口操作,用列表来存放学生信息,包含方法Student readStudent(String name) 、boolean writeStudent(Student student) 和void diplayAllStudent();
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
答:StudenDaoListImpl是ArrayList(动态)的,大小可以随student的改变而改变;而StudentDaoArrayImpl是用数组实现的,数组的大小和数据类型都已经固定了。
5. 什么是面向接口编程?面向接口编程的好处是什么?
结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
答:
什么是面向接口编程:个人理解是使用同一个方法解决不同问题,定义一个类,使得其他引用对象不需要再次编程就能实现功能,简化了编程过程,提高效率,节省时间,类似于造一架飞机,坐飞机的人不需要知道这架飞机是怎么造出来的,也能乘坐这架飞机到达目的地;
为什么要用接口 :用于处理多变的情况,接口在实际开发过程中最大好处是,可以按照设计,先把接口写好,然后在具体实践的时候,可以用已经写好的接口去实现具体功能,再写那些已经写好但是没有具体的代码的接口,这样可以提高工作效率。
6. 结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
参考资料:
结对编程参考资料
可以使用Processon画图
第6题提交作业的结构:
6.1
学生A | 学生B | 项目地址 |
---|---|---|
http://git.oschina.net/dfcat | http://git.oschina.net/gemola | http://git.oschina.net/dfcat/java |
我从另一个项目里直接拉了个人过来,还没开始做。。。
6.2 常用功能描述框架图
6.3 关键代码
6.4 运行界面
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2. PTA实验
继续完成前面未完成的实验面向对象1-基础-封装继承
函数(选做:4-1)、编程(5-1, 5-2)
一定要有实验总结
答:由于Arrays.sort不能对自定义对象进行排序,我就想把PersonSortable类的数据用toString强制转换成字符串进行比较,用Comparable接口使得Arrays.sort生效。