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

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

教材学习内容总结

后绑定:

  • 多态引用是可以在不同时间指向不同类型对象的引用变量。
  • 程序执行的某时刻产生一个请求,要求执行某段代码来完成一个方法调用,这称为一个方法调用与ー个方法定义的绑定。
    对于多态性引用,这种绑定要延迟到程序运行时才能执行、并且要绑定的方法定义取决于当时引用变量所引用的对象。这一被延迟的请求事件称为后绑定或动态绑定。

实现多态性:

可以用两种方式建立多态引用:继承和接口。
利用继承实现多态性:
  • 一个引用变量可以指向有继承关系的任何类的任何对象。
  • 任何类都是Object类的后代类,它的引用可以指向任何对象。
  • 实际将调用的方法版本取决于对象的类型而不是引用变量的类型。(考试里有碰到哦)
  • 父类可以用作方法参数的类型

    利用接口实现多态性
  • 接口名可以用于声明对象引用变量
  • 一个接口引用变量可以指向实现接口的任何类的任何对象。
  • 实现类与其实现接口的关系,就如同子类与父类的关系。一种“是”关系,这种关系奠定了多态的基础。
  • 当使用接接口引用变量时,只能调用定义在接口中的方法、即使接口引用変量所指向的对像还有其他一些可用方法,也不能调用。
  • 接口名也可以用作方法参数的类型。

排序

  • 选择法排序: 在一个列表中,从第一个数开始,从左向右进行扫描,遇到最小的,将其与第一个数字进行对调,
    再从下一个个数字开始,继续重复上面的操作,不断地找出最小的,直到最后一个数完成排序,形成有顺序的排列。
  • 插入排序法:不断地将一个新元素插入到已排好序的数列子集中。在每一轮排序中,将一个未
    排序的新元素插到已排序子集中的适当位置,直到整个数列有序排列为止。从只含有一个元素的“已排序”数列开始,对数列的前两个值排序
    如果必要则交换这两个值的位置,再将第三个值插入到相对于前两个值(已排序的值)的适当位置。每当完成一次插入操
    作,已排序子集中的值的个数增1不断重复这一过程,直到所有的值都插到自己的适当位置,数组中其他值会移动位置以空出位置空间插入位置元素,
    这时就完成了整个数列的排序。

搜索

  • 线性搜索:从一个端点,以线性方式描整整个搜索池,因此称为线性搜索。
  • 二分搜索:如果一个数组中的元素是有序的(升序或降序),则二分搜索比线性搜索算法的效率高得多。
    二分搜索利用搜索池是有序的这一事实,减少了大量的比较操作。

多态设计

  • 多态性允许用一致性的方法实现不一致的行为。
  • 应该训练自己的软件设计敏感性,善于识别能利用多态性解法的潜在问题。

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

  • 问题1:继承是如何支持多态性的呢?
  • 问题1解决方案:观察课本的例题发现,多态其实就是以不同的方式,但又有着一样的行为或是说目的来完成一个指定目标的过程。
    然后,在Java中,用父类声明的一个引用变量可以指向一个子类对象。如果两个类具有两个相同签名的方法,则这个父类引用就具有多
    态性(因为同样的方法名会有不同的版本)。
    就像课本的例题Exployee类中有一个pay()方法,继承他的子类也都有pay()方法,这样在staff类中实例化对象时就出现了多态性。

  • 问题2:课本上有提到一句“如果在Volunteer类中不重载pay()方法,则应将StaffMember设计成不能实例化的抽象类。”
    那么重载、重写和多态性有什么关系?
  • 问题2解决方案:当一个子类重载了其父类方法的定义时,实际上该方法的两个版本都存在。重写提供了多态性,因为适当的方法是根据当前被引用的对象而调用的,如果用一个多态性引用调用该方法,那么被调用方法的版本由执行方法调用的对象的类型。
    比如有一只鸟A和小鸟B,A教会了B吃饭和飞翔。
    对于飞翔,A是这样理解的,无非就是振动翅膀,而B有更深刻的理解,振动翅膀和利用好风。这样就是一个重载。B给飞翔增加了一个参数
    对于吃上,A喜欢吃虫子,B喜欢吃草,这就是重写。B重写了吃饭这个方法。
    而A和B正是多态的一个很好例子。

