• 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方法,说明自己的编程还太少,得继续加强。
  • 相关阅读:
    BZOJ3899 仙人掌树的同构(圆方树+哈希)
    BZOJ3590 SNOI2013Quare(状压dp)
    BZOJ2178 圆的面积并(simpson积分)
    BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)
    BZOJ3589 动态树(树链剖分+容斥原理)
    BZOJ3453 XLkxc(拉格朗日插值)
    BZOJ4650 NOI2016优秀的拆分(后缀数组)
    Luogu5058 ZJOI2004嗅探器(割点)
    shutil模块---文件,文件夹复制、删除、压缩等处理
    面向过程---通过查找字符串,找到相应的文件路径
  • 原文地址:https://www.cnblogs.com/yayaya/p/6618079.html
Copyright © 2020-2023  润新知