20182320 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结
Posted leonzheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20182320 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结相关的知识,希望对你有一定的参考价值。
20182320 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结
1.教材学习内容总结
本周学习内容分为以下几个部分:
- 4.8.1 迭代器和for循环
- 5.1 再谈类和对象
- 5.2 类的剖析
- 5.3 封装
- 5.4 方法的剖析
- 5.5 静态类成员
- 5.6 类关系
- 5.7 方法设计
- 5.8 方法重载
- 5.9 测试
- 5.10 调试
4.8.1 迭代器和for循环
什么是迭代器?
- 迭代器是一个对象,我们可以使用它的方法来处理某集合中的元素,一次处理一个。
- 每个迭代器对象都有一个方法hasNext,它返回一个布尔值。值为真的时候说明还有待处理的下一项,为假的时候说明没有。
- 迭代器还有一个next方法,可以获取集合中的下个数据项。
- 例子:Scanner类定义的对象就是迭代器。
迭代器和for循环:
- 当一个迭代器类的对象实现了Iterable接口,则可以使用变形的for循环处理每一项。
- 例如下面这个代码:
for (Book myBook : bookList)
System.out.println(mybook);
可以更细地拆分为:
Book myBook;
while(boookList.hasNext())
mybook=bookList.next();
System.out.println(myBook);
详解:bookList是一个Iterable对象,它保存了Book的对象,于是用for循环处理迭代器中的每个Book对象。
上述这样的循环叫做for-each语句。
- Scanner类也是一个迭代器,但是没有实现Iterable接口,所以它有hasNext和next方法但不能使用上述这样的循环。
5.1 再谈类和对象
- 回顾类和对象的关系:
类是对象的蓝图。
类表示的是概念,对象是对这个概念的实现。
- 每个对象都有一个状态(state),它由与对象相关的属性(attribute)来定义,而属性由类中声明的变量来定义。
- 每个对象都有一个行为(behavior),它由与对象相关的操作(operation)来定义,而行为由类中声明的方法来定义。
- 设计程序分为以下两大部分:
类和对象的确定
分配职责
5.2 类的剖析
- 类可以包含数据声明和方法声明两大部分,它们都是类的成员。
- 方法声明中也分为构造方法和普通方法。构造方法与类同名,普通方法定义对象提供的服务。
- 若一个文件中含有多个类,只能由一个类用保留字public声明。
- 公有类的名字必须与文件名相同。
- 实例数据指的是在类中声明的变量。它们可以被类中的任意方法引用。
5.3 封装
- 封装是对象的一个特性。它的意思是指一个对象的变量由其自身管理,一般不允许其他对象直接访问,只能通过特定的方法进行访问的这种特性。
- 可见性修饰符一共由三种:public(公有的)、private(私有的)和protected(保护的)。
public修饰的类成员可以在对象外直接引用;private修饰的类成员只能在其所定义的类中使用;protected一般用于包含于继承关系中的类,与其处在同一个包下的类可以直接引用,封装性介于public和private之间。
- 一个类中提供访问及修改数据值服务的是访问方法(accessor method)和设值方法(mutator method),通常命名为“get+访问的变量名”及“set+修改的变量名”。
5.4 方法的剖析
- 方法的结构,举例:
public int computeArea(int length,int width)
int area=length*width;
return area;
public——修饰符
int——返回值类型
computeArea——方法名(标识符)
int length/int width——参数
(可选)Throws子句,表示这个方法可能抛出的异常
内的内容——方法体
- return语句返回头部规定类型的返回值
- void类型不返回,也不含有return语句或只能含有“return;”语句
- 构造方法没有返回类型和返回值
- return语句过后控制立即返回调用的位置,并继续执行
- 方法声明头部的参数叫形参(formal parameter),调用方法时传给方法的值叫实参(actual parameter)。
- 方法内声明的叫局部数据,只能在方法中使用;在类中声明的叫实例数据,能在类中的任意方法中使用。
- 构造方法用来初始化每个对象对应的变量,名字必须与类名相同。
5.5 静态类成员
- 静态变量由static修饰符声明,它由类中的所有实例所共享。
- 局部变量不能是静态的。
- 静态方法可以直接通过类名调用,不需要实例化对象。
5.6 类的关系
- 依赖:一个类使用另一个类
- 聚合:某个对象由其他对象组成,成为聚合对象,形成has-a关系
- this引用:指向当前正在运行的对象
5.8 方法重载
- 方法重载指的是多个不同方法使用相同的方法名,但是根据它们之间参数个数的不同来区别要调用的是哪个方法。
5.9 测试
- 单元测试:为每个模块(方法)创建一个测试用例
- 测试驱动的开发(TDD测试):
先编写测试用例
然后编写能保证测试用例通过的源代码
教材学习中的问题和解决过程
- 问题1:为什么常量可以是公有的?
- 问题1解决方案:通过翻阅书本,得知,因为常量不可以被修改,因此设置为公有的不改变类的封装特性。
- 问题2:为什么类需要封装?
- 问题2解决方案:
通过查阅CSDN与百度知道等各类论坛,总结如下:
减少代码重写率,提高重复利用率
减少编译出错率
方便第三方进行调用
保证类的安全性
代码调试中的问题和解决过程
- 问题1:在编写PP5.3时,创建了枚举类型Side和它的变量side,对其赋值之后并不知道它如何输出
问题1解决方案:直到看到书上程序3.6,大概明白了枚举类型如何输出。
- 问题2:在编写PP5.3,参考Coin类的时候,不知道下面这个代码是什么意思
问题2解决方案:根据对C语言的浅薄印象和个人理解,我认为意思是:检测括号内两个值是否相等。若相等则返回"Heads";若不相等则返回"Tails"。
- 问题3:在编写PP5.6中的BoxTest时,单纯地想如下打叉的代码那般改变一下box2对象的填满状态,调成满的,结果发现好像不能这么改……
问题3解决方案:将其替代成打勾的代码,就可以完成这个功能了。
- 问题4:经历了上面的修改,我在运行程序的时候却发现上面的问题3的解决方法并不能改变full的取值,就算如下修改成主函数也不能实现。
问题4解决方案:可能是因为作用域的原因,我直接在测试方法内进行修改,就能顺利将box2的值修改成功。
- 问题5:在编写PP5.13的运行程序的时候,发现生成的牌都是同一个花色的。
问题5解决方案:发现我在生成随机数的代码部分使用强制转换的时候,没有把整个给括起来,导致生成的随机数只有一个值,添加括号即可。
代码托管
上周考试错题总结
错题1
原因:\\t是制表符,\\n是换行,\\r是回车。因此输出是:
1 big bad wolf 8 the 3 little pigs
4 dinner2night
错题2
原因: 保留字是系统中有预定义的特殊字符,println是System.out.object的方法。
错题3
原因: 取余运算符%可以用于运算所有类型的字符
结对及互评
点评过的同学博客和代码
其他(感悟、思考等,可选)
Java的类代码在仔细分析结构后其实很好理解,其提供的接口——程序间的联系途径是个很精妙的设计。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 208/208 | 2/2 | 9/9 | |
第二周 | 258/466 | 2/4 | 15/24 | |
第三周 | 693/1159 | 2/6 | 22/46 |
以上是关于20182320 2019-2020-1 《数据结构与面向对象程序设计》第4周学习总结的主要内容,如果未能解决你的问题,请参考以下文章
20182323 2019-2020-1 《数据结构与面向对象程序设计》实验七报告
20182308 2019-2020-1 《数据结构与面向对象程序设计》实验六报告