学号 2017-2018-2 《程序设计与数据结构》第八周学习总结
教材学习内容总结
- 后绑定: |
- 由继承实现多态性: |
- 利用接口实现多态性: |
- 排序: |
- 搜索: |
public class LSearch { public static int[] Data = { 12, 76, 29, 22, 15, 62, 29, 58, 35, 67, 58, 33, 28, 89, 90, 28, 64, 48, 20, 77 }; // 输入数据数组 public static int Counter = 1; // 查找次数计数变量 public static void main(String args[]) { int KeyValue = 22; // 调用线性查找 if (Linear_Search((int) KeyValue)) { // 输出查找次数 System.out.println(""); System.out.println("Search Time = " + (int) Counter); } else { // 输出没有找到数据 System.out.println(""); System.out.println("No Found!!"); } } // --------------------------------------------------- // 顺序查找 // --------------------------------------------------- public static boolean Linear_Search(int Key) { int i; // 数据索引计数变量 for (i = 0; i < 20; i++) { // 输出数据 System.out.print("[" + (int) Data[i] + "]"); // 查找到数据时 if ((int) Key == (int) Data[i]) return true; // 传回true Counter++; // 计数器递增 } return false; // 传回false } }运行结果:
[12][76][29][22] Search Time = 4
3.二分搜索:前提是数列必须是已经排序好的,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。下面是其代码(以升序的数列为例): public class BSearch { public static int Max = 20; public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58, 63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 数据数组 public static int Counter = 1; // 计数器 public static void main(String args[]) { int KeyValue = 22; // 调用折半查找 if (BinarySearch((int) KeyValue)) { // 输出查找次数 System.out.println(""); System.out.println("Search Time = " + (int) Counter); } else { // 输出没有找到数据 System.out.println(""); System.out.println("No Found!!"); } } // --------------------------------------------------- // 折半查找法 // --------------------------------------------------- public static boolean BinarySearch(int KeyValue) { int Left; // 左边界变量 int Right; // 右边界变量 int Middle; // 中位数变量 Left = 0; Right = Max - 1; while (Left <= Right) { Middle = (Left + Right) / 2; if (KeyValue < Data[Middle]) // 欲查找值较小 Right = Middle - 1; // 查找前半段 // 欲查找值较大 else if (KeyValue > Data[Middle]) Left = Middle + 1; // 查找后半段 // 查找到数据 else if (KeyValue == Data[Middle]) { System.out.println("Data[" + Middle + "] = " + Data[Middle]); return true; } Counter++; } return false; } }运行结果:
Data[3] = 22 Search Time = 5
教材学习中的问题和解决过程
- 问题1:引用变量和对象的含义
- 问题1解决方案:
Java对象及其引用关于对象与引用之间的一些基本概念。 初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用混为一谈。可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。 为便于说明,我们先定义一个简单的类: class Vehicle { int passengers; int fuelcap; int mpg; }有了这个模板,就可以用它来创建对象: Vehicle veh1 = new Vehicle();通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。1)右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。3)左边的“Vehicle veh 1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。我们可以把这条语句拆成两部分:Vehicle veh1;veh1 = new Vehicle();效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。 在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此, 我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“Vehicle”。不对,“Vehicle”是类(对象的创建模板)的名字。 一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“Vehicle”。 对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。 为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳, 可以用来系汽球。 如果只执行了第一条语句,还没执行第二条,此时创建的引用变量veh1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。 它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在veh1这根绳上。我们抓住这根绳,就等于抓住了那只汽球。 再来一句: Vehicle veh2;就又做了一根绳,还没系上汽球。如果再加一句: veh2 = veh1;系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,veh2也指向了veh1所指向的对象。两根绳系的是同一只汽球。 如果用下句再创建一个对象:veh2 = new Vehicle();则引用变量veh2改指向第二个对象。 从以上叙述再推演下去,我们可以获得以下结论:(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。 如果再来下面语句: veh1 = veh2;按上面的推断,veh1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。 由此看来,下面的语句应该不合法吧?至少是没用的吧?new Vehicle();不对。它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来系住它。最常见的就是打印字符串: System.out.println(“I am Java!”);字符串对象“I am Java!”在打印后即被丢弃。有人把这种对象称之为临时对象。 对象与引用的关系将持续到对象回收Java在运行时才处理别名引用
代码调试中的问题和解决过程
- 本周作业过程中,没有多少大问题,都是一些小毛病,所以没有写这个
上周考试错题总结
- 问题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 an example of multiple inheritance? A . A computer can be a mainframe or a PC B . A PC can be a desktop or a laptop C . A laptop is both a PC and a portable device D . A portable device is a lightweight device E . Macintosh and IBM PC are both types of PCs
- 解析:多继承意味着一个新的派生类继承了不止一个父类。在上面列出的那些电脑中,一台笔记本电脑从个人电脑和便携设备上继承了一些属性,因此这属于多继承。A、B和E的答案都是单继承的例子,其中一个类至少有两个子类(在A中,计算机有主机和PC机;在B中,PC机有桌面和笔记本电脑,在E,PC机有Macintosh机和IBM 个人计算机),D表示一个类的一个属性。当时误选D项,以为成其他都是属于多继承。
- 问题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
- 解析:一个被声明为一个类的对象可以引用该类的子类,这种方法是被称作为多态,这是在第十章中的内容,一个父类的对象是可以指向任何一个子类的一个对象,这种就是由多态所引起的。
- 问题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 E . by the user at run time
- 解析:这道题目是在问是在什么阶段确定多态变量所引用的类型,对于多数情况下的这种请求,这种绑定是发生在编译阶段,但是对于多态性引用,这种绑定要延迟到程序运行才能执行,并且要绑定的方法取决于当时引用变量所引用的对象,这种被延迟的请求事件被称为后绑定或动态绑定。
点评过的同学博客和代码
- 本周结对学习情况
- 结对学习内容
- 教材第10章
- 阅读10.1-10.6章节
- 完成课后自测题,并参考答案学习
- 完成课后练习题
- 完成程序设计项目:至少完成PP10.1、PP10.4、PP10.5.
其他(感悟、思考等,可选)
这一周状态不好,可能放假打乱了节奏,而且多了一个四则运算需要看,所以没认真看书,所以做的不太好,下周我会调整的。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 95/95 | 1/1 | 18/18 | |
第二周 | 515/620 | 1/2 | 22/40 | |
第三周 | 290/910 | 1/3 | 20/60 | |
第四周 | 1741/2651 | 1/4 | 30/84 | |
第五周 | 579/3230 | 1/5 | 20/104 | |
第六周 | 599/3829 | 2/8 | 18/122 | |
第七周 | 732/4561 | 2/9 | 24/146 | |
第八周 | 1354/5915 | 2/11 | 30/176 |
参考:,
计划学习时间:30小时
实际学习时间:30小时
改进情况:无
(有空多看看)