201621123006 《Java程序设计》第6周学习总结

1. 本周学习总结
1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结。
注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的核心内容即可。

注2:颜色要少、连线不要复杂,必要的时候要在连线上进行说明。

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

  • 内部类:成员内部类(可以访问外部类的所有成员);
    静态内部类(用static关键字修饰);
    方法内部类(在成员方法中定义的类)。
  • 构造方法:在一个类中定义的方法如果同时满足以下三个条件,该方法称为 构造方法:
    1、方法名与类名相同。
    2、在方法名的前面没有返回值类型的声明。
    3、在方法中不能使用return语句返回一个值。(以上引用自参考书)
  • this 关键字:用于在方法中访问对象的其他成员。
  • 抽象类:当一个类中不同的的方法被不同的子类调用时,需要将该类声明为抽象类。
  • 接口:如果一个抽象类中的所有方法都是抽象的,则可以将这个类用接口来定义,定义接口时用关键字interface来声明

书面作业
clone方法
1.1 在test1包中编写Employee类,在test2包中新建一个Test类,并在其main中新建test1包中的Employee的对象,然后使用clone方法克隆一个新对象,能否成功?为什么?

  • 不能。clone不可见。clone()方法被protected修饰,不能在两个包中使用,只能被它的子类或是同一个包中的类调用。

1.2 如果要为自定义的类覆盖clone方法,需注意什么?

  • 这个自定义类要实现Cloneable接口并用public修饰。
  • protected修饰的方法只能被同一个包中的类或是自己的子类调用,所以在自定义类覆盖clone方法时,需要保证该类继承自Object类。

1.3 Object对象中的toString, equals, hashCode方法都使用public修饰,而clone方法却被protected修饰,请尝试解释原因。为什么不声明为public呢?

  • Object中的clone()方法默认浅拷贝,用public修饰的话可以对这个方法直接调用,当对复制的信息进行修改时,原本的信息也可能被修改,这是非常危险的。用protected修饰clone()方法,使其只能被本包中的子类访问,增强了安全性。

内部类

2.1 使用匿名类与Lambda表达式改写题集面向对象2-进阶-多态接口内部类的题目7-2。请贴图关键代码与运行结果,请在运行结果中出现你的学号与姓名。


2.2. 分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?
Comparator shapeComparator = new Comparator() { @Override public int compare(Shape o1, Shape o2) { //你的代码 } };

  • shapeComparator使用匿名内部类实现了Comparator接口,重写了compare方法。

2.3 题集:6-1(匿名内部类)实验总结。你觉得使用匿名内部类有什么好处?

  • 匿名内部类是实现接口的一种简便写法,实现后我们不需要再创建一个新的类,简化了代码。

PTA实验总结
3.1 PTA(自定义接口)。并回答:相比较不写接口,直接写一个类包含IntegerStack相应的方法来说,定义IntegerStack接口,然后定义其实现类这种方式有什么好处?

  • 这样我们可以对IntegerStack接口直接进行操作,后续我们就多了一些选择,不仅可以通过数组来实现还可以用列表来实现相应的功能,程序就灵活了很多。

3.2 PTA(静态内部类)。并回答:你觉得什么时候应该使用静态内部类?静态内部类与内部类有什么区别?

  • 内部类与其所在的外部类是有一定关系的,当内部类中有静态属性和方法,而且不需要调用外部类中的非静态属性和方法时,我们就可以用static来修饰这个内部类。
  • 区别:1)静态内部类可以有静态属性和方法
    2)静态内部类只能访问外部类中的静态属性和方法,非静态内部类可以访问外部类中的所用属性和方法。
    3)静态内部类可以直接生成对象Outer.Inner in = new Outer.Inner(),而内部类在生成对象时需要依赖外部类的对象实例,必须先生成一个外部类对象实例,再通过外部类的对象实例生成内部类对象。

3.3 PTA(继承覆盖综合练习-Person、Student、Employee、Company)。并回答:使用Collections.sort对引用类型数组进行排序需要有一个什么前提条件?

  • 需要实现Comparable或者Comparator接口并重写其中的方法。

4.大作业-继续完善(尝试使用接口改造你们的系统)
参考Case-StudentDao.zip案例
假设在不同的实现中,购物车里的商品有的是存放在ArrayList,有的是存放在数组中。

4.1 现在希望将系统中购物车的操作抽象到相应的DAO接口。

        interface ShoppingDao{
    	public boolean addSnack(Snack snack);
    	public boolean delSnack(Snack snack);
    	public double totalPrice();
    	public void displayAllGoods();
    }

4.2 为该接口定义至少两个实现(如数组、列表、文件)。截图自己负责部分的关键代码,要求出现名字与学号。
列表实现:

4.3 给出你们的Main程序,说明定义DAO接口的好处。

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in 

);
        Snack []snacks1 = new Snack[15];
        Snack []snacks = new Snack[80];
        Snack []snacksCount = new Snack[80];
        int n = 0 ;
        ShoppingDao shoppingDao = new ShoppingCartDaoList(); 

        System.out.println("\t**********货品清单**********");
        System.out.println("\t编号\t\t商品名称\t\t商品单价");
        for (Snack e: snacks1) {
            System.out.println("\t"+e.getNumber()+"\t\t"+ e.getName()+"\t\t" + e.getPrice());

        }
        System.out.print("\t\tWelcome~~~~\n\t请选择要购买的商品编号:");
        while(sc.hasNext())
        {
            int number = sc.nextInt();
            if (number == 0)
                break;
            snacks[n] =snacks1[number-1];
            System.out.print("\t请输入要购买的数量:");
            int num = sc.nextInt();
            snacks[n].setCount(num);
            shoppingDao.addSnack(snacks[n]);

            System.out.print("\t加入购物车成功!\t如果继续添加请输入商品编号,否则输入0结束!\n\t请输入:");
            n++;
        }

        System.out.println("*****User:201621123001张艺琳*****");

        System.out.println("\t\t++++++购物车列表++++++");
        shoppingDao.displayAllGoods();
        shoppingDao.totalAllPrice();
        shoppingDao.delSnack(snacks[1]);

    }

}
  • 好处:有了这个接口,我们可以用不同的形式来存储信息。

代码阅读:PersonTest.java(abstract、多态、super)
5.1 画出类的继承关系

5.2 main函数的代码实现什么功能?

  • 将Person中的四个对象按年龄升序输出。

5.3 如果将子类中的super构造函数去掉行不行?

  • 不行。子类需要super关键字来继承父类的构造函数。去掉super后子类将无法调用父类中重写的方法。

5.4 PersonTest.java中哪里体现了多态?
参考链接:
PersonTest.java

  • PersonTest.java中,各类都重写了toString方法,方法名相同但执行效果各异,这就是多态的一种体现。

3.码云及PTA

题集:jmu-Java-04-面向对象2-进阶-多态接口内部类

3.1. 码云代码提交记录

在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

3.2 截图PTA题集完成情况图

需要有两张图(1. 排名图。2.PTA提交列表图)

3.3 统计本周完成的代码量

需要将每周的代码统计情况融合到一张表中。

posted @ 2017-10-28 16:23  安晏菊  阅读(249)  评论(3编辑  收藏  举报