201621123001《Java程序设计》第5周学习总结
1.本周学习总结
1.1 写出你认为本周学习中比较重要的知识点关键词
Answer:
本周重要关键词有接口,Comparator接口,Comparable接口,interface关键字,抽象类等。
1.2 尝试使用思维导图将这些关键词组织起来。注:思维导图一般不需要出现过多的字。
1.3 可选:使用常规方法总结其他上课内容。
- 本周了解了特殊的引用类型——接口。
- 学习了接口的定义与实现,接口体现的是has-a关系。
- 用Comparable实现比较行为。体现出了多态性。
- 学会使用了Comparator比较器。
- 还有就是知道了接口的关键字interface。
2.书面作业
1.面向对象设计大作业(团队项目,2-3人)
内容:继续完善上次的大作业。
注意: 再过几次课要讲Java图形界面编程,到时候要将该系统升级为图形界面。系统的业务逻辑部分应该变化不大,变化较大的地方的是输入与输出部分。编码的时候,请不要将处理输入(System.in)与输出(System.out)的代码与某个业务处理方法绑死。
作业提交结构如下:
1.1 项目简介表格:
项目码云地址(点击后要求可直接跳到该项目首页)。
This is MyShoppingSystem
团队成员表格
学生 | 负责任务 | 博客地址 |
---|---|---|
张艺琳 | Main的编写,以及ShoppingCart类的查看订单函数编写showAll(); | 张艺琳【本人】的博客链接 |
张凯艳 | ShoppingCart类的添加删除结算功能的编写addSnack(),delSnack(),totalAllPrice() | 张凯艳的博客链接 |
安晏菊 | Snack类的编写,以及建立货品的数组 | 安晏菊的博客链接 |
1.2 系统常用功能框架图
提示:在XMind文本方框中,可通过按Shift+Enter
将字竖起来。
1.3 系统总体类图
Answer:
用IJ idea自动生成的如下
1.4 购物车、商品、系统关键代码截图(主要截取自己负责的部分)
购物车
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by zhangyilin on 2017/10/17.
*/
public class Shoppingcart {
private Map<Integer,Item> map = new LinkedHashMap<Integer,Item>();
public void addSnack(Snack snack) {
//...
}
public boolean delSnack(int number){
//...
}
public double totalAllPrice(){//商品总钱数
//...
}
public void showAll(){//查看订单信息
Collection<Item> goodsItems = map.values();
Iterator<Item> iterator = goodsItems.iterator();
while(iterator.hasNext()){
Item goodsItem = iterator.next();
Snack snack = goodsItem.getSnack();
System.out.println("商品编号:"+snack.getNumber()+",\t商品名称:"
+snack.getName()+",\t单价:"+snack.getPrice()+",\t数量:"+goodsItem.getCount()
+",\t小计:"+goodsItem.totalPrice());
}
}
public boolean changeCart(int GoodId,int count){//修改购物车订单
if(map.containsKey(GoodId)){
if (count>=1)
{
Item item = map.get(GoodId);
item.setCount(count);
return true;
}
else if (count == 0){
delGoods(GoodId);
return true;
}
}
return false;
}
public boolean delGoods(int GoodId){//删除货品
if (map.containsKey(GoodId)){
map.remove(GoodId);
return true;
}
return false;
}
public void clearCart(){
//...
}
}
商品列表
/**
* Created by zhangyilin on 2017/10/19.
*/
public class Item {
private Snack snack;
private int count;
public double totalPrice(){
double price = snack.getPrice();
return price * count;
}
public Item() {
super();
}
public Item(Snack snack, int count) {
super();
this.snack = snack;
this.count = count;
}
public Snack getSnack() {
return snack;
}
public void setSnack(Snack snack) {
this.snack = snack;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
Main类
package project1;
import java.util.Scanner;
import java.util.ArrayList;
import project1.Shoppingcart;
import project1.Snack;
/**
* Created by zhangyilin on 2017/10/18.
*/
interface Scan{
public abstract int nextInt();
public abstract String next();
public void print(String text);
public void println(String text);
}
class Menu implements Scan {
private Scanner sc = new Scanner(System.in);
public void ShowMenu(Shoppingcart shoppingcart) {
ArrayList<Snack> snacks = new ArrayList();//用于存储商品信息
Snack[] snacks1 = new Snack[15];
//...货品的名称
for (int i = 0; i < snacks1.length; i++) {
snacks.add(snacks1[i]);
}
println("\t\t商\t品\t列\t表\t");
println("\n");
for (int i = 0; i < snacks1.length; i++) {
println("NO." + snacks1[i].number + "\t" + snacks1[i].name + "\t\t" + "价格:" + snacks1[i].price);
}
println("\n");
print("请输入要加入购物车的货品序号:");
while (sc.hasNext()) {
int number = nextInt();
if (number == 0) {
break;
} else {
shoppingcart.addSnack(snacks1[number - 1]);
println("添加购物车成功!\n继续添加输入数字,否则输入0结束!");
}
}
println("购物车");
shoppingcart.showAll();
println("商品总价:" + shoppingcart.totalAllPrice());
}
@Override
public int nextInt() {
return sc.nextInt();
}
@Override
public String next() {
return sc.next();
}
@Override
public void print(String text) {
System.out.print(text);
}
@Override
public void println(String text) {
System.out.println(text);
}
}
/*public class Main {
public static void main(String[] args) {
Shoppingcart shoppingcart = new Shoppingcart();
Menu menu = new Menu();
menu.ShowMenu(shoppingcart);
}
}修改前*/
//修改后
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Shoppingcart shoppingcart = new Shoppingcart();
Menu menu = new Menu();
menu.ShowMenu(shoppingcart);
System.out.println("修改购物车请按1:");
int choic = sc.nextInt();
if (choic==1) {
System.out.println("请依次输入商品编号和需要的数量");
shoppingcart.changeCart(sc.nextInt(), sc.nextInt());
System.out.println("修改成功,此时购物车");
shoppingcart.showAll();
System.out.println("商品总价:"shoppingcart.totalAllPrice());
}
}
}
运行结果
1.5 其他:跟上次的系统比较,系统的设计等有何修改。其他感想。
Answer:
跟上周进行比较,主要就是原来想给各种零食分类,这周就是放弃了这个想法,想把所有的零食都放在动态数组里,这样就不用让每一个零食小类去继承零食这个大类,有点画蛇添足的感觉。所以我就直接根据编号添加入购物车,然后进行购物车的操作,还有就是用了抽象的方法进行输入输出的编写,就不会只局限于控制台输入输出了。
2.abstract:阅读GuessGame抽象类的设计与使用源代码
2.1 Guess改造前代码很简单,而改造后的代码使用了抽象类、抽象方法,看起来更复杂,这样的改造到底有什么好处呢?
//改造前:
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");
}
}
//改造之后:
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();
}
Answer:
改造前,只允许在控制台输入输出,但是改用抽象类后,就算取得用户输入,显示结果的环境未定,也还是可以先操作。因为输入输出抽象化后,无论后期需要哪种输入输出都可以再去继承抽象类,去操作抽象方法即可。
2.2 GuessGame(改造后).java
中有抽象方法与非抽象方法,你觉得抽象类中什么样的方法应该声明为abstract
,什么方法不需要声明为abstract
直接实现即可。
Answer:
抽象类定义为:如果一个类中没有足够的信息来描绘一个具体的对象,那么这就是抽象类。
抽象类中被声明为
abstract
的方法应该是某些不确定的方法。这些方法目前还没有确定的要求,例如:public abstract void print(String text);public abstract void println(String text);public abstract int nextInt();这些就是没有确定的输入,输出的环境,就将其定义为抽象方法,方便日后的修改。可以直接确定的方法就可以不用声明为abstract,直接实现就可以。
2.3 重要:在这个例子中,变化的是什么,不变的是什么?尝试结合abstract等概念进行说明。
Answer:
变化的是输入输出的方法,将只能文本模式下输入改成了抽象方法,即可以通过其他环境输入。
不变的是这个方法功能。还是通过输入数字猜数字。只是运用了abstract就可以在决定了操作环境后,编写继承该抽象类的方法,操作环境更灵活。
3.Comparable与Comparator
3.1 结合PTA 7-1中你的代码说明,为什么某个类实现了Comparable接口,就可以直接使用Arrays.sort对该类型的数组进行排序?
Answer:
因为Comparable接口针对的是对象之间的比较排序,所以实现了Comparable接口后,在该类的内部覆盖了compareTo方法,就可以直接使用Arrays.sort进行排序。
3.2 结合PTA 7-2 中你的代码说明,有了Comparable接口为什么还需要Comparator接口呢?
Answer:
因为Comparable接口实现的是对象的排序,而Comparator这个接口相当于一个比较器可以进行不同类型的比较。例如代码中要求实现根据姓名的排序,以及根据年龄的排序。
3.3 以前的作业Shape, Rectangle,Cirlce
中,Shape类中什么方法应声明为abstract
?说出原因。
Answer:
Shape类中计算形状的周长getPerimeter()和面积getArea()的方法应声明为abstract,因为每种形状的计算周长和面积的方法不一样,但是要让无论何种形状都可以共用相同的父类里的计算周长和面积的方法,就需要声明为抽象类了。
3.4 有很多Shape类型对象如Rectangle、Circle。希望使用Arrays.sort对他们进行排序,请写出相应代码。并简述应在哪个类上实现Comparable
接口比较好?
Answer:
我认为应该在Shape类上实现Comparable接口比较好,这样继承Shape类的类就可以直接继承这个方法。我是在Shape类中重写compareTo方法先判断面积,在判断周长,升序输出。
相应代码
abstract class Shape implements Comparable<Shape>
{
final double PI = 3.14;
abstract public double getArea();
abstract public double getPerimeter();
@Override
public int compareTo(Shape o) {
if (this.getArea() > o.getArea())
return 1;
else if (this.getArea() < o.getArea())
return -1;
else
{
if (this.getPerimeter()>o.getPerimeter())
return 1;
else if (this.getPerimeter() < o.getPerimeter())
return -1;
else
return 0;
}
}
}
运行截图
3.5 以3.4你编写的代码为例,简述面向Comparable接口编程、面向父类编程的好处。(注意:一定要结合自己编写的代码)
Answer:
我觉得面向Comparable接口编程、面向父类编程的好处就是提高了程序的灵活性,就假如我的形状的比较方式改变了,需要先比较周长,在比较面积,那我只需要修改Comparable接口内部的compareTo函数就好了,而不用翻盘修改。就大大提高了效率了。
4.面向接口案例分析
4.1 a.画出类关系图。b.StudentDao
接口有什么用?
a.类关系图
b.StudentDao
接口有什么用
Answer:
StudentDao
接口定义了三个抽象方法,分别是writeStudent(Student student);
Student readStudent(String name);
public void diplayAllStudent();
供给继承该接口的类继承抽象方法。
4.2 StudenDaoListImpl
与StudentDaoArrayImpl
有何共同之处?有何区别?
Answer:
StudenDaoListImpl与StudentDaoArrayImpl都继承StudentDao接口,都继承Student类,都实现了三个抽象方法。
StudenDaoListImpl用动态数组
ArrayList
来存放学生信息,其内存是可变的。StudentDaoArrayImpl用数组存放学生信息,其数组长度是固定的。
4.3 结合Test.java中的main函数,简述面向接口编程的好处。
Answer:
接口是一系列抽象方法的集合,类通过继承接口从而继承了接口内的抽象方法。例如StudenDaoListImpl与StudentDaoArrayImpl都继承了StudentDao接口,实现的方法结果都一样,这也算是多态性的一种表示。面向接口编程的最大好处就是在某些操作环境或者方法不确定的情况下,可以先在接口中定义抽象方法,让继承该接口的类去实现该方法,从而让程序更灵活。
5.什么是面向接口编程?面向接口编程的好处是什么?
结合题目4案例中的Test.java
的代码进行分析。不要百度原封不动照搬!
Answer:
面向接口编程就是,通过定义接口,仅对继承该接口的类提供抽象方法。就有点类似于定义与实现的分离强行让定义与实现质壁分离。而在4.3已经提到接口的好处。也可以再重复一遍,简单点说那就是可以让程序更灵活。
3.码云及PTA
题目集:面向对象2-进阶-多态接口内部类
3.1.码云代码提交记录
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
1.排名图
2.PTA提交列表图
3.3统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 374 | 374 | 5 | 5 |
2 | 889 | 515 | 15 | 10 |
3 | 1417 | 528 | 22 | 7 |
4 | 1838 | 421 | 27 | 5 |
6 | 2608 | 770 | 38 | 11 |
201621123001《Java程序设计》第5周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如:#define memcpy(dst,src,n) \ __asm__("cld;rep;movsl& ...
- 04 flask 项目整体构建
本文主要的目标是创建flask基本的项目架构,总体架构: 详细的项目目录结构: Flask 项目创建的过程 一.项目(students)创建初始化工作 1. 创建项目的虚拟环境 mkvirtualen ...
- 自定义alert弹框,title不显示域名
问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...
- ajax请求二进制流图片并渲染到html中img标签
日常显示图片都诸如这种形式:直接使用img的src属性 <img src="图片路径.地址" alt="" /> 以上方法无法在获取图片请求中设置请 ...
- cogs448
☆ 输入文件:1.in 输出文件:1.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在某次膜拜大会上,一些神牛被要求集体膜拜.这些神牛被奖励每人吃一些神牛果. ...
- 【转】Code First 属性详解
下面解释每个配置的作用 Table :用于指定生成表的表名.架构信息. Column :用于指定生成数据表的列信息,如列名.数据类型.顺序等. Key :用于指定任何名称的属性作为主键列并且默认将此列 ...
- vue2.0 transition 手风琴
<div class="food"> <button @click="show=!show">show</button> & ...
- nmon+nmon analyser安装使用教程
nmon一般是两种用法,一是交互式用法查看实时的内存/cpu/网络/磁盘等情况,二是抓取一段时间内的实时的内存/cpu/网络/磁盘记到csv格式的.nmon文件中然后用nmon analyse做可视化 ...
- Tomcat修改用户名密码教程
Tomcat安装教程见http://www.cnblogs.com/lsdb/p/6497964.html 启动tomcat后访问http://127.0.0.1/:8080,出现界面如下其右上角有三 ...
- kali菜单中各工具功能
一.说明 各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 安装kali虚拟机可参考:https://www.cnblogs.com/lsdb/ ...