20172323 2017-2018-2 《程序设计与数据结构》第七周学习总结
教材学习内容总结
- 本周学习第九章继承。
- 创建子类:
- 继承是从现有类派生新类的过程。
- 创建子类的目的之一就是复用现有软件,避免了可能产生错误的代码复制和修改。
- 用于派生新类的原始类称为父类,被派生出的类称为子类。Java用保留字extend指明新类由现有类派生。继承在父类和子类之间建立一种“是”关系。
- protected修饰符:protected可见性提供了允许继承的最大可能的封装性。所有的方法和变量都将由子类继承,并且为变量预留内存空间。但是,构造方法不会继承。
- super引用:super引用可以调用父类的构造方法。也可以用于调用子类中重载方法的父类版本
- 方法重写:子类和父类有相同的方法名和签名时,子类方法将重写父类方法。 构造方法是一个特殊的方法,子类不能重写其父类中的构造方法。final方法也是不能被重写的。
- 类层次结构:一个类的子类还可以是一个或多个其他类的父类,由此建立起类层次结构。
- 继承机制具有传递性,应当合理地将类的公共特征保持在尽可能高的类层级上。
- 所有的Java类都直接或间接地由object类派生。
- 抽象类:可用abstract修饰符见过一个类声明为抽象类。不能实例化抽象类。抽象类代表一种概念,子类将基于这种概念来定义方法。由抽象类派生的子类必须重写所有父类的抽象方法,否则该子类仍然是抽象类。
- 接口层次结构:继承的概念可以应用到接口,以便由一个接口派生另一个接口。
- 可见性
- 继承的限制:final修饰符可用于限制继承。
教材学习中的问题和解决过程
- 问题1:protected修饰符的作用
- 问题1解决方案:一个声明为具有protected可见性的变量或方法,可以由子类按名字引用,同时还保持了某种程度的封装性。protected可见性给同一包中的任何类赋予访问权。
- 问题2:为什么子类必须重写其父类中的toString方法?
- 问题2解决方案:即使在当前的程序中该方法没有被子类调用,也应在子类中重写父类的toString方法,为避免以后出现问题。因为以后可能有人在直接使用该子类或继承子类时,会认为该子类已经存在一个有效的toString方法。
代码调试中的问题和解决过程
- 问题1:PP9.1中,首先我对“声明一个变量来保存硬币面值”就有一些困惑,硬币面值是如何定义的,怎么样才算作将硬币面值保存在变量中。
- 问题1解决方案:重新理解了一遍Coin的定义,我觉得题目所指的硬币面值在这里指的应该是硬币的当前状态--“当硬币为正面时用0表示,当硬币为反面时用1表示”。而保存硬币面值应该是指声明一个变量,使得父类通过
flip
方法得到的硬币面值face
保存在该变量中,使得在子类中可以使用新声明的变量引用父类的值。于是我最后的定义是 - 问题2:PP9.1题目中要求的计算若干个MonetaryCoin对象的和?
- 问题2解决方案:在之前的分析中,我已经默认硬币面值为表示硬币的当前状态,求和不知道有何意义。但也只有照做,运行结果如图
- 问题3:如图所示
- 问题3解决方案:变量的声明和定义语句不能放在同一个句子中运行,应该修改成
int sum = 0; sum += coins[x].getFacevalue();
- 问题4:上周提到的IDEA无法上传的解决。博客链接
- 问题4解决方案:运用最粗暴简单的方法,把本地的项目再次删除(始终保持一周一次的删除频率)再次克隆下来,重新设置了一遍,目前来说是可以了。
代码托管
上周考试错题总结
- 错题1:An array index cannot be a float, double, boolean or String.(数组索引不能是float,double,boolean或String)
A . true
B . false - 解析:正确。数组索引必须是int类型,或者可以扩展为int类型的值(因此,char、byte和short也是允许的)。
- 错题2:It is possible to sort an array of int, float, double or String, but not an array of an Object class such as a CD class.(可以对数组中的int、float、double或String进行排序,但不能对对象类(如CD类)进行排序。)
A . true
B . false - 解析:只要类型有某种机制来比较两个元素并确定它们的正确排序(小于、相等、大于),就可以对任何类型的数组进行排序。因此,如果CD类有一个compareTo方法,那么就有可能对它们进行排序。
- 错题3:Although methods may be declared with a variable length parameter list, class constructors cannot.(虽然方法可以用可变长度参数列表声明,但是类构造函数不能。)
- 解析:构造函数遵循与常规方法相同的规则,它们的参数列表是如何声明的,因此它们也可以支持可变长度参数列表。
结对与互评
点评
- 博客中值得学习的或问题:两位同学的排版都非常精美,问题也非常详细且有自己的理解,可以说是非常认真了,相较之下我还差得比较多。
- 代码中值得学习的或问题:commit的写法也特别值得借鉴,代码的逻辑性也很强。
- 基于评分标准,我给谭鑫的博客打分:11分。得分情况如下:
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
代码Commit Message规范(加1分)
排版精美(加1分)
错题学习深入(加1分)
点评认真,能指出博客和代码中的问题(加1分)
问题5个(加5分) - 基于评分标准,我给方艺雯的博客打分:13分。得分情况如下:
正确使用Markdown语法(加1分)
模板中的要素齐全(加1分)
问题9个(加9分)
代码Commit Message规范(加1分)
排版精美(加1分)
点评过的同学博客和代码
其他
本周课本上的内容并不是特别多,布置的作业也相对较易。但本章的定义其实不少,对于我这样对定义一点也不敏感的人而言,其实需要警觉。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 117/117 | 1/1 | 19/19 | |
第二周 | 289/406 | 1/2 | 21/40 | |
第三周 | 403/809 | 2/4 | 22/62 | |
第四周 | 1783/2592 | 1/5 | 35/97 | |
第五周 | 770/3362 | 1/6 | 25/122 | |
第六周 | 734/4096 | 1/7 | 25/147 | |
第七周 | 687 / 4783 | 1/8 | 25/172 |
-
计划学习时间:20小时
-
实际学习时间:25小时