20172314 2017-2018-2 《程序设计与数据结构》第八周学习总结

教材学习内容总结

  • 后绑定:
    • 一个方法调用与一个方法定义的绑定要延迟到程序运行时才能执行,由于需要在程序执行期间决定所要绑定的方法定义,此方法的效率低于编译阶段的绑定效率。
  • 继承实现多态性:
    • 一个引用变量可以指向有继承关系的父类或子类的对象。
    • 实际调用引用变量指向的对象的方法版本。
  • 接口实现多态性:
    • 接口名也可以做声明对象引用变量的类型。
    • 接口引用变量可以指向实现该接口的任何类的任何对象。如一个接口Speaker,Speaker current声明了一个对象引用变量current,则current可以指向任何实现Speaker接口的任何对象,如current = new Philosopher
    • 使用接口引用变量时,只能调用定义在接口中的方法,其他的不可调用,如果已知这样的方法调用是有意义的,则需要进行对象类型转换,如((Philosopher)current).pontificate
    • 接口名也可以用作方法参数的类型,使得任意一个实现该接口的对象都可以作为方法的参数,并且方法可接受不同类型的参数。
  • 排序
    • 选择法排序:扫描整个数列找到最小值并与数列中第一个位置的值交换,如此循环,直到数列有序排列。

    • 插入法排序:从左往右第一次排序从第二个数开始,与之前的数比较,在之前的数中合适的位置插入不断重复。

    • 选择排序法和插入排序法实质上有同等的效率,两种算法都执行大约n*2次操作(n)为数列中值的个数。虽然两种算法执行的比较操作次数相同,但选择排序法所执行的交换操作的次数更少,因此选择法优于插入法。

  • 搜索
    • 线性搜索:从一个端点开始,以线性方式扫描整个搜索池。
    • 二分搜索:与数组的中间数比较,然后每次减少一半的数,如果一共有偶数个元素,即中位数有两个,分别比较然后选择。
    • 元素以数组形式储存时,线性搜索是相对简单的算法;如果一个数组中的元素是有序的(升序或降序),则二分搜索比线性搜索效率高。

教材学习中的问题和解决过程

  • 问题一:多态中成员函数和引用型变量的实现如何确定
  • 问题一解决:对于成员函数在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,否则失败。在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是编译看左边,运行看右边。对于成员变量,编译和运行都参考引用型变量所属的类。
  • 问题二:重写和多态性有什么关系
  • 问题二解决:子类重载父类的定义时,实际上该方法的两个版本都存在,如果一个多态性引用调用该方法,那么被调用方法的版本由执行方法调用的对象的类型决定,而不是引用变量的类型决定。
  • 问题三:书上课后题SR10.11中e项为什么first不可以调用pontificate方法
  • 问题三解决:
    Speaker first = new Dog();
    Philosopher second = new Philosopher();
    first = second;
    second.pontificate();
    first.pontificate();
    
    first为Speaker的对象,second为Philosopher的对象,first=second表示把Philosopher对象赋给Speaker对象,由于其实现接口,所以是合法的,但改变不了first的类型,他依然不可调用Pontificate方法。
  • 问题四:书上课后题SR10.14的5718243用插入排序法的排序过程
  • 问题四解决:我认为应该是第一次排序从第一个数开始,排完后为5718243,第二次5与7 比较之后还是不变,但在上课时,老师说明了排序法第一次排序是从第二个数开始与第一个数比较的。所以第一次排序完就是5718243,第二次排序完为1578243
  • 问题五:书上例10.10中(Contact)other为什么要加括号Contact
    public boolean equals(Object other)
    {
    	return (lastName.equals(((Contact)other).getLastName()) &&
    			firstName.equals(((Contact)other).getFirstName()));
    }
    
  • 问题五解决:other是object类的,object类是所有类的父类,在other前加Contact是为了进行类型转换,将other转换为Contact的变量,这样他就能调用getFirstName和getLastName方法。
  • 问题六:最初看不懂例10.9的选择排序法的代码。
    public static void selectionSort(Comparable[] list)
    {
    	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;
    
    		// Swap the values
    		temp = list[min];
    		list[min] = list[index];
    		list[index] = temp;
    	}
    }
    
  • 问题六解决:temp变量是用来记住最小值的,index是索引值,min是最小值的下标,外层for循环是扫描所有的数,内层for循环是用来判断是否是最小,scan是后一个数的索引值,开始索引值为0的为最小值,内层循环中将他与后面的数比较,较小的数的索引值赋给min然后交换两个值的位置,temp = list[min];将最小数赋给temp,list[min] = list[index];再将较大的值放到后一位,list[index] = temp;将最小值放到前一位。

