201521123067 《Java程序设计》第5周学习总结
1. 本周学习总结
1.1 尝试使用思维导图总结有关多态与接口的知识点。
1.2 可选:使用常规方法总结其他上课内容。
●在本周的学习中,我知道了接口可以用于定义行为,但不能定义操作,如果某方法没有操作,可直接标示为abstract,而且一定是public。
●在学习接口时,我还明白了类要操作接口,必须使用implements关键字。操作某接口时,对接口中定义的方法有两种处理方式:一是操作接口中定义的方法,二是再度将该方法标示为abstract。
2. 书面作业
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());
}
}
答:com.parent包中Child.java文件不能编译通过,System.out.println(i);这一句会出现错误。要将com.parent包中Parent.java文件里的private int i=1改为protected int i=1。(如图)
我在Eclipse上修改并运行了此段代码,下图是修改后的运行结果。
1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。如何更改才能使之正常编译?(写不出来正确答案不要紧,但请一定写出思考过程)
答:另外一个包中的OutOfParentPackage.java,不能编译通过,提示的错误是The type Parent is not visible.发生这个错误的原因在于Parent类不是public的。要将Parent类改为public才能使之正常编译。
(2)abstract进阶:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?
答:这样有利于程序的可扩展性,如:我只要这个父类的方法,而不需要在父类中写死实现方法,则可以定义为抽象的,而交给相应的子类实现,不同的子类可以有不同的实现。
2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?
答:首先要导入java.swing.*包,然后调用包里的方法开始界面设计;接着设计一个用来猜数字的图形界面的类并且继承Guess中的抽象类;最后重写抽象类当中的抽象方法,我大致的思路是这样。
2.3 结合该例子,你觉得什么时候应该使用abstract?
答:有抽象方法的类一定是抽象类,就需要使用abstract,abstract修饰方法就是要求其子类覆盖(实现)这个方法。调用时可以以多态方式调用子类覆盖(实现)后的方法,也就是说抽象方法必须在其子类中实现,除非子类本身也是抽象类。我觉得抽象类像是一个模板,有了抽象类,就能让很多方法在此基础上不断延伸和拓展,所以当有多个不同的方法来执行同一种功能时可以用上abstract,这样会方便些。
2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。
答:本例中,在修改前和修改后的两个文档中,很明显可以看出采取了两种不同的输入方法,因此我认为变化的是输入方法;而没有变化的是抽象类。抽象类只实现抽象方法,继承类可以不实现。抽象类不能被实例化,只能被继承象类的作用是普通类无法替代的,抽象类的作用主要是提供一种模版。抽象类中的方法可以被具体实现,并且继承的类可以重写其方法。一个类可以继承一个抽象类,但是可以继承多个接口。接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色。我的理解是这样的:抽象类和抽象方法就像一个模型,而真正的实物是在此模型的基础上加以装饰,使得每一个真正的实物都是独一无二的,假如没有了模型,就相当于没有了模板,那么想要造出一个好看的实物来就比较难了,而且每次在造一个新的实物时都需要不停的重复相同的基础步骤,这样会让过程显得特别繁琐。
(3)Comparable与Comparator
3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?
答:Comparable接口对实现它的每个类的对象进行整体排序。实现此接口的对象列表(和数组)可以通过Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素。Comparable接口有compareTo一个方法,覆盖这个方法就能排序了,直接调用Arrays.sort就可以对元素进行排序,省去了很多繁琐的排序代码,简直方便了太多!
3.2 有了Comparable接口为什么还需要Comparator接口呢?
答:Comparable接口和Comparator接口,两个都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,Comparable接口是一个对象本身已经支持自比较所需要实现的接口。Comparator是一个另写一个外部类来实现的比较的接口。
(4)面向接口案例分析,阅读Case-StudentDao.zip案例
4.1 画出类关系图,描述每个类与接口的作用。
答:Student是一个包含名字属性的类。StudentDao接口中包含writeStudent和readStudent以及diplayAllStudent方法。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,而StudentDaoArrayImpl使用的是固定了大小为80的数组。
(5)什么是面向接口编程?面向接口编程的好处是什么?结合题目3与4(Test.java的代码)讨论分析。不要百度原封不动照搬!
答:题目3种采用Comparable和Comparator接口,调用Arrays.sort方法实现排序;Comparable定义在类的内部,Comparator定义在类的外部。题目4中,对学生信息进行的种种行为,都是通过接口来实现,在调用接口之后就可以接着进行一些具体的行为,比如,遍历所有信息。在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。面向接口编程的好处:结构清晰,类之间的通信简单易懂,扩展性好,提高复用性,我个人感觉,面向接口编程能够使整个代码都很有条理,在修改的时候很方便,这是切身体会!!而且采用面向接口编程的话,其他人一看你的代码就能明白你在写什么,大概想实现哪些功能,一目了然,便于查看。
3. 码云上代码提交记录及PTA实验总结
3.1. 码云代码提交记录
3.2. PTA实验
●PTA中的编程题第一题是需要对Comparable接口有深层次的理解,刚开始,这道题打不出来,后来查看了Comparable接口的定义和作用,再运用上类的相关知识,就能把这道题打出来了。
●PTA中的编程题第二题是需要理解好Comparator,我查看了文档,并且在第一题的基础上修改了这道题,大的框架基本不变,然后就打出来了。