20182301 2019-2020-1 《数据结构与面向对象程序设计》第5周学习总结
教材学习内容总结
- 继承
- 继承是从已有类派生一个新类的过程
- 继承的目的之一是复用已有的软件
- 继承在父类与子类之间建立了is-a的关系
- 类的继承格式
- class 父类{};
- class 子类 extends 父类{};
- interface 父类{};
- class 子类 implements 父类{};
- super和this
- super:可以通过super来实现对父类的访问,用来引用当前对象的父类
- this:指向自己的引用
- 构造函数
- 子类不能继承父类的构造函数
- 父类的构造函数带有参数,必须在子类的构造函数中显式地听过super关键字调用父类的构造函数并配以适当的参数列表
- 无参构造函数,则super调用父类的构造函数不是必须,如果没有使用,子类会自动调用父类的无参构造器
- 类层次结构:父类派生子类,子类可以继续派生
- 公共特性应该放到类层次尽可能高的位置上
- object类
- object类在java标准类库java.lang包中定义
- java中所有的类都派生自object类
- java中每个类都继承了toString和equals方法
- 如果一个类定义时没有显示的指名其父类,那么此类继承自object类。因此,object类是类层次结构中的根类。
- 方法重写:子类定义的方法与父类定义的方法有相同名字和相同签名
- 子类可以重定义继承自父类的方法
- 方法可以用final(终极)修饰符来定义。子类不能重写终极方法
- 隐藏变量需要注意,不推荐使用
- 抽象类
- 抽象类不能实例化,但是他提供的概念可由其他类来定义
- 派生于抽象父类的类必须重写父类中所有的抽象方法,否则派生的类仍为抽象方法。
- 抽象类的子类将对从父类继承的抽象方法提供具体定义——方法重写特殊情况
- 可见性
- 私有成员也被子类继承,但不能通过名字直接引用。不过可以间接引用他们。
- 设计继承
- 每次派生操作都应是一个is-a关系。子类应该是更具体的父类对象
- 设计类层次是为了复用,或是将来可以复用
- 在问题域中标出类和对象时,找出他们的共性。共性处于越高层次,越能保持一致性,进行维护。
- 适当地重写方法来满足子类性能
- 按需给子类添加新的变量,但不要隐藏继承的任何变量
- 允许每个类管理它自己的数据。所以使用super引用来调用构造方法,可以用它调用被重写的方法
- 设计类层次来满足应用需求,需要注意将来如何使用
- 即使目前并不使用,也要适当地在子类重写toString和equals这类的一般方法,以便将来派生的类不会出现问题
- 使用抽象类来为类层次中的具体类指定一个公共类接口
- 谨慎使用可见性修饰符,在派生类中提供不违背封装原则访问即可。
教材学习中的问题和解决过程
-
问题1:构造函数中一般写什么方法?
-
问题1解决方案:
-
构造函数是类的一种特殊方法,它的特殊性主要体现在如下的几个方面:
- 构造函数的方法名与类名相同。
- 构造函数没有返回类型。
- 构造函数的主要作用是完成对类对象的初始化工作。
- 构造函数不能由编程人员显式地直接调用。
- 在创建一个类的新对象时,系统会自动调用该类的构造函数为新对象初始化。
-
问题2:方法的重写究竟有什么好处?
-
问题2解决方案:
- 重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!
- 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
- 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
-
问题3:迭代器的用法?
-
问题3解决方案:
-
迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:- 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
- 使用next()获得序列中的下一个元素。
- 使用hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新返回的元素删除。
-
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
-
迭代器应用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
代码调试中的问题和解决过程
- 问题1:例题中第一版与第二版之间的区别?
- 问题1解决方案:
第二版相较于第一版都增加了构造函数,并且使用了super。这样做得好处是:改动一个数值后,可以不用管其他函数。
以后练习时,可以多多运用。 - 问题2:构造函数里的数据不能移到外面来用,怎么办?
- 问题2解决方案:使用public,搞定。
- 问题3:接口计算器,该怎么写?
- 问题3解决方案:一开始并不明白如何使用接口,在查找资料后,理解并明白了,接口可以更好地理清代码者的思维,将需要的方法一一写出(不写构造函数)
在写完计算器后,该题可以说是如鱼得水,只需要再添加对比方法
代码托管
8.6的代码不小心标注成8.8,辛苦学长学姐看的时候麻烦一点
书本代码
(statistics.sh脚本的运行结果截图)
上周考试错题总结
本周正值十一假期,故无错题。
结对及互评
-
博客中值得学习的或问题:
- 迭代器和for循环对比?(2303)
- 删去调用对象的类内的toString方法,使用Println方法也能产生?(2311)
-
代码中值得学习的或问题:
- Math里面的随机数方法是random不是Random,注意区分大小写。
- 在输入字符时,使用nextChar方法(2303)
-
基于评分标准,我给本博客打分:14分。得分情况如下:
- 正确使用Markdown语法 1分
- 模板中的要素齐全 1分
- 教材学习中的问题和解决过程 3分
- 代码调试中的问题和解决过程 3分
- 感想,体会不假大空 1分
- 排版精美的 1分
- 进度条中记录学习时间与改进情况 1分
- 点评认真,能指出博客和代码中的问题 1分
- 错题学习深入 1分
- 结对学习情况真实可信 1分
点评过的同学博客和代码
- 本周结对学习情况
- 20182326
- 结对照片
- 结对学习内容
- 完成Java密码学相关内容的学习
- 远程操控进行微信联系,学习
其他(感悟、思考等,可选)
《Think in Java》中写道:“开发一个程序时,最好的方法就是将对象想象为‘服务提供者’,程序通过调用若干对象提供的服务来实现预期目标。”
我必须不断训练自己拥有这个思维。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 69/69 | 2/2 | 30/30 | |
第二、三周 | 529/598 | 3/5 | 25/55 | |
第四周 | 300/898 | 2/7 | 25/80 | |
第五周 | 2665/3563 | 2/9 | 30/110 | 接口与远程 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:30小时
-
实际学习时间:30小时
-
改进情况:
这周感觉已经走上正轨,可以比较深入的进行思考