20172305 《程序设计与数据结构》第八周学习总结
Posted sanjinge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20172305 《程序设计与数据结构》第八周学习总结相关的知识,希望对你有一定的参考价值。
20172305 2017-2018-2 《程序设计与数据结构》第八周学习总结
教材学习内容总结
本周内容主要为书的10.1-10.6的内容:
第十章
1.后绑定(动态绑定)
2.继承与接口实现的多态性
3.排序(选择排序法和插入排序法)
4.搜索(线性搜索和二分搜索)
教材学习中的问题和解决过程
- 问题1:后绑定(动态绑定)
问题1解决方案: 没看到这里的时候,一直认为引用变量是什么类型的,就只能调用相关的方法。所以在每次写类的时候,都一直尽力于完善有关的方法。动态绑定的执行效率低于早期绑定,但是动态绑定所体现的灵活性是不能比的。
- 引用变量的类型和该引用变量指向的对象必须是兼容的,但不必完全相同,两者的关系可以是很灵活的。
- 问题2:多态性--面对对象的三大特征之一
问题2的解决方案:java实现运行时多态性的基础是动态方法的调度,它是一种在运行时而不是在编译期调用重载方法的机制。多态的存在,可以对原有代码的替换、可行的扩充,可以进行灵活多样的操作,极大的提高了使用效率,同时通过蓝墨云上视频内容的讲解,对于数据库内的类型进行修改或是替换到亮一个数据库里,我们总不能把所有数据进行调用,再进行添加吧,所以为了解决这种问题的发生,我们可以在两者之间进行一个多态的应用,就可以极大的缩短解决事件和解决中产生的问题。
- 多态性是指一个引用变量在不同时刻可以指向不同类型的对象。通过这种方式调用的方法在不同时刻将于不同方法实现代码的绑定。被绑定的方法代码取决于被引用的对象的类型。
- 问题3:排序(选择排序法和插入排序法)
问题3的解决方案:排序的问题是用多态性解决的问题之一。本书介绍了两种相对简答的排序方法,我在网上又查出了冒泡排序、希尔排序、快速排序、堆排序等不同类型的排序方式(足可见出数据结构原理有多强大,有多烧脑了)
- 相同点:相同的排序效果、同等的效率、类似的双层循环、都执行大约n*n次的操作
- 不同点:排序方法有所不同,选择排序法可以是两个数的替换所达到有一定的顺序,插入排序法是进行一个个类似顺时针的循环进行的排序。选择排序法所执行的交换操作的次数相对较少,选择法优于插入法。
- 问题4:搜索(线性搜索和二分搜索)
问题4的解决方案:线性搜索是以一个端点开始进行“逐一的”、“有顺序的”搜索。二分搜索的方式类似高中数学学过的“二分法”,不断的取中点,一半一半的进行筛选。相比线性搜索,二分搜索的效率更高,但二分搜索有一个弊病,就是数组中的元素必须是有一定的顺序的(升序或者降序)对于两种搜索方式的选择,数据的搜索量较大的优选二分搜索,搜索的效率不是重要问题的情况下,我们可以选择线性搜索。
- 被搜索的一组元素称为搜索池
- 对于二分搜索如果是偶数个的元素,我们在第一次选择的时候,通过代码
mid = (min + max) / 2
就可以看出,除不开的情况下会选择中间两个数较前一个,作为中间数,进行二分的
代码调试中的问题和解决过程
- 问题1:PP10.1
- 问题1解决方案:10.1的编写感觉很简单,从继承的转换为接口实现多态,不就是方式的转变。唉,实际操作的时候就突然发现无从下手,我试过在StaffMember里面进行是是实现接口,这样所有子类都可以使用该方法了,但是Staff的
pay()
始终是处于划红线,我又想过在各个子类里面分别实现接口,虽然pay()
没有被划红线,但是声明引用变量,并指向子类的时候,又开始划红线了。想了想是自己没有在StaffMember类里面没有实现接口,但是如果实现接口的话,这就不算是一种多态吧,两种很混乱的通过接口实现的多态性,算是自己在尝试道路上的荆棘吧,在StaffMemberen类实现接口就行,最后在产片代码中进行声明接口的引用变量,这样就可以在StaffMemberen内进行调用不同的对象,以及不同类型下的pay()
方法,实现接口内内的方法payday()
了。- 接口:
- 声明接口的引用变量:
- 接口:
- 问题2:PP10.4
问题2解决方案:对于此编程项目,着实费了不少功夫,递减的顺序在一开始就想到了把放在前面的内容放到后面就好了,但是想了想就改一个符号是不太可能吧,所以,自己就不断在下面改来改去的,但是始终达不到所要求的目的,通过问同学如何解决的,原来自己最原先的想法是正确的。感觉题目骗人,不带出这种重新编写的,仅仅修改一个符号就可以了。
- 问题3:PP10.5
- 问题3解决方案:在编写此项目的时候,想法很简单,有了Sorting类就可以把movies内的名字进行按顺序排列了,但是在我使用之后,就会提醒类型不兼容,才发现这两者之间需要搭建一个桥梁才能沟通,想想本质的原因,是自己没有想到模仿10.8--10.10三个代码之间的联系所导致的。只需要在CollectionDVD1里面搭建一个CampareTo的方法,实现接口Comparable,就行了。这个项目的编写费了一天半,通过同学的指导,才真正的顿悟此题。所以,还是自己的看书不够细致导致的。
- 问题不兼容:
- 实现的“桥梁”:
- 问题不兼容:
代码托管
上周考试错题总结
- 错题1:Inheritance through an extended (derived) class supports which of the following concepts?(继承通过扩展(派生)类来支持下列概念中的哪一个?)
- A.interfaces
- B.modulary
- C.information hiding
- D.code reuse(代码复用)
- E.correctness
- 错误解析:通过扩展一个类并继承它,新类不需要重新实现任何继承的方法或实例数据,从而节省了程序员的工作量。因此,代码重用是重用他人代码的能力,通过扩展它来满足您的需求。通过继承父类可以大大的缩减代码的重复,对于自己选择接口类的问题,表示自己当时很迷,不知道怎么回事就选择了接口。
- 错题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
- 错误解析:Java支持继承,但不支持多重继承,因此Java类可以有任意数量的子元素,但只有一个父类。此外,由于所有Java类都直接或间接地从对象类继承,所有Java类都只有一个父类。在做此题的时候,考虑了终极父类--Object类,因为它没有父类,所以选择则了E选项,但是,老师说可以把Object类看作自己是自己的父类的问题,我也表示很无奈。心疼这一分......
- 错题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
- 错误解析:术语多态意味着变量可以有多种形式。在一般情况下,Java被强烈定义为,一个变量,一旦被声明为一个类型,就永远不会改变为另一种类型。例外的是,多态变量可以是任何类型的派生类(尽管不是同时,变量可以从一种类型转换为另一种类型)。多态的问题,在看过第十章之后,明白了此题的答案,通过声明为父类的对象,就可以引用继承父类的子类的方法,这种灵活的操作就是通过继承实现的多态。
- 错题4:In order to determine the type that a polymorphic variable refers to, the decision is made(为了确定多态变量所指的类型,做出了决策。)
- A.by the programmer at the time the program is written
- B.by the compiler at compile time
- C.by the operating system when the program is loaded into memory
- D.by the Java run-time environment at run time(通过运行时的Java运行环境。)
- E.by the user at run time
- 错误解析:多态变量可以包含许多不同的类型,但是在程序执行之前,它不知道是哪一种类型。在引用变量时,必须做出决策。这个决策是由运行时环境根据变量的最新分配而做出的。这道题也是有关多态的问题,所以看过第十章之后,是动态绑定的问题,效率较早期绑定低,但是动态绑定,体现了多态的灵活性。
- 错题5: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
- 错误解析:保留字super提供了一种机制,用于访问父类的方法和实例数据(不管它们是否隐藏)。此外,可以使用super来访问父类的构造函数。正确答案是A和B的组合选项。
- 错题6:If you instantiate an Abstract class, the class or object you wind up with(如果您实例化一个抽象类、类或对象会得到)
- A.is also an Abstract class
- B.is a normal class
- C.is an Interface
- D.is a reference to an Object
- E.can‘t exist you cannot instantiate an Abstract class(不能存在不能实例化一个抽象类)
错误解析:您只能实例化具体的类而不是抽象类。但是您可以扩展抽象类和接口。
- 抽象类其实是可以实例化的,但是他的实例化方式不是通过new方式来创建对象,而是通过父类的引用来指向子类的实例来间接地实现父类的实例化(因为子类要实例化前,一定会先实例化他的父类。这样创建了继承抽象类的子类的对象,也就把其父类(抽象类)给实例化了).但是:接口是不能被实例化的(接口压根就没有构造函数)。
- 错题7:A derived class has access to all of the methods of the parent class, but only the protected or public instance data of the parent class.(派生类可以访问父类的所有方法,但只访问父类的受保护或公共实例数据。)
- A.true
- B.false
- 错误解析:由于方法也可以声明为私有的,因此派生类无法访问任何私有方法。因此,派生类只能访问父类的受保护和公共方法和实例数据。没有看到访问所有方法,所以通过后半句就直接认为对了。
- 错题8:If class AParentClass has a protected instance data x, and AChildClass is a derived class of AParentClass, then AChildClass can access x but can not redefine x to be a different type.(如果类AParentClass有一个受保护的实例数据x,而AChildClass是一个派生类的AParentClass,那么AChildClass可以访问x,但不能重新定义x为另一种类型。)
- A.true
- B.false
- 错误解析:派生类可以重新定义父类的任何实例数据或方法。父类的版本现在是隐藏的,但是可以通过使用super.x来访问。父类的任何实例数据和方法都可以在子类里进行重写或是定义为不同类型。
考试有关继承的问题,作为面对对象的三大特征之一,知识点很多,如何灵活的运用需要不断的在实践中学习,在考试之前,就感觉自己本章学的不是很好。26道题快错了三分之一,就和学习第五章和第六章的考试一样,因此更要下足功夫去学习,去不断反思自己的学习。争取在往后的学习过程中,能够缩短与那些优秀的学生的距离。
感悟
学习第十章的时候,通过老师给的书上例题代码,可以省去不少时间去理解多态性有关的知识点,但是,本周发布了一个感觉很好做的(实则并不是的)一个小组项目-四则运算的编写,但是细细思考了一下,突然发现,本周好忙啊~~关于多态性的问题还没有深入思考的同时还要编写项目的UML类图。好在还有一个五一小假可以忙里偷闲!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 136/136 | 1/1 | 15/15 | |
第二周 | 570/706 | 1/2 | 20/35 | |
第三周 | 613/1319 | 1/3 | 23/58 | |
第四周 | 1249/2568 | 1/5 | 30/88 | |
第五周 | 904/3472 | 1/6 | 30/118 | |
第六周 | 540/4012 | 1/7 | 30/118 | |
第七周 | 826/4838 | 1/7 | 30/178 | |
第八周 | 925/5763 | 2/9 | 45/223 |
参考资料
以上是关于20172305 《程序设计与数据结构》第八周学习总结的主要内容,如果未能解决你的问题,请参考以下文章