版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第一单元对象间的操作学习指导书一:学习目标知识点知识点重要性掌握程度知识点关联对象间关系极高熟练本知识点是理解本主题后续对象操作和复制的关键,尤其是对象间消息的传递的原理的把握,对后续内容学习起着铺垫作用通用对象操作1、对象的等值性2、对象的散列码高掌握在该部分比较难的部分是通用对象的散列码,需要对System.Object提供了一个GetHashCode虚方法,在学习之前需要对该方法比较熟悉。深复制与浅复制1、浅复制与深复制基本概念2、浅复制与深复制实现机制中高了解该知识点和后续的知识点联系不是非常紧密,关键是理解复制原理。而对其中细节上的东西应用不是很广泛。二:重难点知识点重难点1:对象间
2、的关系学习方法: 对象与对象之间的关系有以下几种关系 1)继承 1) 一种父子关系 2) 有共同特点 , 或者有普通和特殊关系 举例: 如: 一种进化关系, 如: 有机物 -> 蛋白质 -> 微生物 -> 动物 -&g
3、t; 人 2) 依赖 1) 就是一个对象调用被依赖对象中的某些方法而得以完成这个对象的一些职责 2) 这是一种比较松散的关系 , 并且这是短期的. 我们的过程与对象往往依赖于我们的实体域对象 举例: WebWork中的Action 依赖于
4、 业务层中的方法 , 业务层中的Service或者Bussiness依赖于持久层(DAO)中的方法等等 ( 如果碰到这种关系 , 通常用面向接口编程的方法来处理, 使其具有更好的扩展性, 维护性) 3) 关联 1) 指一个类指到另一个类中的属性. 2) 而且是长期的
5、; 3) 关联关系又可以分为以下几种 0) 一般关联: 只要一个对象联系到另外一个对象就形成了关联关系 1) 聚合关系 , 较强于一般关联 , 有整体与局部之间的关系,并且没
6、有了整体,局部也可单独存在,举例:小组与小组里面的成员, 小组不存在, 成员也可单独存在 , 也可加入其它小组, 又如: 一个分子由多个原子按一定的结构,排列组织而成, 在化学变化时(针对原子的操作),按这个角度去看 , 原子之间会脱离开,另外合成另一种物质. 其组成关系可以共享 2) 组合关系 , 也叫合成关系 , 是一种更强的整合与局部的关系 , 其关系更加紧密 。举例:一个分子由
7、多个原子按一定的结构组织而成, 在物理变化中(针对分子的操作), 按这个角度去看 , 分子间发生变化 , 变成另一种状态, 但分子结构不变, 还是这种物质. 其组成关系多原子组成结构不可以共享.共性问题:聚合,关联,组合 是对象之间的三种关系的区别与联系:聚合,关联,组合 是对象之间的三种关系。从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。其关系强弱为 关联<聚合<组合关联:在程序中相当于把已经实例化的对象A做为另一对象B方法的参数传递引用。组合:即为内部类聚合:其做法介于两者之间。不过我更觉得聚合相当于一个在外部已经申明的A,然后把A放在B中做为一个
8、变量使用。 辅导视频:无 作业内容:无补充阅读:无重难点2:对象的等值性学习方法:1、 通过值类型的对象到引用类型的对象逐渐理解对象的等值性:我们经常要去判断两个对象是否相等,在不同的情况下,相等的意义不一样。比如,int i=0; int j=0;我们会说他们相等,意思是值相等。再来考虑下面几行代码。1 class RefObject2 3 public int value;4 5 6 RefObject ro1 = new&
9、#160;RefObject();7 RefObject ro2 = new RefObject();8 RefObject ro3 = ro1;ro1和ro2虽然内部的值相等,value均为默认初始值0,但他们不是同一个对象,他们处于托管堆中不同的地址。ro3和ro1是同一个对象,指向托管堆中同一块内存。System.Object提供了一个虚拟的方法Equals,用来判断两个对象是否相等。由于所有的类型都继承自System.Object,这就确保我们可以对所有的对象进行判等的操作。我们可以实现自己的Eq
10、uals方法。但是它必须满足一定的条件。第一:自反性。x.Equals(x)必须为true。第二:可逆。x.Equals(y) =>y.Equals(x)。第三:传递。x.Equals(y) AND y.Equals(z) => x.Equals(z)。第四:前后一致。 一开始x.Equals(y) = true,如果两个对象的值没有发生变化,以后x.Equals(y) = true。在重写Equals方法时,分为两种情况考虑。第一:它的基类没有重写Object的方法。下面的代码展示怎样为它实现Equals方法。1 public SubType 2
11、160; 3 RefType m_refType;/一个引用类型 4 ValueType m_valueType;/一个值类型 5 public override bool Equals(Object obj) 6 7 &
12、#160; if(obj = null)return false;/因为this不为null,所以如果obj为null两个对象不可能相等 8 if(this.GetType()!=obj.GetType()return false;/类型不同不可能相等 9 SubTyp
13、e other = (SubType)obj;/类型在这里一定相等 if(!Object.Equals(m_refType,other.m_refType )return false;/比较其中的引用类型字段 10 if(!m_valueType.Equals(other .m_valueType)return false;/比
14、较其中的值类型字段 11 return true; /到这里最终相等12 13 一般对于引用类型,我们调用Object.Equals这个静态方法,这样即使出现其中之一为null的情况也能正确处理。而对于值类型,则不应该调用他,一方面,值类型不可能为null,另一方面调用他会导致装箱.总结对象的等值性特点和适用的场合该技能点主要是从概念上去理解等值性的原理,多出现面试题中。在实际的大型项目中应
15、用不是非常广泛。为后续学习对象的散列码提供依据,也就是如果我们定义了一个类型并重写了Equals方法,那么我们也应该重写GetHashCode方法,因为System.Collections.Hashtable类型的实现要求任何两个相等的对象都必须有相同的散列码值,所以我们需要确保用来判等的算法和用来计算对象散列码的算法一致共性问题:无辅导视频:无 作业内容:参见附件补充阅读: 请参见附件重难点3:深复制与浅复制学习方法:从现实的简单例子入手。1. 举个例子,一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿
16、都不会影响另外一个人。再比如:浅复制就是创建快捷方式,深复制就是复制粘贴,深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。 考虑以下写法 int source = int.MaxValue;/(1)初始化源对象为整数的最大值2,147,483,647
17、0; int dest = source;/(2)赋值,内部执行深拷贝 dest = 1024;/(3)对拷贝对象进行赋值 source = 2048;/(4)对源对象进行赋值 首先(2)中将source赋给dest,执行了深拷贝动作,其时dest和so
18、urce的值是一样的,都是int.MaxValue;(3)对dest进行修改,dest值变为1024,由于是深拷贝,因此不会运行source,source仍然是int.MaxValue;(4)对source进行了修改,同样道理,dest仍然是1024,同时int.MaxValue的值也不变,仍然是2,147,483,647;只有source变成了2048。 再考虑以下写法 struct Point
19、0; public int X; public int Y; public Point(int x, int y)
20、160; X = x; Y = y;
21、; Point source = new Point(10, 20); Point dest = source; dest.X = 20 当dest.X属性变成20后,source的X属性
22、仍然是102. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。比较典型的就有Reference(引用)对象,如Class(类)。考虑以下写法 class Point
23、 public int X; public int Y; public Point(int x, int y)
24、; X = x; Y = y; &
25、#160; Point source = new Point(10, 20); Point dest = source; dest.X = 20;由于Point现在是引用对象,因此Point dest=source的赋值动作实际上执行的是浅拷贝,最后的结果应该是source的X字段值也变成了20。即它们引用了同一个对象,仅仅是变量明source和dest不同而已。3.
26、 引用对象的浅拷贝原理引用对象之间的赋值之所以执行的是浅拷贝动作,与引用对象的特性有关,一个引用对象一般来说由两个部分组成(1)一个具名的Handle,也就是我们所说的声明(如变量)(2)一个内部(不具名)的对象,也就是具名Handle的内部对象。它在Manged Heap(托管堆)中分配,一般由新增引用对象的New方法是进行创建 如果这个内部对象已被创建,那么具名的Handle就指向这个内部对象在Manged Heap中的地址,否则就是null(从某个方面来讲,如果这个具名的handle可以被赋值为null,说
27、明这是一个引用对象,当然不是绝对)。两个引用对象如果进行赋值,它们仅仅是复制这个内部对象的地址,内部对象仍然是同一个,因此,源对象或拷贝对象的修改都会影响对方。这也就是浅拷贝4.引用对象如何进行深拷贝由于引用对象的赋值仅仅是复制具名Handle(变量)指向的地址,因此要对引用对象进行深拷贝就要重新创建一份该对象的实例,并对该对象的字段进行逐一赋值,如以下写法 class Point
28、; public int X; public int Y; public Point(int x, int y)
29、60; X = x; Y = y;
30、 Point source = new Point(10, 20); Point dest = new Point(source.X, source.Y); /或以下写法 /Point dest = new Point()
31、160; /dest.X = source.X /dest.Y = source.Y 其时,source和dest就是两个互相独立的对象了,两者的修改都不会影响对方 共性问题:对于String字符串对象和Array对象的复制理解不清答:(1):String字符串对象是引用对象,但是很特殊,它表现的如值对象一样,即对它进行赋值,分割,合并,并不是对原有的字符串进行操作,而是返回一个新的字符串对象 &
32、#160; (2):Array数组对象是引用对象,在进行赋值的时候,实际上返回的是源对象的另一份引用而已;因此如果要对数组对象进行真正的复制(深拷贝),那么需要新建一份数组对象,然后将源数组的值逐一拷贝到目的对象中辅导视频:无 作业内容:作业:比较了一下浅拷贝和深拷贝的性能测试,以理解深拷贝和浅拷贝的差异。回答:先在DemoClass加入一个函数:public object CloneNew() return new DemoClass(); 接着我们写示例代码比较:public static void Compare() &
33、#160; DemoClass baseClass = new DemoClass(); DateTime start = DateTime.Now;
34、; for (int i = 0; i < 1000000; i+) DemoClass newClass = (DemoClass)baseClass.Clone();
35、0; TimeSpan ts = DateTime.Now - start; System.Console.WriteLine("浅拷贝:" + ts.Ticks);
36、; DateTime start2 = DateTime.Now; for (int j = 0; j < 1000000; j+) DemoClass newClass = (DemoClass)baseClass.CloneNew(); &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论