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


原因: 取余运算符%可以用于运算所有类型的字符

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182307
    • 结对照片
    • 结对学习内容
      • Java密码学算法
      • 编写类
  • 上周博客互评情况

其他(感悟、思考等,可选)

Java的类代码在仔细分析结构后其实很好理解,其提供的接口——程序间的联系途径是个很精妙的设计。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 208/208 2/2 9/9
第二周 258/466 2/4 15/24
第三周 693/1159 2/6 22/46
posted @ 2019-09-30 17:28  郑力元  阅读(197)  评论(1编辑  收藏  举报