学号20172328《程序设计与数据结构》第八周学习总结
教材学习内容总结
- 1.绑定:在程序执行的某个时刻可能会产生一个请求事件,要求执行某段代码来完成一个方法调用,这种请求事件称为一个方法调用与一个方法定义的绑定。
- 后绑定:对于多态性引用,这种绑定延迟到程序运行时才能执行,并且要绑定的方法取决于编译阶段。对于多态性引用,这种绑定要延迟到程序运行时才能执行,并且要绑定的方法取决于当时引用变量所引用的对象。这一被延迟的请求事件被称为后绑定或动态绑定。
- 2.多态性引用能够随时间变化指向不同类型的对象。对于多态性引用,方法调用与方法定义代码的绑定在运行时执行。
- 在Java中,可以用两种方式建立起多态性引用:
继承方式
和接口方式
。
- 在Java中,可以用两种方式建立起多态性引用:
- 3.利用继承实现多态性:
- 当用类名声明了一个引用变量时,这个变量可以指向该类的任何一个对象,也可以引用通过继承与它所声明的类型有关的任何类的对象。
- 并且这种关系对整个类层次结构都有效。例如:
Animal creature = new Horse
(Animal是Mammel的父类,Horse是Mammel的子类)
- 4.利用接口实现多态性:
- 类名可以用于声明对象引用变量,接口名也可以用于做声明对象引用变量的类型。
- 一个接口引用变量可以指向任何实现该接口类的对象。
- Please Remember:当使用接口引用变量时,只能调用在定义在接口中的方法,即使接口引用变量所指向的对象还有一些其他可用方法也不能够实现调用。
- 接口名可以用作方法参数,使得任何一种实现同一接口的类对象都可以作为参数传给方法。 方法的参数可以使多态性的,使得方法所接收的参数具有灵活性。
- 5.排序:排序是将一组元素调整为有序排列的过程。
- 选择排序法:先去检索所有元素,找最小和第一个换位置,继续找二小与第二元素换位置~~~然后就排成了从小到大递增有序数列。同理也可以排出从大到小递减数列。
int min;
Comparable temp;
for(int index = 0;index < list.length-1 ; index ++)
{
min = index;
for(int scan = index + 1; scan < list.length ; scan ++)
if(list[scan].compareTo(list[min])<0)
min = scan ;
temp = list[min];
list[min] = list[index];
list[index] = temp;
}
- 插入法排序:先对数列的前两个元素进行排序,然后在插入第三个元素然后排序·······然后就排成了从小到大递增有序数列。同理也可以排成从大到小递减数列。
for(int index = 1;index < list.length;index++)
{
Comparable key = list[index];
int position = index;
while(position > 0 && key.compareTo(list[position-1]) < 0)
{
list[position] = list[position -1];
position--;
}
list[position] = key;
}
- 两种排序算法的比较
效率是比较排序算法的基本标准。选择插入法和插入排序法实际上有相同的效率。两种算法大约都执行n²次比较操作(其中n是数列中值的个数)。选择排序法容易理解,大多数情况下能一次性准确的移动到自己的位置,所以选择排序法优于插入排序法。
教材学习中的问题和解决过程
- 问题1:对象?引用变量??对象引用变量???
- 1.(〃'▽'〃)本题解答:当时在看书过程中一直弄不清这都是些什么。迷迷糊糊、稀里糊涂看完两遍书都不怎么明白。然后只能去寻找一下详细解释。
Vehicle veh1;
veh1 = new Vehicle();
效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。
在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,
我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“Vehicle”。不对,“Vehicle”是类(对象的创建模板)的名字。
- 问题2:接口可以实现接口吗?接口可以继承接口吗?这两者有什么关系?
- 2.(〃'▽'〃)本题解答:通过小组讨论,得到问题的解决,也去网上搜索了。
-
接口可以继承接口,并且可以继承不只一个接口,但是不能实现接口。因为接口的成员方法都具有抽象属性,不具有方法体,无法实现继承的接口。
- 我自己的理解:接口是常量和抽象方法的集合体。实现接口是指将接口中的抽象方法具体化,继承接口是指将接口中的方法继承下来但不具体化。因此,接口不能实现接口而接口可以继承接口。
-
- 问题3:课本中SR10.5的答案不能理解。设MusicPlayer类是CDPlayer类的父类,判断下列语句是否合法。
MusicPlayer mplayer = new MusicPlayer();
CDplayer cdplayer = new CDPlayer();
mplayer = cdplayer;
答案是:第三条语句不合法,一个MusicPlayer不一定就是CDPlayer。没有++先用cast进行类型转换++就直接赋值是不合法的。
- 3.(〃'▽'〃)本题解答:子类继承父类是对父类所提供的服务接口的一个扩展,也就是说 父类提供的接口是子类所提供接口的一个子集,所以说单纯的父类对象时无法转型某个子类对象的。
java对象类型转换 - 问题4:对课本上SR10.11的c、d问题不理解。(题目太长不好发挥,书本322页你想了解的话去看一下喽ヾ(◍°∇°◍)ノ゙)
4.(〃'▽'〃)本题解答:接口的引用变量可以被实现接口对象赋值,相当于将地址赋给它。
❀拓展:继承中也可以将继承父类的两个子类的对象相互赋值,其实质也是改变对象地址。代码调试中的问题和解决过程
- 问题1:在做pp10.1时就遇到了卡壳的地方,我创建了一个payable接口,然后不知道给接口里面放什么方法,思索良久后自己编了一个不带返回值的payable抽象方法,但是不能成功并且也无法输出具体的有效的东西。
- 1.(〃'▽'〃)本题解答:我还是询问了同学,将Payable接口中的方法直接改成了payday(),然后就能够输出了。再加思索,我觉得是因为继承接口后要去实现它才可以,自己的问题原来是出现在这里。其实很简单的事情。
问题2:开始做pp10.5,参考了同学们的博客,但自己还是没有明晰的思路。看到侯泽阳同学将DVDCollection对象改成了DVD数组对象,觉得非常聪明,自己终于理解了,一步一步改后,然后!!!!!bug华丽登场。
2.(〃'▽'〃)本题解答:今天通过晓海同学的认真讲解成功找到了问题所在,应用这个类也需要Comparable接口,要实现Comparable接口就要提供compareTo方法的定义(实现代码)。书上的Contact类就是很好的例子。然后我直接用了刚改写的成为递减的Sorting类中插入排序法进行方法调用,然后用for-each遍历出数组。然后我就又用选择排序法试了试,然后发现都是可以的。给你贴图看!呐!这件事让我学到,不会的话写博客贴出来,说不定好心人就帮你解决了呢!还有就是,看书要仔细要仔细要仔细。
代码托管
第一次用IDEA进行代码量统计哦
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 问题1: If a programmer writes a class wanting it to be extended by another programmer, then this programmer must(如果一个程序员写了一个类,这个类想要被其他程序员拓展,那么这个程序员应该?)
A . change private methods and instance data to be protected(将私有方法和示例数据改为protected型)
B . change public methods and instance data to be protected(把公有方法示例数据改为protected型)
C . change all methods to be protected(改变所有的方法为protected型)
D . change the class to be protected(将类改变为protected型)
E . none of the above, the programmer does not have to change anything(上述没有正确答案,这个程序员不需要改变任何) - 问题1分析和领悟:正确答案A。我当时选择E。声明为protected的部分可以由定义它们的类的任何子类访问,而声明为private的部分不能被任何其他类访问。因此,以前定义的private项必须受到保护。以前定义的public项应该保持,以便所有其他类仍然可以访问这些public项。以前定义的private不应该公开,因为这将允许所有类访问它们,而不仅仅是子类。
- 问题2:Which of the following is true regarding Java classes?(关于java类,下面哪一个是正确的?)
A . All classes must have 1 parent but may have any number of children (derived or extended) classes(所有的类都必须有一个父类但是可以有无限的子类)
B . All classes must have 1 child (derived or extended) class but may have any number of parent classes(所有的类都必须有一个子类,但可以有无限的父类)
C . All classes must have 1 parent class and may have a single child (derived or extended) class(所有的类都必须有一个父类和一个子类)
D . All classes can have any number (0 or more) of parent classes and any number of children (derived or extended) classes(所有的类可以有任何数量的父类和子类)
E . All classes can have either 0 or 1 parent class and any number of children (derived or extended) classes(所有类都有1个或者0个父类和无限多的子类) - 问题2分析和领悟:正确答案选A,我当时选择E。老师在课堂上强调的时候才对这个问题有了更深刻的了解。object类是所有类的父类,也就是说,所有的类都是object类派生出来的。因此答案选A。
- 问题3:A variable declared to be of one class can later reference an extended class of that class. This variable is known as(一个被声明为一个可变类的变量可以引用该类的扩展类。这个变量被称为)
A . protected
B . derivable
C . cloneable
D . polymorphic
E . none of the above, a variable declared to be of one class can never reference any other type of class, even an extended class - 问题3分析和领悟:正确答案选D,我当时选择的是A。,当时还没学到多态,看到继承一章的关键词protected就果断下手了。其实多态表示变量可以有多种形式存在。在一般情况下,Java被强制定义为,一个变量,一旦声明为某种类型,就永远不能改变其为不同的类型。唯一的例外是多态变量可以是任何类型的派生类(尽管不是在同一时间,变量也可以从一种类型转换为另一种类型)。
- 问题4: Using the reserved word, super, one can(用保留字super,能够)
A . access a parent class'constructor(s)(访问父类构造函数)
B . access a parent class'methods and instance data(访问父类方法和实例数据)
C . access a child class'constructor(s)(访问子类构造函数)
D . access a child class'methods and instance data(访问子类方法和实例数据)
E . none of the above(没有正确选项) - 问题4分析和领悟:正确答案选择E。我当时选择A。本题关键点在于A 和B 答案都是对的,所以应该将两个答案结合起来才行,当时只看了一个答案草草完事,非常的不细心,以后要注意。
- 问题5: Why shouldn't an abstract method be declared final?(为什么不应该把一个抽象的方法声明为final呢?)
A . There's nothing wrong with doing so(这样做没毛病)
B . Abstract methods cannot be overridden and they must be if a concrete class ever is to be instantiated(抽象方法不能被覆盖,它们必须是要实例化的具体类)
C . So long as the Abstract method never actually is used in by any other method, there's no problem with doing this(只要抽象方法从来没有被任何其他方法使用过,那么做这个就没有问题了)
D . So long as the Abstract method is declared in a Class (not an Interface), there's nothing wrong with doing this(只要抽象方法在类中声明(而不是接口),那么做这件事就没有什么错)
E . None of the above(没有正确选项) - 问题5分析和领悟:正确答案B,我当时的选项E,
我也不知道我为什么要选E。要使抽象方法成为具体的方法,它必须被覆盖。声明一个方法是final的,就让其不可能被覆盖。因此不能。 - 问题6: Interface classes cannot be extended but classes that implement interfaces can be extended.(接口类不能被扩展,但是实现接口的类可以被扩展)
A . true
B . false - 问题6分析和领悟: 正确答案选B,当时我选的是A,属于对概念不清楚。任何类都可以被扩展,无论它是一个接口,还是实现一个接口,或者两者都没有。唯一的例外是,如果该类被显式地用“final”这个词进行修饰,在这种情况下,它不能被扩展。
这次的错题改正里面的翻译是自己查阅翻译的哟!!
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 20172301:生动详细,需要了解向上转型和向下转型的小伙伴们一定不要错过这篇好博,颜色缤纷,吸引眼球,先睹为快。
- 20172304:简明扼要,需要学习pp10.5编程项目的不要错过这篇博客,希望就是能稍微多一些内容,显得更加充实一点。
- 代码中值得学习的或问题:
- 代码中值得学习的地方很多很多。
- 小组成员段志轩大胆思考,敢于尝试新方法,自学知识去完成编程。郭恺同学在编程中心思缜密,错误率很低,用法准确。
现在的我属于急需进步阶段,编码中问题很多,不会的很多,学到的很多,记不住的也有点多,握在手心里的知识生怕一不小心丢了哈哈。
点评过的同学博客和代码
- 结对学习内容
- 结对编程中缀转后缀的讨论
- 教材习题的讨论
- 接口能否实现接口的讨论
其他(感悟、思考等,可选)
五一游玩带给我很多欢乐悠闲,同时也带给我很大心理压力。当再次拿起课本大脑空空,打开电脑蓝墨云红红的时候,突然就有一种无所适从的感觉,没有归属感大概如此。
---------------------------------
课程的学习进度从未停止,时间也容不得我慢慢来。我希望深吸一口气我能够重新开始打起精神认真对待,灵魂的疲惫让路程艰难,内心的坚定让自己继续前进。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 100/100 | 1/1 | 15/15 |
第二周 | 377/477 | 1/2 | 20/35 |
第三周 | 280/757 | 2/4 | 22/57 |
第四周 | 973/1730 | 1/5 | 35/92 |
第五周 | 1000/2730 | 1/6 | 40/132 |
第六周 | 729 /3459 | 1/7 | 40/172 |
第七周 | 660/4119 | 2/9 | 30/192 |
第八周 | 1417/5536 | 3/12 | 30/222 |