作业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 |