201521123103 《Java学习笔记》 第五次学习总结

一、本周学习总结

1.1 尝试使用思维导图总结有关多态与接口的知识点。

1.2 可选:使用常规方法总结其他上课内容。

 (1)、接口更灵活、更方便,可以方便的为现有的系统添加新的功能。
 (2)、is-a 就使用继承,has-a就是用接口。

二、书面作业

1、代码阅读:Child压缩包内源代码

1.1com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误。并分析输出结果。

 答:com.parent包中Child.java文件不能编译通过,System.out.println(i);这一句会出现错误。因为private是私有的,其他不能调用它。所以要将com.parent包中Child.java文件里的private int i=1改为protected int i=1。


1.2 另外一个包中的OutOfParentPackage.java,能否编译通过?提示什么错误?分析原因。

 答:不能,提示错误The type Parent is not visible。因为上课讲的protected只对本包的所有类可见,而OutOfParentPackage.java是在另外一个包里面的。如果想要修改,只需要修改parent包中Parent类中的控制可见性的控制符几个protected改为public即可。

2、abstract进阶:阅读GuessGame抽象类的设计与使用源代码

2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法看起来很复杂,那这样的改造到底有什么好处呢?

答:由参考文件可知Guess改造前代码如下:

 package cc.openhome;

 import java.util.Scanner;

 public class Guess {
     public static void main(String[] args) {
     Scanner scanner = new Scanner(System.in);
     int number = (int) (Math.random() * 10);
     int guess;
    
     do {
          System.out.print("猜数字(0 ~ 9):");
          guess = scanner.nextInt();
         }
     while(guess != number);
    
     System.out.println("猜中了...XD");
     }
 }

而改造后的代码:

 package cc.openhome;

 public abstract class GuessGame {
    public void go() {
        int number = (int) (Math.random() * 10); 
        int guess;
        do {
           print("输入数字:");
           guess = nextInt();
           } 
        while(guess != number);
        println("猜中了");
       }

      public abstract void print(String text);
      public abstract void println(String text);
      public abstract int nextInt();
 }

改造的好处:改造前只能控制台输出,改造后可以在控制台,也可以使用对话框图形界面等输入。

2.2 如果想将该游戏改造成图形界面,应该进行一些什么操作?

 答:设计一个用来猜数字的图形界面的类并且继承Guess中的抽象类,然后用图形界面支持的输入输出语句来重写抽象类当中的抽象方法。

2.3 结合该例子,你觉得什么时候应该使用abstract?

 答:如果该类中有抽象方法,则要用abstract,也就是说在具体的实现方法未定义的时候,需要我们用到abstract。

2.4 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract、继承等概念进行说明。

 答:变化的是输入方法,不变的是抽象方法。因为抽象方法没有具体的定义,需要根据具体要求写一个外部的类、方法继承这个抽象类,但如果继承的话就对抽象方法有了重新的定义,就如本例中ConsoleGame类继承了抽象类GuessGame。

3、Comparable与Comparator

3.1 描述Comparable接口的用途。为什么某个类实现了Comparable接口就可以直接使用Arrays.sort对其进行排序?

 答:Comparable接口抽象出了比较的共同特性:待比较的对象,比较的结果,对实现它的每个类的对象进行排序,实现此接口的对象列表和数组可以通过 Arrays.sort进行排序。
     因为Comparable接口有compareTo一个方法,覆盖这个方法就能排序了,直接调用Arrays.sort就可以对元素进行排序。

3.2 有了Comparable接口为什么还需要Comparator接口呢?

 答:因为Comparable接口的缺点是只能按照一种规则排序;而使用Comparator接口可以对比较方式进行修改。


4、面向接口案例分析:阅读Case-StudentDao.zip案例

4.1 画出类关系图,描述每个类与接口的作用。

 答:Student类定义了对象的姓名以及其输出的格式,有toString()方法;StudentDao接口提供了判断是否写入数据、读数据、输出所有学生对象的方法;StudenDaoListImpl类是对StudentDao接口中的三个抽象方法的具体实现,用ArrayList的具体方法来完成相应操作。;StudentDaoArrayImpl类也是对StudentDao接口中的三个抽象方法的具体实现:readStudent(String) 读取学生信息,如果找不到返回null;diplayAllStudent()遍历整个数组,没找到学生信息返回false,对象为非空则输出学生信息;writeStudent(Student )添加学生信息,添加成功返回true。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何区别?

 答:本质是属性不同:StudentDaoArrayImpl使用的是数组,StudenDaoListImpl使用的ArraysList。所以两个类对于接口的抽象方法,就会有不同的实现。

5、什么是面向接口编程?面向接口编程的好处是什么?结合题目3与4中的Test.java的代码讨论分析。不要百度原封不动照搬!

 答:面向接口编程是根据接口的设计与属性,按照其实现方法进行编程,其实是面向对象编程的一部分。
     好处:结构清晰,扩展性好,提高复用性,我觉得,面向接口编程能够使整个代码都很有条理,在修改的时候很方便。
     参考链接:http://baike.baidu.com/item/面向接口编程/6025286?sefr=cr

题目集:jmu-Java-04-面向对象2-进阶-多态接口内部类

3.1. 码云代码提交记录

3.2. PTA实验

 实验总结:
    (1)感觉这次实验会有一丝丝的成就感,因为在编写过程中问题少了很多,对定义类掌握的比之前熟练了;  
    (2)学会了使用Arrays.sort进行排序以及如何实现Comparable接口,比如:5-1:实现先对name升序排序,如果name相同则对age进行升序排序;
    (3)知道了可以编写不同的Comparator来满足多样的排序需求。比如:5-2:对年龄进行排序使用Comparator来编写;
    (4)发现自己的问题是不怎编写main方法,说明自己的编程还太少,得继续加强。
原文地址:https://www.cnblogs.com/yayaya/p/6618079.html