20172310 2017-2018-2 《程序设计与数据结构》第七周学习总结
20172310 2017-2018-2 《程序设计与数据结构》第七周学习总结
教材学习内容总结
其实课本第九章给了我们一个关于继承的小结,我就按照课本给的思路自己进行总结。
9.1创建子类。
1.子类与父类的关系。子类是父类的其中一种。也就像是子类是父类的一种,只不过更加的具体,有自己的特征。
Java用保留字extends实现派生操作。
2.子类的对象的实例化并不需要父类的实例化,且继承具有单向性。
2.protected修饰符让子类能够访问并且不违反封装性原则,当父类中的变量和方法被声明为protected可见性时,子类就可以使用。
3.构造方法是一种特殊的方法,用于创建一个具体的对象。所以父类的构造方法,子类不能继承。 但可以用super引用调用父类构造方法,
并且必须是在第一行执行。
9.2重写方法
1.子类和父类有相同的方法名和签名时,子类方法将重写父类方法,子类方法优先,但子类不能重写父类中final方法。
2.子类父类变量名可以同名,这种定义是合法的,但是不提倡。
9.3类层次结构
1.从一个父类派生出的子类,还可以是它自己子类的父类。一个父类可以派生多个子类,它们称为同胞。
2.子类个数和类层次数都没有限制,但公共特征应保持在尽可能高的类层次级上。
3.继承机制具有传递性。有可能子类的特性不是来自于父类,而是来自于父类的父类等等。
4.Java中所有的类归根结底都由Object类派生,如果没有extends子句显示的从另一个类中派生自己,则默认从Object类派生。
每一个类都继承toString方法和equals方法。
5.抽象类通常含一个或多个尚未定义的抽象方法,不能被实例化,所以抽象方法不使用final和static修饰符。我们用abstract修饰符
将一个类声明为抽象类,抽象类中的每一个抽象方法都必须使用abstract修饰符,但抽象类不必一定包括抽象方法。
6.抽象类在类层次结构中充当占位符,由抽象类派生的子类必须重写所有父类的抽象方法,否则该子类仍然是抽象方法。
7.抽象类与接口:父接口用于派生子接口时,子接口继承了父接口的所有抽象方法和常量,任何实现子接口的类都必须实现所有的抽象方法。
处理接口间的继承问题不存在可见性问题,因为一个接口的所有成员都是公共的。类和接口都可以用来继承,但不可重叠,
即接口不能用于派生新类,类不能用于派生接口。
9.4可见性。
1.父类的私有成员也被子类继承,即使不能直接引用父类成员,但可以间接地访问。(这点之前有点不理解,在下面我会给出自己的回答。)
教材学习中的问题和解决过程
-
问题1:
我注意到课本上给出的例子中super语句的位置不太一样,我就表示很疑惑,为什么第二个例子中super引用就不需要放在第一行了呢? -
问题1解决方案:其实在子类构造方法调用它的父类构造方法时,放在第一行是为了在子类构造方法执行之前父类就先初始化自己的变
量,否则子类中还是用不了父类的变量,以至于出错。但在第二个例子中,super是用来重写方法,用super只是为了调用父类中
message方法的内容,这个时候的super.message();放在哪一行都没什么大碍,只不过顺序会发生一些变动。
如图:
-
问题2:private可见性最严格,public可见性最弱,protected可见性居中,那private可见性的成员被子类继承有什么作用呢?
即使不能直接引用父类成员,但可以间接地访问,间接又是什么样的一种方式呢? -
问题2解决方案:以课本的例子来说,间接引用,就是如果私有变量或方法在这个父类的public方法中被引用了,子类就可以通过这
个public方法运用到private变量或是方法,打个比方,就像是套娃,你不可能不打开外面的娃娃就取到最里面那个娃娃(private),
但是你可以通过一个一个打开外面的娃娃(public,也相当于一个接触到private变量或方法的通道)拿到最里面这个娃娃。但是,
如果父类中的private变量或方法没有运用在任何的public方法中,那么这个时候是没有通道到达private的,这是继承下来私有可见性
的变量或方法就有些鸡肋了。 -
问题3:在一个类中定义了toString方法时,实际上是重写了从Object类中继承的toString方法,那么为什么这次的重写不需要加super,而
且在子类中为什么还要再写一个toString方法? -
问题3解决方案:
在第一个问题中就有提到,super时用来重写方法,用super只是为了调用父类中方法的内容,但是toString方法只是为了返回值,不需要引
用了内容,所以不需要加super。这是一种多态的表现,众多子类在某方面的表现未必与父类一致 ,如果没有重写Object类的toString()
方法,那么在你的类中调用时其实调用的是Object类中的toString()方法,这样你想要显示的信息就不能够准确的显示了。也可以说是各
个子类的对应覆盖方法应该要契合该子类本身的性格特征,而不能照抄父类的,因为子类除了继承了父类的,还有子类本身的特质,
这一点也须反映到相应的方法上。
代码调试中的问题和解决过程
-
问题1:编写pp9.1时遇到
发现在Monetary类的getFaceValue方法得到的返回值并不是硬币的面值。 -
问题1解决方案:仔细看过课本后,我发现在Coin类中filp()的返回值就不是一个int型数值,所以不可能将数组对象相加。
所以我在coin类中做了改动使flip()的返回值为int型
这时得到的返回值类型就是0或1。
代码托管
上周考试错题总结
-
错题1及原因,理解情况
数组索引必须是int类型,或者可以扩展为int类型的值(因此,char、byte和short也是允许的),但是long,double,boolean是不被允许的。 -
错题2及原因,理解情况
数组被初始化为= new type[x],其中x是数组的大小。然而,该数组的法律索引为0到x - 1,因此,程序员通常都发生差一错误,
因为程序员将编写代码来尝试访问索引1到x。当初就是没有理解到什么是“off-by-one"。 -
错题3及原因,理解情况
D的意思是如果数组中存储的类型是原始数据类型和对象,则原始数据类型是原始数据类型,对象存储在数组中的类型是一个对象。
而在Java中,数组被实现为对象。变量是存储整个数组的内存块的引用变量。然而,使用符号名称[索引]而不是通过消息传递来访问数组。 -
错题4及原因,理解情况
数组索引必须是一个int值,所以如果x不是int,那么通常值[x]会导致语法错误,但是Java编译器会自动将x转换为int,如果它可以被转换的话。
字符通过将char值转换为等效的ASCII值来转换为int类型。因此,如果x是'a',它被转换为int 97,因此值[x]访问值[97]。 -
错题5及原因,理解情况
只要只访问ArrayList的元素,它的效率与数组的效率差不多。只有当一个人开始在ArrayList的前部分插入或移除元素时,它的效率才会恶化,这是正确的。ArrayList是作为数组实现的,只要其中一个只是访问ArrayList的元素,效率与数组的效率是一样的。但是,当对ArrayList的前部分进行插入或删除时,就会发生大量的元素复制,从而降低其效率。 -
错题6及原因,理解情况
“=”是一个赋值运算符。如果两个变量都是原始的,把左边的变量赋给右边变量(如果a和b是int值,b = 5,然后a将成为5)。然而,因为a和b是数组的引用变量设置为参考变量b,在内存中导致a和b都引用同一个数组,或者他们现在互为的别名。而并不是会把b中所存的数据中复制到a中。 -
错题7及原因,理解情况
题目是:Java主方法使用参数(String[]变量),以便用户可以运行程序并提供“命令行”参数。
由于参数是一个字符串数组,以防程序员希望允许用户提供命令行参数。在java命令之后,在命令行输入的任何内容都将被接受为命令行参数。如果是由空格分隔的几个单词,那么每个单词都作为一个单独的字符串数组元素存储。例如,“java foo.class hi there“将在变量[0]和变量[1]中存储“hi”,以供程序使用。所以上述的语句是正确的。 -
错题8及原因,理解情况
第一个声明声明a和b都是int数组。第二个声明声明c和d是ints,但对于d,一个int数组。a b和d都是int数组。对于声明语句理解的还不是很透彻。
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评模板:
- 博客中值得学习的或问题:
- 对课本上的一些重难点做了详细的小结,(修改之前)但有时还存在一些错误,就像是
类继承父类的成员变量。
当子类继承了某个类之后,可以使用父类中的成员变量,但是不是完全继承父类中的成员变量。规则如下:
1.能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
同样的,子类也并非完全的继承父类中的方法,规则如下:
能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
其实课本上的297面有说过“父类的私有成员也被子类继承,即使不能直接引用父类成员,但可以间接地访问。”
- 模板在持续的改进,越来越好看,且字体的颜色也很丰富,能够突出强调重点。
- 解决问题的时候参考了其他人的博客,挑选了其中比较准确的博客。
- 问题的解决过程记录很详细。
- 代码中值得学习的或问题:
- 对问题的发生原因进行了详细地思考,问题解决的过程非常清晰。
点评过的同学博客和代码
-
本周结对学习情况
- 20172309
- 结对学习内容
- 本周我们小组结对学习了课本第九章,对课本中的一些疑问和课后练习进行了讨论。
- 本周在小组成员的帮助下修改了博客的样式,并为博客添加了目录,让自己的博客更加美观了一点(ヾ(✿゚▽゚)ノ)。
- 本周还有共同理解学习并完成了实验二中的5个问题。
-
上周博客互评情况
其他(感悟、思考等,可选)
感觉我们现在的学习速度越来越快了,但是自己还是停留在有时一个pp作业要编写2、3个小时,甚至有时候2、3个小时都解决不了问题,所以老是感觉自己比别人慢了一个拍。(这让我挺受挫的 。打击!!_| ̄|○)虽然这周只要学习一个章节,但是还有实验二要完成,自己在Java方面的能力不强,所以感觉有些吃力,当然不是说自己不愿花时间,也不是没有花时间(课外实际几乎全都贡献给了Java),但很多的细节其实还是没怎么理解好,所以觉得自己一定不要放过小小的细节,努力提高自己完成作业的效率。(加油吧 ┐(´∀`)┌)。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 127/127 | 1/1 | 25/25 | |
第二周 | 278/405 | 1/2 | 20/45 | |
第三周 | 442/847 | 1/3 | 20/65 | |
第四周 | 1063/1910 | 2/5 | 30/95 | |
第五周 | 840/2750 | 1/6 | 27/122 | |
第六周 | 631/3381 | 1/7 | 20/142 | |
第七周 | 914/4295 | 1/8 | 20/162 |