201521123087 《Java程序设计》第5周学习总结

1. 本周学习总结

 


2. 书面作业

作业参考文件下载

  1. 代码阅读:Child压缩包内源代码
    1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。                                                                                                                                                                                                  答:不能,语句System.out.println(i);中的i会出现错误,子类child文件继承父类parent,在parent文件中语句private int i=1i是私有的,必须改成protected,方可执行。                                                                                                            执行结果: 1 2 2 1 1 2 1。                                                                                                                                                                                                                                                                                             
    1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。                                                                                                                                                                                                                答:另外一个包中的OutOfParentPackage.java,不能编译通过,提示的错误是The type Parent is not visible.发生这个错误的原因在于Parent类不是public的。
    1.3 回答:如果为了访问到protected修饰的属性或方法应该怎么办?                                                                                                                                                                                                                                              答:protected修饰的属性以及方法只能在同一个包内的其他类或子类调用。

  2. abstract进阶:阅读GuessGame抽象类的设计与使用源代码
    2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?                                                                                                                                                                           答: 改造前的这串代码在设计出来的时候就已经固定了它只能通过控制台进行输入,相当于被控制台所束缚。改造后将GuessGame类、print方法和nextInt方法定义为抽象类,这样整个程序的执行方式就不再是确定的控制台输入输出,我们具体需要在什么环境下运行它的话只需要创建出一个实例就可以运行,这样做不仅方便在想要的环境下运行,还可以节省代码的冗余。
    2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?                                                                                                                                                                                                                                                     答:因为游戏的流程是一样的,所以只需将游戏的输入和输出操作改成图形界面里的输入输出就可以了。
    2.3 结合该例子,你觉得什么时候应该使用abstract?                                                                                                                                                                                                                                                                 答:在这个例子中,因为这个游戏被设计出来的时候并没有指明它要在什么环境、使用什么方式输入、怎样输出,这时我们并不明白它的具体实现时,我们就应该就把它定义为abstract,由于方法被定义为abstract,所以类也要是abstract类。
    2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。                                                                                                                                                                                                       答:本例中,在修改前和修改后的两个文档中,很明显可以看出采取了两种不同的输入方法,因此我认为变化的是输入方法;而没有变化的是抽象类。抽象类只实现抽象方法,继承类可以不实现。抽象类不能被实例化,只能被继承象类的作用是普通类无法替代的,抽象类的作用主要是提供一种模版。抽象类中的方法可以被具体实现,并且继承的类可以重写其方法。一个类可以继承一个抽象类,但是可以继承多个接口。接口被运用于实现比较常用的功能,便于日后维护或者添加删除方法,而抽象类更倾向于充当公共类的角色。我的理解是这样的:抽象类和抽象方法就像一个模型,而真正的实物是在此模型的基础上加以装饰,使得每一个真正的实物都是独一无二的,假如没有了模型,就相当于没有了模板,那么想要造出一个好看的实物来就比较难了,而且每次在造一个新的实物时都需要不停的重复相同的基础步骤,这样会让过程显得特别繁琐。

  3. Comparable与Comparator
    3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?                                                                                                                                                                               答:Comparable接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序类的compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过Arrays.sort进行自动排序,在调用Arrays的sort()时将排序类对象作为参数传入。也就可以按照多种方式排序,只需创建一个实现Comparator接口的排序方式类,然后将其对应的对象传到Arrays.sort。
    3.2 有了Comparable接口为什么还需要Comparator接口呢?                                                                                                                                                     
    答:Comparable接口和Comparator接口的作用都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现排序,而Comparator是在集合外部实现的排序。所以如果想对结合排序,需要在集合外定义Comparator接口的方法或在集合内部实现Comparable接口的方法。

  4. 面向接口案例分析
    阅读Case-StudentDao.zip案例
    4.1 画出类关系图,描述每个类与接口的作用。                                                                                                                                                                                                                     答:                                                                                                                                                                                                                    

    Student是一个关于名字属性的类。StudentDao接口中有writeStudent和readStudent以及diplayAllStudent方法。StudentDaoArrayImpl是对StudentDao接口的操作,其中由了Student readStudent和boolean writeStuden以及void diplayAllStudent()等方法。StudenDaoListImpl是对StudentDao接口的另一个操作,包含Student readStudent(String name) 和boolean writeStudent(Student student) 以及void diplayAllStudent()等方法。

    4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?                                                                                                                                                                                                答:StudenDaoListImpl使用动态容器ArrayList,而StudentDaoArrayImpl使用的是固定了大小为80的数组。

  5. 什么是面向接口编程?面向接口编程的好处是什么?
    答:还用PTA的5-2为例,当我不知道要以什么方式排序,只知道需要有排序功能时,那么就必须使用接口告诉编译器,我这个类具有排序的功能,但是具体实现未知,具体实现之后再写。面向接口编程就是说我有这个功能,但是具体实现不知道,在设计时必须要考虑到各种功能,但是却不需要每一个都具体写出来,在做项目时让逻辑更清晰明白。

3. 码云上代码提交记录及PTA实验总结

3.1. 码云代码提交记录

       

3.2. PTA实验                                                                                                                                                                                                                                                                          暂时不会

posted @ 2017-03-25 18:18  来自梦里的自信  阅读(118)  评论(0编辑  收藏  举报