代码调试中的问题和解决过程

  • 问题一:在做PP10.5时,引用方法和变量时总是显示红色波浪线错误。

  • 问题一解决:这个PP我是原有基础不做删减,又添加了一部分来实现功能。添加了一个DVDSorting类用选择排序法来实现排序的功能,又在DVDCollection类中添加方法来比较名字以确定顺序,但在DVDCollection中无法使用title,在助教的帮助下在实现接口时添加就可以了。但这样做的原因我不理解,在网上找到了相似的问题java 接口继承了Comparable是什么意思?

    一、Comparable字面的意思是:可比较的。后面<类型>
    举个例子吧,后很多个对象比如person人这个类型,我们把很多个人的对象放到Collection集合中,现在又两个集合,一个是person的集合,一个是superman的集合,变量名为p1和p2,那我们怎么知道p1里放的是person的集合还是superman的集合呢,所以这里就要用到泛型<>。这样可以避免编写时发生的错误,明明p1里是person你非要把superman放进去这里就会报错了。
    二、它们可以约束类的行为,例如一个类如果实现Comparable接口,就必须实现CompareTo()方法。.也就是说lltem继承啦Comparable这个父类的方法

  • 问题二:PP10.1的完成

  • 问题二解决:开始无从下手,以为要重新编写有关pay的方法,因为既有pay方法,又有payday方法,后来又仔细看了一遍书上的这几个类,发现在Staff类和Firm类中都有payday方法,可以扫描整个员工列表,多态性的调用pay方法,确定每位员工的薪水。所以只要在Payable接口中定义payday方法,在Firm类及Staff类实现该接口即可。

  • 问题三:IDEA有问题,一些正确的代码会突然出错。

  • 问题三解决:在IDEA上编写好代码,把UTF-8换成GBK后运行成功,在编写其他题目之后运行,则IDEA上原有的就会全部出错,每次打开IDEA运行时就得把他们重新一个一个换为GBK,有时候就通篇的红色波浪线令人窒息由于上上周的汉化包出问题之后再也不正常了。想要用虚拟机运行一下试试,又总是显示错误如图,或者显示是不安全的操作,但它曾经是正确的没毛病就这样push了我能想到的解决方法就是把IDEA卸了重新下一遍。


代码托管

上周考试错题总结

  • 错题一:

  • 错题一解决:如果一个程序员写了一个类,希望它被另一个程序员扩展,那么这个程序员就必须改变私有方法和实例数据以保护。我当时想的是如果这个类用了final限制继承,那么选项的方法都没用,所以选的D,当时知道D也不对,就随便就选了,但好像不用考虑这种情况,根据一般情况来选就行。

  • 错题二:

  • 错题二解析:这道题选的是一个类有0或1个父类,但正确答案是只有一个父类,原因是Object类是自己的父类。所以所有类都有父类。

  • 错题三:

  • 错题三解析:多态的术语表示变量可以有多种形式。在一般情况下,Java被强制定义为一个变量,一旦声明为类型,就永远不能改变为不同的类型。唯一的例外是多态变量可以是任何类型的派生类(尽管不是在同一时间,变量可以从一种类型转换为另一种类型)。

  • 错题四:

  • 错题四解析:超保留的单词可以访问父类的方法和实例数据(不管它们是否被隐藏)。还可以使用super来访问父类的构造方法。所以正确的答案是A和B。

  • 错题五:

  • 错题五解析:这道题不知道选什么,看了解析后知道为了使抽象方法成为具体的方法,它必须被覆盖。声明一个方法是final的,这使得它不可能被覆盖。

  • 错题六:

  • 错题六解析:派生类可以修改父类的任何实例数据或方法,如果是被隐藏的,就用super,我当时想的是private类型的就不能被修改,属于看题不仔细吧,题目有说明是protected。

  • 错题七:

  • 错题七解析:看了解析:接口拥有普通类所做的所有继承属性。因此,您可以创建一个接口继承层次结构,就像您可以创建类继承层次结构一样。但是,您不能做的是实例化一个必须实现的接口。我感觉就是类和接口都可以被继承,但不一定能被实例化。

结对及互评

点评:

  • 博客中值得学习的或问题:
    * 王禹涵的博客相较上周的有很大进步,详细了很多,内容也很丰富,希望继续加油
    * 谭鑫的博客对于问题的描述很细致,解决问题的过程也有记录,很好。

  • 基于评分标准,我给谭鑫的博客打分:12分。得分情况如下:

    • 感想,体会不假大空的加1分
    • 进度条中记录学习时间与改进情况的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 结对学习情况真实可信的加1分
    • 问题加分7分
  • 基于评分标准,我给王禹涵的博客打分:10分。得分情况如下:
    • 排版精美的加一分
    • 有动手写新代码的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 结对学习情况真实可信的加1分
    • 问题加分5分

点评过的同学博客和代码

  • 本周结对学习情况
  • 结对学习内容
    • 教材第10章
    • 阅读10.1-10.6章节
    • 完成课后自测题,并参考答案学习
    • 完成课后练习题
    • 完成程序设计项目:至少完成PP10.1、PP10.4、PP10.5.

其他

这周在课内的学习时间不多,简单看了看,作业PP也不多,大部分时间在做有关四则运算的,没有什么特别的问题。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 93/93 1/1 20/20
第二周 305/398 1/2 20/38
第三周 328/651 2/4 25/60
第四周 1013/1689 1/5 30/90
第五周 795/2407 1/6 30/120
第六周 1117/2921 1/7 30/150
第七周 703/3511 1/8 40/190
第八周 1139/4701 2/10 40/230

参考:

posted @ 2018-05-02 19:47  FYiW  阅读(288)  评论(8编辑  收藏  举报