20172329 2017-2018-2 《程序设计与数据结构》第七周学习总结
20172329 2017-2018-2 《程序设计与数据结构》第七周学习总结
教材学习内容总结
第九章 继承
一、创建子类
1、继承:它是从现有类派生出新类的过程,并且是一种强有力的软件开发技术,他是面向对象的编程的显著特征。
2、通过继承,新类自动包含了原始类的变量和方法,然后程序员可以将新变量和方法添加到派生的新类,或者修改所继承的方法和变量。
3、特点:通过继承创建新类比重新鞋类更快捷、更容易且成本更低。继承是支持软件复用的途径之一。
4、用于派生类的成为父类、超类或基类,被派生出的类称为子类或亚类。Java用保留字extends指明新类有现有类派生。
5、protected修饰符:当一个变量或方法声明为protected可见性时,子类就可以引用它,并且父类保持了一定的封装性。
6、super引用:在一个类中可以使用保留字super引用父类,即使用super引用可以访问父类的成员;构造方法的第一行应该用super引用调用父类构造方法。
7、多继承:Java的继承方法叫做单继承,即子类只能有唯一的父类。
二、重写方法
1、当子类和父类有相同方法名和签名,子类方法将重写父类方法,子类方法优先。
2、类层次结构:从一个父类派生出的子类,还可以是它自己的子类,并且可以多个子类可以从一个父类派生。
3、抽象类:抽象类在类层次结构中充当占位符,注:对一个抽象方法使用final或static修饰符将产生矛盾。
教材学习中的问题和解决过程
- 问题1:书中讲到
一般而言,继承更加快捷。
但是有没有特别的时候呢?
- 问题1解决方案:在查找资料后,发现了这样一篇文章,说在Java里继承是有害的,
Jams Gosling(Java之父)做发起人讲话的时候在被问到:“如果你重新构造Java,你想改变什么?”的时候,说到:“我想抛弃classes”,他这样解释:“真正的问题不是由于class本身,而是实现继承(extends 关系)。接口继承(implements关系)是更好的。你应该尽可能的避免实现继承。”
-
问题2:软件复用是什么?
-
问题2解决方案:软件复用是使用现有软件组件实现或更新软件系统的过程。
它可以降低成本和开发时间,产生可靠的软件实现标准化,在不同应用中保持一致 。 -
问题3:抽象类与接口的区别?
-
问题3解决方案:
书中讲:
在抽象类中,每一个抽象方法都必须使用abstract修饰符,但抽象类不必一定包含抽象方法。
注:有抽象类派生的子类必须重写所有父类的抽象方法,否则该子类仍然是抽象类。
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
代码调试中的问题和解决过程
-
问题1:一开始不知道super怎么用,总是调用不对对象或者是方法。
-
问题1解决方案:发现我将继承和super调用弄混了,继承可以直接使用父类变量或者方法,我还在那里使劲用super调用。
-
问题2:为什么抽象类被子类继承以后,在驱动中输入System.out.println(....)调用方法显示出错?
但是当我直接提取方法的时候就可以:
- 问题2解决方案:
于是先是问同学,他们说是书上这样写的,也不知道为什么,
后来我发现,在子类中,输出的语句本身就是通过 System.out.println(....)定义的,所以我觉得在System.out.println()语句中不能再生成一个System.out.println();只能这样理解了,因为其他也说不清啊
代码托管
上周考试错题总结
-
错题1
In Java, arrays are
A. primitive data types
B. objects
C. interfaces
D. primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
E. Strings正确答案: B 我的答案: D
解析:在Java中,数组是作为对象实现的。该变量是存储整个数组的内存块的引用变量。但是,使用记号名称[index]而不是消息传递来访问数组。
原因:因为数组的运用和原始数据类型比较像,而且定义的时候也用到了,所以没有分清。
-
错题2
Given the following declarations, which of the following variables are arrays?
int [ ] a, b;
int c, d [ ];
A. a
B. a and b
C. a and d
D. a, b and d
E. a, b, c and d正确答案: D 我的答案: C
解析:第一个声明声明a和b都是int数组。第二个声明声明c和d是整数,但是在d的情况下是一个int数组。所以,a,b和d都是int数组。
原因:数组的定义,我本人为用逗号分开就代表已经分为定义两个部分,感觉自己傻,好傻
-
错题3
If a and b are both int arrays, then a = b; will
A. create an alias
B. copy all elements of b into a
C. copy the 0th element of b into the 0th element of a
D. return true if each corresponding element of b is equal to each corresponding element of a (that is, a [0] is equal to b [0], a [1] is equal to b [1] and so forth) and return false otherwise
E. return true if a and b are aliases and return false otherwise正确答案: A 我的答案: B
解析:“=”是一个赋值运算符。如果这两个变量都是基元,那么左边的变量会得到右边变量的副本(所以如果a和b是int值并且b = 5,那么a就变成5)。但是,由于a和b是数组,所以引用变量a被设置为引用变量b,导致a和b引用内存中的同一个数组,或者它们现在是彼此的别名。
原因:这个当时查了资料,也做了相关的实验,只发现了结构,没有特别在意别名的改变。
-
错题4
A Java main method uses the parameter (String [ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters.
A. true
B. false正确答案: A 我的答案: B
解析:主要方法需要参数,以防程序员希望允许用户提供命令行参数。然后,将在命令行输入的任何内容作为命令行参数接受。如果它是由空格分隔的几个单词,那么每个单词存储为一个单独的字符串数组元素。例如,“java foo.class hi there”会将变量[0]中的“hi”和变量[1]中的“there”存储起来以供程序使用。
原因:我认为还要加上什么-t呀之类的参数。
-
错题5
If the following statement is performed: CD [ ] my collection = new CD [200]; where CD is a previously defined class, then my collection [5] is a CD object.
A. true
B. false正确答案: A 我的答案: B
解析:变量mycollection被声明为一个CD对象数组,因此mycollection [5]是数组中的第6张CD,由于CD是一个对象,mycollection [5]是一个CD对象。
原因:他们之间的从属关系,没有搞得太明白。
-
错题6
In Java, an array can only store one type of data. For instance, you cannot create an array that stores both double and String values.
A. true
B. false正确答案: A 我的答案: B
解析:数组被称为同类型。这意味着存储在数组中的值的类型对于每个元素都必须是相同的。该类型由声明决定。所以,int [] x仅使x为int数组。所以,没有数组可以存储双打和字符串。
原因:解析里只是表面int型,假如就和书中例题一样是object呢?不理解.......
-
错题7
A ragged array is a multidimensional array whose initial indices don't all start at zero.
A. true
B. false正确答案: B 我的答案: A
解析:长度并不相等。Java中所有数组的初始索引必须从零开始。
原因:书中也好像写过可以不从0开始,那个ragged没有理解这个数组是个啥??
点评过的同学博客和代码
- 本周结对学习情况
- 博客中值得学习的或问题:
- 善于思考,勤于看书,可以在书中抠细节,把细节问题放大,解决起来更加方便。
- 代码中值得学习的或问题:
- 注释敲的很棒,可以让别人清楚明白这里到底是在做什么。
- 基于评分标准,我给本博客打分:11分。得分情况如下:
- 正确使用Markdown语法(加1分):
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 一个问题加1分
- 代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300行(加2分)
- 其他加分:
1). 代码Commit Message规范的加1分
2). 感想,体会不大空的加1分
- 本周结对学习情况
- 博客中值得学习的或问题:
- 内容详略得当;
- 代码调试环节比较详细;
- 基于评分标准,我给本博客打分:4分。得分情况如下:
- 正确使用Markdown语法(加1分):
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 一个问题加1分
- 代码调试中的问题和解决过程, 一个问题加1分
其他
这一周学习内容相比于上周稍微轻一点,但是中途又添加的实验学习,又需要我们花费不少时间去和我们最最亲爱的Java打交道了。
学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)
| -------- | :----------------😐:----------------😐:---------------: |:-----:
| 目标 | 5000行 | 30篇 | 400小时
| 第一周 | 156/156 | 1/1 | 15/15
| 第二周 | 217/371 | 1/2 | 20/35
| 第三周 | 233/604 | 2/4 | 20/55
| 第四周 | 1382/1986 | 1/5 | 35/90
| 第五周 | 146/2196 | 1/6 | 25/115
| 第六周 | 462/2658 | 1/7 | 15/130
| 第七周 |856/3514 | 1/8 | 20/150