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

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,我查看了文档,并且在第一题的基础上修改了这道题,大的框架基本不变,然后就打出来了。

posted on 2017-03-24 14:29  YJLIAO  阅读(326)  评论(3编辑  收藏  举报