给大家两个参考:

重载与重写的区别
重写、覆盖、重载、多态几个概念的区别分析

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

  • 问题1:在完成PP10.1的课后练习时,我没有修改staff类直接就创建了一个接口,然后就是

  • 问题1解决方案:那接口实现多态性该怎么实现呢?
    之前是想将所有有关的含有payday方法的所有类实现接口,以达到目的,但是最后在Firm中实例化的对象只是Staff类,那我就直接改写了staff,

发现这样就可以实现多态性。(主要是课本上没有例子,所以理解的不是很清晰)

代码托管

上周考试错题总结

  • 错题1及原因,理解情况

多态性是由什么来实现的?
解析:这个题目其实上面我也有一些总结。重载只是为具有不同参数列表的方法提供了备选方案。
重写提供了多态性,因为适当的方法是根据当前被引用的对象而调用的。嵌入是类中包含的类。抽象与多态没有
任何关系。封装是使用可见性修饰符(公共的、私有的、受保护的)实现的。

  • 错题2及原因,理解情况

    Upcasting是完全安全的,它是Java支持的单一继承结构的产物。相比之下,向下转换必须由程序员显式地完成。
    Java只在一个方向上自动转换。在使用的可见性修饰符方面,Upcasting和downcasting的规则并不依赖于任何方式。

那么upcast到底是什么意思呢?

一)向上转型
(1)定义: 把对某个对象的引用视为对其基类引用的做法被称为“向上转型”。
这主要是由于子类的对象可以看成是基类的对象这原因而得来的,也就是具有is-a关系。
比如:
Useful useful = new MoreUseful();//右边是一个子类的对象,而左边是一个父类类型
//的变量,指向右边的子类对象。
(2)基类可以接收发给导出类的任何消息,因为二者有完全相同的接口,我们只需要
从导出类向上转型,永远不需要知道正在处理的对象的确切类型,这也就是多态性决
定的。利用多态性,具有同样方法名和方法特征的方法根据调用方法的对象的类型,
可以产生不同的动作,这极大地增加了程序员的表达能力。

这是一篇参考资料
java中向上转型(upcast)和向下转型(downcast)

  • 错题3及原因,理解情况

虽然继承和接口支持多态,但只有在有后期绑定时才会这样做。但是,重载是多态性一(方法)名的一种形式,多个主体,
只要程序使用重载,多态就在使用中。

  • 错题4及原因,理解情况

  • 解析:
    之前是因为认为println()方法能够处理如此广泛的对象,并正确地打印它们,这是println()方法的重载,而重载不是多
    态性的体现。其实这题会错和上一题原因是一样的。虽然继承和接口支持多态,但只有在有后期绑定时才会这样做。但是,
    重载是多态性一(方法)名的一种形式,多个主体,只要程序使用重载,多态就在使用中

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):
    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)
    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)
    • 一周提交次数少于20次的不加分
  6. 其他加分:
    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:
    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评:

  • 博客中值得学习的或问题:

  • 代码中值得学习的或问题:

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172310
    • 结对学习内容
      • 教材第十章
      • 四则运算的学习
      • 讨论栈的用法和进行编程
  • 上周博客互评情况

其他(感悟、思考等,可选)

实话觉得这周的任务量有点大,而且恰逢五一假期,之前就已经安排好了出游的计划,所以得知这周有两篇博客时,心情是有些
烦躁的。一遇到问题,就有点急,在老师上第十章的课程时,我的自主学习都没有完成。好在后来我和队友都加紧了节奏,完成
了我们的任务。学习Java需要时间,我要更好地来安排我的时间,高效的学习。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 127/127 1/1 25/25
第二周 278/405 1/2 20/45
第三周 442/847 1/3 20/65
第四周 1063/1910 2/5 30/95
第五周 840/2750 1/6 27/122
第六周 631/3381 1/7 20/142
第七周 914/4295 1/8 20/162
第八周 2534/6829 2/10 30/192

参考资料

猜你喜欢

转载自www.cnblogs.com/Qiuxia2017/p/8940407.html