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
需要完成comparator
或comparable
接口 - 此程序比较复杂的地方在于繁杂的继承与覆盖。在程序完成以后,虽然输出与题目样例相同,但OJ显示第一个测试点错误。此问题并没有解决。
4.大作业-继续完善(尝试使用接口改造你们的系统)
4.1 现在希望将系统中购物车的操作抽象到相应的DAO接口。
4.2 为该接口定义至少两个实现(如数组、列表、文件)。截图自己负责部分的关键代码,要求出现名字与学号。
我通过列表实现的该接口
数组形式、王祖建负责:
4.3 给出你们的Main程序,说明定义DAO接口的好处。
ps.此处Main程序,仅作用于测试,非完整主文件。
DAO接口的好处在于可以对相同方法运行不同实现方式,而无需改变其他程序。这样的做法大大降低了类之间的耦合性。极大地便利了编程工作。
5. 代码阅读:PersonTest.java(abstract、多态、super)
5.1 画出类的继承关系
5.2 main函数的代码实现什么功能?
创建四个对象,类分别为Employee
、Student
、Programmer
、Manager
并将其存于Person
数组中,将其按照年龄大小排序,最后输出。
5.3 如果将子类中的super构造函数去掉行不行?
不可以。
在查阅资料后,我了解到:子类不能访问父类的私有成员;然而子类还是继承了父类的属性与方法。
子类可以通过反射的方法来访问父类私有属性,当然这并非现阶段的学习任务。
现阶段,我们需要用super
调用构造函数来构造属性。
5.4 PersonTest.java中哪里体现了多态?
Employee
、Student
、Programmer
、Manager
、Person
类覆盖了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 |