作业05-继承、多态、抽象类与接口

1. 本周学习总结

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

接口 has-a comparable 公开

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

2. 书面作业

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

1.1 项目简介表格:

项目码云地址(点击后要求可直接跳到该项目首页)。

https://gitee.com/201621123065/java201621123065.git

团队成员表格

|学生|负责任务|博客地址|
|-😐-😐-😐-😐
|郭启鹏|菜单类|http://www.cnblogs.com/201621123065guo/p/7696075.html|

1.2 系统常用功能框架图

1.3 系统总体类图

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

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

import java.util.Scanner;  /** 菜单类,用于显示所有级菜单供用户选择  */  
public class Menu {  
 
    public Menu() {  
    }  
  
    /**  设置菜单类中的数据信息  */  
    public void setData(String as[], double ad[], int ai[], String as1[], int ai1[]) {  
        goodsName   = as;  
        goodsPrice  = ad;  
        custNo      = ai;  
        custBirth   = as1;  
        custScore   = ai1;  
    }  
  
    /**显示一级菜单,即登录界面  */  
    public void showLoginMenu() {  
        System.out.println("\n\n\t\t\t    欢迎使用购物管理系统\n\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 登 录 系 统\n\n");  
        System.out.println("\t\t\t\t 2. 更 改 管 理 员 信 息\n\n");  
        System.out.println("\t\t\t\t 3. 退 出\n\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.print("请选择,输入数字:");  
    }  
  
    /** 显示二级菜单,即系统的主菜单,这个方法里面包含了对这个菜单处理的所有流程 */  
    public void showMainMenu() {  
          
        // 显示二级菜单,即系统的主菜单  
        System.out.println("\n\n\t\t\t\t欢迎使用购物管理系统\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 客 户 信 息 管 理\n");  
        System.out.println("\t\t\t\t 2. 购 物 结 算\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
          
        // 用户选择服务项目  
        System.out.print("请选择,输入数字:");  
        Scanner scanner = new Scanner(System.in);  
        boolean flag = false;  
        do {  
            String s = scanner.next();  
              
            // 用户选择"客户信息管理"  
            if (s.equals("1")) {  
                // 显示客户信息管理菜单并处理这个菜单的整个流程,当这个流程处理完  
                showCustMMenu();  
                break;  
            }  
              
            // 用户选择"购物结算"  
            if (s.equals("2")) {  
                // 定义购物结算类的对象,并处理整个购物结算的流程  
                Pay pay = new Pay();  
                pay.setData(goodsName, goodsPrice, custNo, custBirth, custScore);  
                pay.calcPrice();  
                break;  
            }  
            }  
              
            System.out.print("输入错误,请重新输入数字:");  
            flag = false;  
        } while (!flag);  
    }  
  
    /** 
     * 显示三级菜单-客户信息管理,并处理所有客户信息管理的流程 
     *  
     */  
    public void showCustMMenu() {  
        System.out.println("购物管理系统 > 客户信息管理\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.println("\t\t\t\t 1. 显 示 所 有 客 户 信 息\n");  
        System.out.println("\t\t\t\t 2. 添 加 客 户 信 息\n");  
        System.out.println("\t\t\t\t 3. 修 改 客 户 信 息\n");  
        System.out.println("\t\t\t\t 4. 查 询 客 户 信 息\n");  
        System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");  
        System.out.print("请选择,输入数字或按'n'返回上一级菜单:");  
        Scanner scanner = new Scanner(System.in);  
          
        boolean flag = true;  
        do {  // 创建客户信息管理对象,并设置数据,这里的数据还是原始的那些数据  
        	 CustManagement custmanagement = new CustManagement(); 
        	 custmanagement.setData(goodsName, goodsPrice, custNo, custBirth, custScore);
            String s = scanner.next();  // 客户选择"显示所有客户信息"  
            if (s.equals("1")) {  
                custmanagement.show();  
                break;  
            }  // 客户选择"添加客户信息"  
            if (s.equals("2")) {  
                custmanagement.add();  
                break;  
            }  // 客户选择"修改客户信息"  
            if (s.equals("3")) {  
                custmanagement.modify();  
                break;  
            }   // 客户选择"查询客户信息"  
            if (s.equals("4")) {  
                custmanagement.search();  
                break;  
            }   // 客户选择"返回上一级菜单"  
            if (s.equals("n")) {  
                showMainMenu();  
                break;  
            }  
              
            System.out.println("输入错误, 请重新输入数字:");  
            flag = false;  
        } while (!flag);  
    }  
  
 /*====================定义该类所拥有的变量====================*/  
    public String   goodsName [];   // 商品的名称  
    public double   goodsPrice[];   // 商品的价格  
    public int  custNo    [];   // 顾客的会员号  
}  

从头开始,只写了菜单类,其他功能以后再继续完善。

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

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

增加了代码的复用性,使得代码效率提高,提升代码可读性;同时也提升了程序的可移植性和灵活性。

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

在抽象类中定义抽象方法需要用abstract声明,在接口中默认方法都是抽象的(abstract),可不用声明

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

  • 变化的是是可使用的环境,改造前只能在控制台输出,改造后还能在对话框图形界面等地方输出。
  • 不变的是任是抽象类。

3. Comparable与Comparator

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

让类实现Comparable接口,并覆盖compareTo方法就可以实现对象的自动排序,Comparable接口有compareTo一个方法,覆盖这个方法就能排序了。

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

Comparator 和 Comparable都是java的一个接口, 并且是用来对自定义的class比较大小,Comparable 定义在 Person类的内部,Comparator 是定义在Person的外部。

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

求面积和周长的方法应声明为abstract,因为 Rectangle,Cirlce都要进行求面积和周长。定义为抽象就可以求解。

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

package PTA4;

public abstract class Arr implements Comparable<Arr>{
   public final static double PI=3.14;
   public abstract double getPerimeter();
   public abstract double getArea();
   
   public int compareTo(Arr other){
	   if(this.getArea() < other.getArea())
		   return -1;
	   if(this.getArea() > other.getArea())
		   return 1;
	   return 0;
	   
   }
}

在Shape类上实现Comparable最好

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

面向接口编程的最大的好处是接口和实现分离了, 用起来方便,结构清晰,适合团队开发

4. 面向接口案例分析

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

StudentDao接口读取、录入、显示学生信息。

4.2 StudenDaoListImpl与StudentDaoArrayImpl有何共同之处?有何区别?

都有StudentDao中的三个方法;不同于StudenDaoListImpl使用ArrayList来存储信息,StudentDaoArrayImpl用数组来存储。

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

程序结构更清晰,适合团队开发,提高工作效率。
例如StudentDaoListlmpl和StudentDaoArrayImpl都继承了StudentDao接口,能实现StudentDao中的功能。

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

面向接口编程就是通过定义接口,承接接口实现不同类之间的通信和各模块之间的交互。
好处:

  • 程序结构清晰,使用方便
  • 接口经过合理设计后,有利于程序设计的规范化,并可以并行开发,提高工作效率
  • 实现了程序的可插拔性,对于不同的需求切换不同的实现,降低了耦合度,随着系统复杂性的提高这个优势会越来越明显
  • 允许多重实现,弥补了继承的缺陷

3.码云及PTA

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图

3.3 统计本周完成的代码量

行数 新增行数 文件数 新增文件数
1154 260 67 16
posted @ 2017-10-21 17:12  Devilss  阅读(319)  评论(2编辑  收藏  举报