zoukankan      html  css  js  c++  java
  • 作业05-继承、多态、抽象类与接口

    1. 本周学习总结

    1.1 写出你认为本周学习中比较重要的知识点关键词

    接口 Comparable Comparator interface implements

    1.2 尝试使用思维导图将这些关键词组织起来。注:思维导图一般不需要出现过多的字。

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

    • 面向接口编程是多态性的体现,体现了is a关系
    • 面向接口编程提高了程序的灵活性,增强了程序的可操作性
    • interface关键字定义接口,implements关键字调用接口

    2. 书面作业

    1. 面向对象设计大作业(团队项目,2-3人)

    1.1 项目简介表格

    码云地址

    学生 负责任务 博客地址
    谢晗 零食大类、购物车类 https://i.cnblogs.com/EditPosts.aspx?postid=7695818
    靳天婷 书籍大类、用户类 http://www.cnblogs.com/21-T/p/7679889.html

    1.2 系统常用功能框架图

    1.3 系统总体类图

    1.4 购物车、商品、系统关键代码截图(主要截取自己负责的部分)

    1.5 其他:跟上次的系统比较,系统的设计等有何修改。其他感想。

    修改:新增加了user类,让零食类和书籍都继承及Goods类,以便于主函数中关于Goods的操作
    感想:对于怎么编写合适的sum方法我们两个还是有点摸不着头脑,感觉主函数要实现的东西太多的,思路有点乱了,所以最终也没能运行出来,下回希望主函数能简单一点,将主函数中的某些内容移到类中实现

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

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

    改造前代码:

    public class Guess1 {
        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");
        }
    }
    

    改造后代码:

    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 GuessGame(改造后).java中有抽象方法与非抽象方法,你觉得抽象类中什么样的方法应该声明为abstract,什么方法不需要声明为abstract直接实现即可。

    抽象方法是只有方法名,没有方法体的方法,当某些功能需要根据子类的不同性质而编写不同的代码时,需要用到抽象方法,而当子类和父类拥有完全相同的功能时,可以不用abstract声明为抽象方法,比如Rect类和Cir类都可以进行面积和周长的计算, 但是计算的方法却是不相同的,这时可以在Shape父类中定义两个计算面积和周长的抽象方法,Rect类和Cir类继承Shape类时,就可以根据不同的计算公式来具体实现这两个抽象方法,而比如Rec类和Cir类都要实现在控制台输出一行“这是一个图形”的方法时,就可以直接在Shape父类中编写这个方法,Rect类和Cir类继承Shape类时,就直接继承了这个方法。

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

    • 不变的是实现猜数字这个游戏的功能,它只是把输入输出的实现方法定义为抽象的方法,让输入输出在继承它的子类中实现,编程人员在编写继承GuessGame的子类时,可以根据不同的需求来编写不同的输入输出实现方法

    • 变化的是输入输出的方式,改造前只能在控制台进行输入输出,改造后可以在控制台,对话框图形界面等环境下进行输入输出

    3. Comparable与Comparator

    3.1 结合PTA 7-1中你的代码说明,为什么某个类实现了Comparable接口,就可以直接使用Arrays.sort对该类型的数组进行排序?

    Comparable接口在JDK文档中的说明:

    sort在JDK文档中的说明:

    由此可知只要在实现Comparable接口的类中根据题目要求重新编写compareTo方法,在主函数中用Arrays.sort或者Collections.sort进行排序时会直接调用compareTo方法进行比较数组的元素,并按升序返回

    3.2 结合PTA 7-2 中你的代码说明,有了Comparable接口为什么还需要Comparator接口呢?

    Comparable接口定义在类的内部,需要编写compareTo方法,当某个类中定义了Comparable接口后,在主函数中用Arrays.sort或者Collections.sort进行排序时会直接调用CompareTo方法进行比较,Comparator接口是定义在类的外部的,需要编写compare方法,可以用Comparator接口定义好几个不同的比较方法,在主函数中进行排序时需具体声明要调用的比较方法

    参考资料

    3.3 以前的作业Shape, Rectangle,Cirlce中,Shape类中什么方法应声明为abstract?说出原因。

    Shape类中计算周长,面积的方法需要声明为abstract,因为只要是一个图形就肯定有计算周长和面积的功能,但是具体Rectangle和Circle计算面积和周长的规则是不一样的,所以Shape类中需要将计算面积和周长的方法声明为抽象方法,在继承它的Rectangle和Circle子类中具体实现这两个抽象方法

    3.4 有很多Shape类型对象如Rectangle、Circle。希望使用Arrays.sort对他们进行排序,请写出相应代码。并简述应在哪个类上实现Comparable接口比较好?

    相关代码:

    运行截图:

    我觉得在Shape父类中实现comparable接口比较好,因为Rectangle和Circle均继承自Shape,在Shape中实现comparable接口,就可以统一实现对Rectangle和Circle的排序

    3.5 以3.4你编写的代码为例,简述面向Comparable接口编程、面向父类编程的好处。(注意:一定要结合自己编写的代码)

    我觉得面向Comparable接口编程、面向父类编程的好处是提高程序的灵活性和可操作性,比如3.4题的代码,Rectangle和Circle均继承自Shape,那么只要在Shape父类中实现Comparable接口即可实现对所有的Rectangle和Circle的排序,将来要是有不同的排序需求,只要对Shape父类中的compareTo方法进行修改即可,比较高效便捷

    4. 面向接口案例分析

    4.1 a.画出类关系图。b.StudentDao接口有什么用?

    a.

    b.StudentDao接口定义了三种方法:boolean writeStudent(Student student) Student readStudent(String name) void diplayAllStudent() ,可以在实现这个接口的类中编写具体的实现方法

    4.2 StudenDaoListImplStudentDaoArrayImpl有何共同之处?有何区别?

    • 相同之处:两个类都是用于实现学生信息的存储,都实现了StudentDao接口,都具体实现了StudentDao接口中的三个抽象方法
    • 不同之处:StudenDaoListImpl利用ArrayList来存放学生信息,其内存空间是动态分配的,StudentDaoArrayImpl利用数组来存放学生信息,其内存空间是固定不变的

    4.3 结合Test.java中的main函数,简述面向接口编程的好处。

    面向接口编程的好处:
    1.接口和实现分离了,适于团队的协作开发,
    2.让程序更加灵活,便于操作
    对于本题,StudentDao类是一个接口,里面有录入、读取、展示学生信息的三个抽象函数,只有方法名,没有方法体,StudenDaoListImpl类和StudentDaoArrayImpl类都实现了StudentDao,但是一个用ArrayList来存放学生信息,一个用数组来存放学生信息,这就体现了面向接口编程的灵活性,编程人员可以根据不同的需求来编写不同的实现方法实现对学生信息的存储,而不是已经在StudentDao中死板地规定了学生信息存储的方式。

    5. 什么是面向接口编程?面向接口编程的好处是什么?

    • 面向接口编程就是通过定义一组接口,仅向上层暴露其接口功能,具体功能的实现还要在上层中根据不同的需求进行不同代码的编写,是一种多态性的体现
    • 面向接口编程的好处:(见4.3)

    3.码云及PTA

    3.1. 码云代码提交记录


    3.2 截图PTA题集完成情况图


    3.3 统计本周完成的代码量

    周次 总代码量 新增代码量 总文件数 新增文件数
    2 343 343 10 10
    3 498 498 8 8
    5 788 788 26 26
    6 536 536 16 16
  • 相关阅读:
    mysql安装,oracle安装
    各位数之和
    java环境配置针对win10(电脑重装必备) 最后一步很重要
    关于Spring和SpringMVC的总结
    Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录
    bootstrapValidator验证的remote中data属性里获取select一直是默认值
    springmvc.xml 中报错:Start state is missing. Add at least one state to the flow
    Hibernage错误:Could not open Hibernate Session for transaction
    关于独立部署web项目到tomcat服务器详情
    idea 2018.1激活方法
  • 原文地址:https://www.cnblogs.com/xh201621123064/p/7695818.html
Copyright © 2011-2022 走看看