20172301 2017-2018-2 《程序设计与数据结构》第七周学习总结
20172301 2017-2018-2 《程序设计与数据结构》第七周学习总结
教材学习内容总结
- 继承:简单来说就是在两个类之间建立一种“是”的关系。就像是马是动物,字典是书一样。子类是一种更具体的父类版本。但是,你能说动物就都是马吗?字典就都是书吗?不可以!所以,继承是单向的。 就是说,父类不能引用子类内部的声明的变量和方法。
- 在UML类图中,空心箭头线用于表示继承关系,箭头方向从子类指向父类。
我一直以为UML类图并没有特别大的作用,但是实验二的第五个告诉我了UML的重要性,所以还是要多多积累。
- protected修饰符 在前面的章节我们已经知道,可见性修饰符包括:public、private、protected。 那么修饰符protected有什么作用呢:
protected 可见性提供了允许继承的最大可能的封装性。
- <mark> 在UML类图中,protected成员前加“#”符号表示protected可见性。public成员前加“+”表示public可见性。private成员前加“-”表示private可见性。</mark>
- super 调用父类的方法和变量。
- java的继承方法称为单继承。
- 影子变量 子类可以定义与父类同名的变量,虽然不提倡这样做,但是这种定义是合法的
- 接口层次结构 继承的概念也可以用于接口,一个接口可以继承另一个接口,并且不用考虑可见性问题(因为接口的所有成员都是公共的)
类的继承和接口的继承不能重叠,即接口不能用于派生新类,类不能用于派生接口。- 在UML类图中,同样用空心箭头线表示接口之间的继承关系。
教材学习中的问题和解决过程
-
问题1:首先,我先讨论一下for循环和for-each循环的优缺点,是对上一章的查漏补缺。
-
问题1解决方法:我们写代码的时候都遇到过什么时候该用for循环和什么时候该用for-each循环的情况,尤其是在数组这一章节。
简单来说,for-each循环的局限性就在于无法修改数组里面的东西,它能够做到的就是比for循环更便捷的遍历数组。有时候,我们用for-each代替for确实能够更加方便,让程序更加清晰。
有时候,对章节中的知识认识还是不够深刻,希望自己以后可以认真理解课本。
参考资料:
深入理解java中for和foreach循环 -
问题2:继承和接口的区别
-
问题2解决方案:java中只能单继承,但是却可以实现多个接口。
我们都知道继承是一种“是”的关系,而接口呢,是拥有某种功能,能够做什么的关系。-
有一种很形象的理解:
我们说类的继承一般继承的是事物的属性,如:姓名,年龄,性别 等,而接口的继承(或者说实现)一般是继承事物的行为,如:行走,飞翔,游泳(这比较抽象,在一般项目中大部分是指对某事物的增删改查等操作)
总之,单继承描述了“is a”的关系,即“子is a父”;
多继承描述了“can do”的关系,即“子can do父”。 -
还有呢,在设计层次上,他们确实也是有一定区别的:
对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
-
参考资料:
Java中继承和接口的区别
Java ——基础之继承与接口的区别
java中继承与接口的区别
- 问题3:重写和重载的区别。
- 问题3解决方案:因为刚开始看书的时候认为重写和重载是一个意思,其实不然。重写也叫覆写,和重载是有一定区别的。
区别点 | 重载 | 重写(覆写) |
---|---|---|
英文 | Overloading | Overiding |
定义 | 方法名相同,参数列表不同,与返回值类型、访问修饰符无关。 | 方法名相同、参数列表相同、返回值类型相同 |
访问修饰符不能严于父类 | ||
范围 | 发生在一个类当中 | 发生在继承类当中 |
参考资料:
重载和重写有什么区别和联系?
方法重写与方法重载的区别
重载与重写的区别
- 问题4:如何理解类的继承和接口的继承不能重叠,即接口不能用于派生新类,类不能用于派生接口。
- 问题4解决方案:和队伍伙伴还有学长进行了探讨。
类可以继承,接口也可以继承。
类与接口之间只能说实现,不能说继承。
比如,父类实现了接口,子类就不需要实现了。因为父类实现接口就要重载方法,而子类可以继承父类的方法,就不需要实现接口。
子接口可以继承父接口。
比如说我们定义接口,哺乳动物,有两个方法,跑和跳。定义子接口,马,也会有两个方法,跑和跳。这时候,我们写个类,千里马,要实现马这个接口,就重载跑和跳的方法,怎么跑,怎么跳。一日千里,一跃千里。这里类就是实现了接口。
类可以继承,接口也可以继承,但是类和接口之间是实现不是继承。
- 问题5:保留字super的作用。我们都知道super引用可以调用父类的构造方法。也可以用于引用父类的其他变量和方法。
- 问题5解决方案:
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名
参考资料:
关键字super在java中的主要作用是什么,如何使用?
java 构造方法中super()的作用
代码调试中的问题和解决过程
- 项目9.1和9.3没有大问题,主要是实验问题。
- 问题1:.做PP9.1 的时候,sum问题。
- 问题1解决方案:求和的时候,我尝试了用数组并且用for-each进行循环。算是对上一周的进行巩固。然后,和伙伴李馨雨详细理解了一下for-each的用法。所以,实现结果不一定只通过某一种方法,把自己的思路打开,可以让自己拥有更多的选择
代码托管
上周考试错题总结
-
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
A . true
B . false
理解:这题我错选了false,因为我认为在命令行下输入的就是用户提供的参数。但是我还是不太理解为什么因为参数是一个字符串的数组用户就不需要提供任何参数了。 -
The "off-by-one" error associated with arrays arises because : A
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
理解:这题的知识点应该是差一错误。书上详细给出了解释:
这种错误由索引值比0小1或比(N-1)大1引起。
我错选了D,分析一下应该就是错的。数组的索引是0到N-1,1到N肯定是不对的。而反观A,第一个索引值是0,程序员从所以1开始或者是一个索引过远的循环,就正好是差一错误。这题主要是题意理解的不够清晰。
-
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
A . true
B . false
理解:这题真的纯属失误了,存储在数组中的值的类型必须与每个元素相同,以后应该避免这种送分题的错误。 -
If x is a char, and values is an int array, then values[x] : D
A . causes a syntax error
B . causes an Exception to be thrown
C . casts x as an int based on x's position in the alphabet (for instance, if x is 'a' then it uses 0 and if x is 'z' then it uses 25)
D . casts x as an int based on x's ASCII value (for instance, if x is 'a' then it uses 97 and if x is 'z' then it uses 122)
E . casts x as an int based on the digit that is stored in x (for instance, if x is '3' it uses 3) but throws an exception if x does not store a digit
理解:我们都知道int[],中括号中的值代表的是数组索引,肯定都是int型,所以如果x是char型肯定会有错误,所以我选了A。但是果真如此吗?!为了让自己心服口服,我写了代码验证。
由图我们可以观察到,并没有报错,程序自动将x转换为int,字符通过将char值转换为等效的ASCII值来转换为int类型。因此,如果x是'a',它被转换为int 97,因此值[x]访问值[97]。
-
An array index cannot be a float, double, boolean or String. : A
A . true
B . false
理解:数组索引必须是int型,也可以像上题是char型。 但是绝对不是float,double,boolean,string型。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
其他(感悟、思考等,可选)
这周的测试用了二十多分钟的时间,总体来说,效率是很高,但是一些很简单的错误还是无法避免。我看了,已经有同学开始用英语来写博客了。所以这周我也没有把错题翻译,而是直接复制过来。希望自己能跟上其他人的步伐。把英语和java掌握牢固。
偶尔看过一次队友李馨雨的书,画的五颜六色的。由此也可以看出来她的成绩和她的努力和细心是分不开的。如果我能多花时间看看书,说不定能有更大的进步。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 122/122 | 1/1 | 20/20 | |
第二周 | 487/609 | 1/2 | 18/38 | |
第三周 | 482/1091 | 1/3 | 22/60 | |
第四周 | 1357/2448 | 1/4 | 20/80 | |
第五周 | 628/3106 | 1/5 | 20/100 | |
第六周 | 566/3672 | 2/7 | 20/120 | |
第七周 | 934/4606 | 1/8 | 25/145 |