1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
1.2 可选:使用常规方法总结其他上课内容。
1.接口不是类,不能使用new进行实例化
2.使用instanceof运算符,可以查看该对象是否实现了Comparable接口
3.接口可以扩展extends
4.接口中可以包含常
5.一个类可以实现多个接口
参考资料:
百度脑图
XMind
2. 书面作业
Q1.代码阅读:Child压缩包内源代码
1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。
A:
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());
}
}
不能通过编译;这一句System.out.println(i);
会出错;应将private
改为protected
;结果如下
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。
A:不能通过编译;提示的错误是The type Parent is not visible;原因是Parent类不是public的
Q2.abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
A:在被改造之前,整个代码未使用抽象类,所以输入输出都由控制台控制,然而在改造之后,在GuessGame类中,输入输出均是抽象类,所以可以在控制台输入输出也可以在图形界面输出
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
A:先导入java.swing.*包,然后调用包里的方法开始界面设计;接着设计一个用来猜数字的图形界面的类并且继承Guess中的抽象类;最后重写抽象类当中的抽象方法
2.3 结合该例子,你觉得什么时候应该使用abstract?
A:包含抽象方法的类叫做抽象类,就需要使用abstract,abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。我觉得抽象类像是一个模板,有了抽象类,就能让很多方法在此基础上不断延伸和拓展,所以当有多个不同的方法来执行同一种功能时可以用上abstract,这样会方便些
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
A:在这个例子中,变化的是输入的方法,可以采用不同的方法输入,如从控制台输入、从对话框图形界面输入等等。不变的是抽象方法,它可以使用不同方法的输入、输出,完成一个猜数的游戏。我们根据需求的不同来具体决定到底使用何种输入输出方法。这个类是抽象的,即没有具体的输入、输出的的方法这个游戏就没有办法进行。所以我们要有具体的方法来实现,而具体的实现要通过继承来完成。因为抽象类的抽象方法是没有具体定义的,也就是说一个抽象类,没有别的类去继承它,就很没有意义。所以我们要有不是抽象类去实现抽象类的抽象方法。这个实现的过程就是继承,继承抽象类的方法,然后通过复写的形式来具体实现方法的细节
Q3.Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
A:Comparable接口将比较代码嵌入自身类中。在开发中我们可能会遇到需要将一些对象有序的放入到集合中,这时候我们只需要让类实现java.lang.Comparable接 口。因为Comparable接口只有public int compareTo(T o);
一个方法,所以覆盖compareTo这个方法即可实现自动排序,这样就不用自己写一个排序的方法
3.2 有了Comparable接口为什么还需要Comparator接口呢?
A:Comparable接口和Comparator接口,两个都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,Comparable接口是一个对象本身已经支持自比较所需要实现的接口。Comparator是一个另写一个外部类来实现的比较的接口
Q4.面向接口案例分析
阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?
A:StudenDaoListImpl使用动态容器ArrayList,而StudentDaoArrayImpl使用的是固定了大小为80的数组
Q5.什么是面向接口编程?面向接口编程的好处是什么?
A: 面向接口编程关注的是不同的类是否有共同的方法,不关心对象本身。题目3用到Comparable和Comparator两个接口,通过这两个接口,我们可以很方便地对自己定义的类进行比较,从而调用Arrays里面已经写好的sort()方法来排序。这个过程相当于面向接口编程。题目4也是如此,在Test类里面,我们只要关心数据到底是以何种数据结构来存放,不需要管具体的底层实现。用列表,数组都可以实现写入学生数据、读取学生数据和遍历学生信息的操作。这样一来就很方便,就如计算机的UAB接口,不管是要接U盘还是手机类的外设,只关心接口一致就可以,至于内容就不管。这样就无须知道对象是用什么类来实现的,只须知道定义接口的抽象类。
3. 码云上代码提交记录及PTA实验总结
题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类
3.1. 码云代码提交记录
在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2. PTA实验总结
通过实验熟练的掌握了Comparable接口和编写comparaTo方法。