第5周-继承、多态、抽象类与接口
1. 本周学习总结
2. 书面作业
Q1.代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
答:
不能通过编译。System.out.println(i)这句出错了。 改为System.out.println(geti()); 出错的原因:Child的父类定义i为private,只限在类内部调用。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
答:
不能通过编译。private的权限很小,无法在其他包中访问。
1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?
答:
继承或间接继承与这个类的子类中可以访问。
2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
改造前,未使用抽象类,只能控制台输出改造后,使用抽象类,不止可以在控制台,也可以使用其他方式输出。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
重写抽象类当中的抽象方法,设计一个新的类去继承2.1中提到的抽象类。
2.3 结合该例子,你觉得什么时候应该使用abstract?
如果后来想修改类的界面以适应新的情况时,就会非常的麻烦,可能要花费很多的时间。但是如果界面是通过abstract class来实现的,那 么可能就只需要修改定义在abstract class中的默认行为就可以了。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
变化的是输入的环境输入的方式,不变的是抽象类的本身,还有这个游戏的功能。
3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
Comparable接口对实现它的每个类的对象进行整体排序。比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
3.2 有了Comparable接口为什么还需要Comparator接口呢?
类的设计师没有考虑到比较问题而没有实现Camparable接口,我们可以通过Comparator来实现排序而不必改变类本身。现Comparable只能定义一种比较方法即compareTo(),但是有时候会对一个集合进行不同的排序方法,此时就可以提供别各种各样的Comparator来对集合排序,而对于要排序的元素不需要更改,所以我觉得Comparator提供了更多的灵活性。
4.面向接口案例分析,阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
StudentDaoArrayImpl使用的是数组来存储students对象(需输入学生数量),StudenDaoListImpl使用的是ArrayList来实现的。