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

1. 本周学习总结

1.1 面向对象学习暂告一段落,请使用思维导图,以封装、继承、多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结。


2. 书面作业

1. clone方法

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

答: 不能成功

  • 首先,对于另一个包没有进行import引入
  • 即使引入,因为clone方法是protected修饰的,所以包外无法使用,会出现The method clone() from the type Object is not visible,此方法不可见

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

  • clone方法覆盖为public
  • 注意实现目标是深拷贝还是浅拷贝
  • 要调用super.clone()方法
  • 需要实现cloneable接口

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

答: 通过查阅资料,我的理解是,假如把clone方法定义为public,失去了安全机制;有时候,我们并不希望谁都可以对对象进行clone。作为浅拷贝,这会造成数据的混乱,也有可能更改原来的数据。
若把clone方法设置为protected,我们被要求如果不在同包下操作,则必须要重写为public,去实现深拷贝——将所有数据都进行拷贝而非改动元数据

2. 内部类

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

2.2. 分析下列代码,回答shapeComparator所指向的对象与Comparator接口有什么关系?

Comparator<Shape> shapeComparator = new Comparator<Shape>() { @Override public int compare(Shape o1, Shape o2) { //你的代码 } };

答: 此处,使用匿名内部类的形式,为shapeComparator创建了一个对象。且这个匿名内部类完成了Comparator接口,重写了compare方法。这使得此对象可以作为完成Comparator接口的对象使用。

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

实验总结: 此实验虽然用到了ActionListener类,但实际上只是借用接口来传递简单的循环事件,只需要在接口要求的方法public void actionPerformed(ActionEvent e)中完成循环就可以了。
好处: 匿名内部类的一个好处在于极大的简化了工作量。对于那些只需要临时使用一次的对象,我们可以不去写一个完整的类,而是直接对其进行匿名内部类初始化。这使得编程变得极为灵活;
另一个好处在于,我们可以使用匿名内部类调用那些声明为protected的方法。通过匿名内部类,我们将其重写一个public方法并调用父类方法。

3. PTA实验总结

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

  • 实现栈的方式与C语言并没有什么不同。只不过要注意题中在没有数字是输出的是null而不是0。这说明需要用Integer类型而非int。
  • 定义接口的好处在于可以随时将接口的实现方法换掉,也就是降低了程序主题mian方法与栈实现方法的耦合性。我们可以用其他方法,例如arraylist实现栈。

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

  • 实验的重点在于完成静态内部类以及静态方法上。注意静态方法只能调用静态内部类。
  • 静态内部类应该适用于要描述的是相对独立的、受外部影响小的类的时候。
  • 静态内部类与内部类的区别最主要的地方在于对于外部成员的访问;静态内部类只能访问外部静态方法与属性,而内部类则没有这种限制。同样,静态内部类对于外部成员的依赖性也较小。

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

  • 使用Collections.sort需要完成comparatorcomparable接口
  • 此程序比较复杂的地方在于繁杂的继承与覆盖。在程序完成以后,虽然输出与题目样例相同,但OJ显示第一个测试点错误。此问题并没有解决。

4.大作业-继续完善(尝试使用接口改造你们的系统)

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

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

我通过列表实现的该接口



数组形式、王祖建负责:

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

ps.此处Main程序,仅作用于测试,非完整主文件。

DAO接口的好处在于可以对相同方法运行不同实现方式,而无需改变其他程序。这样的做法大大降低了类之间的耦合性。极大地便利了编程工作。

5. 代码阅读:PersonTest.java(abstract、多态、super)

5.1 画出类的继承关系

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

创建四个对象,类分别为EmployeeStudentProgrammerManager并将其存于Person数组中,将其按照年龄大小排序,最后输出。

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

不可以。
在查阅资料后,我了解到:子类不能访问父类的私有成员;然而子类还是继承了父类的属性与方法。
子类可以通过反射的方法来访问父类私有属性,当然这并非现阶段的学习任务。
现阶段,我们需要用super调用构造函数来构造属性。

5.4 PersonTest.java中哪里体现了多态?

EmployeeStudentProgrammerManagerPerson类覆盖了toString方法体现了多态


3.码云及PTA

3.1. 码云代码提交记录

3.2 截图PTA题集完成情况图


3.3 统计本周完成的代码量

周次 总代码量 新增代码量 总文件数 新增文件数
1 0 0 0 0
2 0 0 0 0
3 619 619 15 15
4 619 0 15 0
5 973 354 25 10
6 1394 421 37 12
7 2001 607 43 6
posted @ 2017-10-26 21:45  pirrat  阅读(221)  评论(2编辑  收藏  举报