20172321 2017-2018-2 《程序设计与数据结构》第7周学习总结
20172321 2017-2018-2 《程序设计与数据结构》第7周学习总结
教材学习内容总结
- 创建子类
- 继承在父类和子类之间建立一种“是”关系(保留字extends),继承具有单向性。
- protected可见提供了允许继承的最大可能的封装性,但构造方法不会继承。
- 使用super引用可以调用父类的构造方法,super引用调用父类构造方法的操作只能在子类中执行,并且必须是在第一行执行。
- java的继承方法为单继承。接口可以继承多个接口。
- 重写方法
- 子类方法优先(由final修饰定义一个方法子类不能重写)
- 影子变量——子类可以定义与父类同名的变量,重新声明可以改变变量类型,但通常应该避免使用。
- 类层差结构
- 一个子类可以是一个或多个其他类的父类,从而可以建立起类层次结构。继承机制具有传递性。
- object类:所有Java类都直接或间接地由object类派生。(Java的每一个类都继承toString和equals方法)
- 抽象类:抽象类不能被实例化(包含一个或多个抽象方法的类必须被声明为 抽象类),每一个抽象方法必须使用abstract修饰符。
- 在UML类图中,用斜体表示抽象类。
- 接口层次结构:继承的概念可以应用到接口,以便由一个接口派生另一个接口。
- 类的继承与接口的继承不能重叠,即接口不能用于派生新类,类不能用于派生接口。
- 仅当一个类设计为实现一个接口时,这个实现类和接口之间才有交互。
- 可见性
- 父类的私有成员也被子类继承,虽不能以成员名直接地访问这些私有成员,但可以间接地访问。
- 类间继承关系地设计
- 软件设计中必须特别精心地研究和设计类间继承关系地参差结构。
- final方法常用于保证该方法能在所有的子类中得到使用。
- final修饰符也可以作用于整个类。final类不能再用于派生新类。
教材学习中的问题和解决过程
- 问题1:super引用的意义和用法
- 问题1解决方案:
-
super出现在继承了父类的子类中,有三种存在方式:
- 第一种:
super.xxx
(xxx为变量名或对象名)
这种方法意义为,获取父类中的名字为xxx的变量或方法引用。
使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作 - 第二种
super.xxx
()(xxx为方法名)
这种方法意义为,直接访问并调用父类中的方法。 - 第三种
super()
这种方法意义为,调用父类的初始化方法,其实就是调用父类中的public xxx()
方法;
- 第一种:
-
- 问题2:抽象类和接口
- 问题2解决方案:
- 如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。
- 接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类,从我们不能实例化一个接口就可以看出。如new Runnable();肯定是错误的,我们只能new它的实现类。
- 问题3:几种可见性修饰符的差别(public、默认、private、protected)
- 问题3解决方案:
- public:被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
- private:私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
- protected:当父类和子类在同一个包中时,被声明为 protected 的变量、方法能被同一个包中的任何其他类访问;当父类和子类不在同一个包中时,子类实例可以访问其从父类继承而来的 protected 方法,而不能访问父类实例的protected方法。
- 默认:在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
代码调试中的问题和解决过程
- 问题1:抛硬币输出的和0000,这就很奇怪了,为什么会刚好全是0,而且这不是和啊。
-
问题1解决方案:在父类里面设置抛硬币的时候有点问题,导致抛到0的概率是100%,然后把
System.out.println("四个硬币的和为" + myCoin1.getF() + myCoin2.getF() + myCoin3.getF() + myCoin4.getF())
改成System.out.println("四个硬币的和为" + (myCoin1.getF() + myCoin2.getF() + myCoin3.getF() + myCoin4.getF()))
就把字符串的拼接变成相加了。 -
问题2:做pp9.3的时候,前几个子类都没有什么问题,但是与父类相比都是增加的String变量,最后一个我想增加一个int变量,然后就出现了问题
super(xxx)
时候一直有问题。
- 问题2解决方案:找出好几个错误之后还是有问题,最后我改变了一下
super()
里面几个的顺序才成功了。
代码托管
上周考试错题总结
-
错题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及原因,理解情况
The "off-by-one" error associated with arrays arises because
A . the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far
B . the last array index is at length + 1 and loops may only iterate to length, missing one
C . the last array element ends at length - 1 and loops may go one too far
D . programmers write a loop that goes from 0 to length - 1 whereas the array actually goes from 1 to length
E . none of the above, the "off-by-one" error has nothing to do with arrays
正确答案: A 错误答案: B
该数组初始化为[x],其中X是数组的大小。但是,数组的合法索引为0到X-1,所以程序员经常off-by-one,因为程序员会编写代码来尝试访问索引1到X。 -
错题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命令之后在命令行输入的任何内容都将被接受为命令行参数。如果它是由空格分隔的几个单词,那么每个单词将被存储为一个单独的字符串数组元素。例如,“Java foo.class Hi there”将“Hi”存储在变量[0]中,“there”存储在变量[1]中,以备程序可能使用。 -
错题5及原因,理解情况
Although methods may be declared with a variable length parameter list, class constructors cannot.
A . true
B . false
正确答案: B 错误答案: A
构造函数遵循与通常方法相同的规则,它们的参数列表是如何声明的,因此它们也可以支持可变长度参数列表。
结对及互评
点评模板:
-
博客中值得学习的或问题:
- 优点:每周重要成长记录很详细,在错题总结中有自己的实践。
- 问题:博客排版还需加强,尤其是图片的摆放。从问题总结中感觉对课本知识的挖掘不是很深入。教材内容总结还可以更详细一点。
-
代码中值得学习的或问题:
- commit提交的解释详细一些,但是意思的表达上和我实际差不多,我觉得我可以学习,以节约时间。
- 本周的课本上的代码和实验的代码并没有分开文件夹放置,今后找代码时可能存在些许困难,建议她分开放置。
-
基于评分标准,基于评分标准,我给本博客打分:14 。
得分情况如下:
- 正确使用Markdown语法(加1分)
- 模板中的要素齐全(加1分)
- 教材学习中的问题和解决过程, 加4分
- 代码调试中的问题和解决过程, 加4分
- 本周有效代码超过300分行,加2分
6 其他加分,加2分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
点评过的同学博客和代码
其他(感悟、思考等,可选)
难啊,真的难啊,生活真的很艰辛呢,但是,学习Java任重而道远,我最喜欢学习Java了,我最喜欢Java了,最喜欢了,喜欢。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 189/189 | 1/1 | 18/18 | |
第二周 | 250/439 | 2/3 | 21/39 | |
第三周 | 437/876 | 2/5 | 25/64 | |
第四周 | 459/1335 | 2/7 | 21/85 | |
第五周 | 547/1882 | 1/8 | 20/115 | |
第六周 | 592/2474 | 2/10 | 25/150 | |
第七周 | 782/3256 | 1/11 | 29/179 |