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 统计本周完成的代码量

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



最新文章

  1. ftp常用命令
  2. (转)spring boot注解 --@EnableAsync 异步调用
  3. Android自定义View之倒计时Countdown实现
  4. mysql数据库移植
  5. Hibernate关联映射关系
  6. ActiveMQ学习(四)——应用程序接口
  7. c数组与指针
  8. Android 使用MediaRecorder录音
  9. 在linux的shell里访问一个URL
  10. lightoj 1198 最大权重匹配
  11. php 利用socket上传文件
  12. Fillder安装,如何解决证书无法导出
  13. Unity 关于AssetBundle读取场景
  14. nc linux命令详解
  15. FCC JS基础算法题(1):Factorialize a Number(计算一个整数的阶乘)
  16. SSH原理和应用
  17. github个人作业
  18. 2018.10.31 bzoj3339&&3585mex(主席树)
  19. Android-Binder机制
  20. Receiver not registered.

热门文章

  1. mysql float 浮点型
  2. 华硕主板M2N-电源跳线怎么接
  3. Underscore.js (1.7.0)-函数预览
  4. HBase表预分区
  5. Sql Server CPU 性能排查及优化的相关 Sql
  6. docker 容器目录挂载 | 进出容器
  7. pyDay9
  8. 20145105 《Java程序设计》第1周学习总结
  9. 20145326 《Java程序设计》实验一实验报告
  10. Firefox管理已经保存的账号和密码