1. 本章学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
1.2 可选:使用常规方法总结其他上课内容。
2. 书面作业
1. 代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
-
不能通过编译;
-
System.out.println(i);
会出错;
- 出错原因:父类中i定义为private类型,所以父类的i对于子类来说是不可见的;
- 改正:将父类中i的访问权限改大一点,如protected;
- 输出结果及分析:
c.getParenti();
调用public void getParenti()
输出父类的i,结果为1,c.getParentj();
调用public void getParentj()
依次输出父类的j、父类的j、父类的i、父类的i,结果为2、2、1、1,Other.showParentj(p);
调用public static void showParentj(Parent p)
输出父类的j、父类的i,结果为2、1。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
- 不能通过编译;
- 原因:这里Parent类默认是包访问权限,OutOfParentPackage在Parent包之外,所以访问不到。
1.3 回答:如果为了访问到protected
修饰的属性或方法应该怎么办?
- 被声明为protected的成员,相同包中的类可以直接存取,不同包的类可以在继承后的子类直接存取。
2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
- 改造前,未使用抽象类,只能控制台输出;
- 改造后,使用抽象类,可以在控制台,也可以使用对话框图形界面等输入,即使取得用户输入、显示结果的环境未定,但猜数字的流程可以先操作。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
- 继承已定义的abstract抽象类,设计一个图形界面猜数字的类。
2.3 结合该例子,你觉得什么时候应该使用abstract
?
- 某方法区块中没有任何程序代码操作,可以使用abstract表示该方法为抽象方法;
- 根据不同需求编写程序,在某些要求未确定时可用abstract类,先完成可操作的流程,再针对新需求编写程序,这样原有程序无需修改,保持程序弹性和可维护性。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
- 变化的是程序所可能运行的环境;
- 不变的是程序本身的框架,后续只需根据不同的需求添加不同的类即可。
3. Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
- 用途:对实现它的每个类的对象进行整体排序,任何实现Comparable接口的类,都必须实现该方法;
- 查询jdk文档,发现Arrays有一个方法
public static void sort(Object[] a)
功能:根据元素的自然顺序对指定对象数组按升序进行排序, 数组中的所有元素都必须实现Comparable
接口,Arrays.sort
可以对所有实现了Comparable接口的对象进行排序,所有实现Comparable的对象都有一个共同的特性---可以被比较,具体体现在均拥有compareTo方法,即拥有共同的行为。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
- Comparable接口只能按照一种规则排序,当需要对多个对象或类型排序时,就显得不够方便,而使用Comparator接口可以编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,在调用Arrays的sort()时将排序类对象作为参数传入,可以按照多种方式排序。
3.3 可选:使用匿名内部类、Lambda表达式实现PTA编程5-2。
4. 面向接口案例分析,阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
- Student类:name属性,getter/setter和toString()方法;
- StudentDao接口:提供三个抽象方法,写入学生数据、读取学生数据和显示所有学生信息;
- StudentDaoArrayImpl类:用数组来存放学生信息,具体实现接口的三个抽象方法;
- StudenDaoListImpl类:用ArrayList来存放学生信息,具体实现接口的三个抽象方法。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
- StudenDaoListImpl用ArrayList储存对象,StudentDaoArrayImpl用数组储存对象。
5. 什么是面向接口编程?面向接口编程的好处是什么?
结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!
- 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
- 在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
- 使用接口,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,另一个好处就是不同部件或层次的开发人员可以并行开工。
- 所谓面向接口编程,就是代码是与接口相关联的(比如Comparable接口),而不需要考虑具体的实现类,只要某个类(如Employee)实现了相关的接口(如Comparable),我们编写的面向接口(如Comparable)的代码就可以适用。
- 在题目3中,使用了
Comparable
和Comparator
两个接口,Comparable接口实现了对对象某一特征的比较,而Comparator接口则可以实现对对象多个特征的比较,而不用针对每个特征都单独写比较函数。根据题目的需求,共同的东西是排序算法,不同的东西,是排序中比较的条件。 - 在题目4中,
StudenDaoListImpl
和StudentDaoArrayImpl
都实现StudentDao
接口,都可以用于储存学生信息,只是储存形式不同罢了。 - 在java中,继承会有“是一种”的关系,操作接口则表示“拥有行为”。使用接口,我认为可以更好的解决需求变化,不同的对象可能有不同的特征,不同的特征可能又会有这样那样的联系,在实际操作中要一一单独实现工作量太大,也会使程序显得累赘,要善于抓住共同的东西,我觉得接口就是这样一种“工具”,集合不同对象的共同之处集中操作。刚学程序时就说写程序要有弹性,要有可维护性,什么叫有弹性?何为可维护?需求总是无止境的,可能一会儿要加这个功能,一会儿又要区分那个功能,总不能每增加一个功能就重新设计一次程序吧。说到可维护,又想到工作效率的问题。如上面猜数字的题目,运行环境未定,有时候不能等别人完成任务的时候我们再去做,我们可以先把程序架构写好,把调用接口的上层同时写出来,再根据不同需求编写程序。
6. 结对编程:面向对象设计(大作业2-非常重要)
内容:使用Java代码完成上周做的面向对象设计大作业,需要有初步界面。实现的功能尽量简单,少而精,只包含必要的功能,不要追求高大全。
写出:类图(尽量精简,不用太多子类,两个即可)、系统常用功能描述、关键代码与界面
形式: 两人依托码云合作完成。请在这里贴出你们的学号、姓名与任务分工。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化大的是输入与输出部分。所以编码的时候,输入(Scanner)与输出(System.out)的代码,请不要将其与某个业务处理函数绑死。
选做加分: 给出两人在码云上同一项目的提交记录截图,额外加分。注:两个人在码云上新建一个项目。
6.1 提交作业的结构
学生A | 学生B | 项目地址 |
---|---|---|
http://www.cnblogs.com/ghnb/ | 没有队友 |
6.2 常用功能描述框架图
6.3 关键代码
6.4 运行界面
3. 使用码云管理Java代码
4. PTA实验总结
5-1
public int compareTo()
函数里要注意不同的情况返回的是1还是-1;- PTA上提示答案错误而找不到错误时,可以多测试几组数据多对比一下,起先只测试了两组数据没有发现问题,显示答案错误,当一次输入五组数据时就发现错误了;
- 比较name值的大小应使用
compareTo
函数。
5-2
if(o1.getName().compareTo(o2.getName())>0) return 1;
这里需要用到get函数获取name的值,与5-1不同,age值得获取也是如此;Arrays.sort(person, new NameComparator());
sort函数的调用应为此格式。- 注意花括号的对应,给一个花括号坑了好久。。。半天找不到错误也是罪了。。。
5-3
- 关于栈的知识需要再回顾一下。
5-4:
- 对内部类还不是很熟悉,还要再多看看书;
- 比较最大值最小值的方法还能不能改进;
- 注意输出格式
System.out.println(arr.findMinMax(array));
,System.out.println(Arrays.toString(array));
输出的是数组中的所有元素。