CSDN:https://blog.csdn.net/weixin_41357182

导航

201621123001《Java程序设计》第5周学习总结

1.本周学习总结

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

Answer:
本周重要关键词有接口Comparator接口Comparable接口interface关键字抽象类等。

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

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

  1. 本周了解了特殊的引用类型——接口。
  2. 学习了接口的定义与实现,接口体现的是has-a关系。
  3. 用Comparable实现比较行为。体现出了多态性。
  4. 学会使用了Comparator比较器。
  5. 还有就是知道了接口的关键字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 StudenDaoListImplStudentDaoArrayImpl有何共同之处?有何区别?

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

posted on 2017-10-21 00:17  一个0010  阅读(230)  评论(3编辑  收藏  举报