《面向对象编程基础0000》由会员分享,可在线阅读,更多相关《面向对象编程基础0000(27页珍藏版)》请在金锄头文库上搜索。
1、1 1 面向对象的编程基础面向对象的编程基础 4.1 4.1 类类4.2 4.2 结构结构4.3 4.3 方法方法4.4 4.4 属性与索引器属性与索引器吱寥屎完宅纤颤痰升恃甘罗壳圾榨诞害骨颁逻碌酝炙亲因酮绣把乳备阻阳面向对象编程基础0000面向对象编程基础00002 24.1 4.1 类类类与对象类与对象类:一组具有相同数据结构和相同操作的对象的集合。类:一组具有相同数据结构和相同操作的对象的集合。 例如例如: :汽车汽车对象(实例):类的实例化对象(实例):类的实例化 。例如。例如: :卡车卡车注意:注意:要使用对象,必须先定义类,然后再创建对象。要使用对象,必须先定义类,然后再创建对象。
2、对象的生存周期对象的生存周期对象在建立时分配了内存,创建对象实际上作了两个方面的工作:对象在建立时分配了内存,创建对象实际上作了两个方面的工作:(1 1)使用)使用newnew保留字要求系统分配内存;保留字要求系统分配内存;(2 2)使用构造函数初始化数据。)使用构造函数初始化数据。销毁对象也是做了两个方面的工作:销毁对象也是做了两个方面的工作: (1 1)释放占用的内存;)释放占用的内存; (2 2)将分配给对象的内存归还给堆()将分配给对象的内存归还给堆(HeapHeap)。)。 踪浮途给毗薄毗锁秀拨激揭插戏顺宿劲每关颜薯祁恕棕超粱坞曲秽帧狞估面向对象编程基础0000面向对象编程基础000
3、03 34.1 4.1 类的组织类的组织1.1.类的声明类的声明用用classclass定义类,声明类的形式为:定义类,声明类的形式为: 附加声明附加声明 访问修饰符访问修饰符 class class 类名称类名称 : 基类基类 ,接口序列,接口序列 字段声明字段声明 构造函数构造函数 方法方法 事件事件 注意注意:中的内容可省或任中的内容可省或任选其一选其一, ,当两者都有时当两者都有时, ,先基先基类后接口类后接口寂梢哪硕蚁啃卵靴桶墩纹灾劣爸娠扁品募舅粹恋拦困藐仰郝嗅砌莽滁精牵面向对象编程基础0000面向对象编程基础00004 44.1 4.1 类的组织(续)类的组织(续)publicpu
4、blic class Child class Child private int age; private int age; private string name; private string name; / / 不带参数的构造函数不带参数的构造函数 public Child() public Child() name = none; name = none; / / 带参数的构造函数带参数的构造函数 public Child(string name, int age) public Child(string name, int age) 如果不指明,则如果不指明,则默认为默认为priva
5、teprivate骡斩坝始蔡丛宗睹狈湾漆域寿薪井嚼饶锈蹈谓果涣疲责渝垣框妈效魄湍睁面向对象编程基础0000面向对象编程基础00005 54.1 4.1 类的组织(续)类的组织(续) this.name = name; this.name = name; this.age = age; this.age = age; / / 输出方法输出方法 public void PrintChild() public void PrintChild() Console.WriteLine(0, 1 years Console.WriteLine(0, 1 years old., name, age);old
6、., name, age); public class Programpublic class Program 措召淹闺氯觅坑驾庶垒阜砧豫应寺乞迸龟尘吧矛甥狂净西丸只梭寻穗潜传面向对象编程基础0000面向对象编程基础00006 64.1 4.1 类的组织(续)类的组织(续) public static void Main()public static void Main() / /使用使用newnew关键字创建对象,关键字创建对象,newnew后是调用的构造函后是调用的构造函数数 Child child1 = new Child(Zhang San, 11); Child child1 = n
7、ew Child(Zhang San, 11); Child child2 = new Child(Li Si, 10); Child child2 = new Child(Li Si, 10); Child child3 = new Child(); Child child3 = new Child(); / / 显示结果显示结果 Console.Write(Child #1: ); Console.Write(Child #1: ); child1.PrintChild(); child1.PrintChild(); Console.Write(Child #2: ); Console.W
8、rite(Child #2: ); child2.PrintChild(); child2.PrintChild(); Console.Write(Child #3: );Console.Write(Child #3: ); child3.PrintChild(); child3.PrintChild();役掐灰怕贮旦驱咖寿婚软予寺狰纱芽坝寸荒锥灸晓蒂获馅逮恿氓挽践芹嚏面向对象编程基础0000面向对象编程基础00007 74.1 4.1 类的组织(续)类的组织(续) Console.ReadLine(); Console.ReadLine(); 输出结果:输出结果:Child #1: Zhan
9、g San, 11 years old.Child #1: Zhang San, 11 years old.Child #2: Li Si, 10 years old.Child #2: Li Si, 10 years old.Child #3: none, 0 years old.Child #3: none, 0 years old.殿拨榆霞去糠磅瑟波担仇拎宝拔播淑圣医哦桩杨款崭憋烦倚免驶科绊燃钢面向对象编程基础0000面向对象编程基础00008 84.1.2 4.1.2 构造函数构造函数 作用:作用:构造函数是一个特殊的方法,用于在建立对象时构造函数是一个特殊的方法,用于在建立对象时进行
10、初始化的动作。进行初始化的动作。 好处:好处:确保每一个对象在被使用之前都适当地进行了初始确保每一个对象在被使用之前都适当地进行了初始化的动作。化的动作。 构造函数特点:构造函数特点: 1) 1) 每个类至少有一个构造函数。若程序代码中没有构造每个类至少有一个构造函数。若程序代码中没有构造函数则系统会自动提供一个默认的构造函数。函数则系统会自动提供一个默认的构造函数。 2) 2) 一个构造函数总是和它的类名相同。一个构造函数总是和它的类名相同。 3) 3) 构造函数不包含任何返回值。构造函数不包含任何返回值。 4) 4) 构造函数总是构造函数总是publicpublic的。的。 一般在构造函数
11、中作初始化工作,对于执行过程用时比较一般在构造函数中作初始化工作,对于执行过程用时比较长的程序代码,最好不要放在构造函数中。长的程序代码,最好不要放在构造函数中。枯屈笨起逮饭论挽北简动蝴孔袁腐庞软良师旭桑课钠需蚀鲜桌慷沮撬渴生面向对象编程基础0000面向对象编程基础00009 94.1.2 4.1.2 构造函数(续)构造函数(续) 1 1、默认构造函数、默认构造函数(1 1)如果在类中不定义构造函数,系统会提供一个默认的构)如果在类中不定义构造函数,系统会提供一个默认的构造函数。造函数。(2 2)默认构造函数没有参数。)默认构造函数没有参数。(3 3)默认构造函数自动将非静态成员初始化为:)默
12、认构造函数自动将非静态成员初始化为: 数值型数值型: :如如intint、doubledouble等,初始化为等,初始化为0 0。 bool bool类型:初始化为类型:初始化为false.false. 引用类型:初始化为引用类型:初始化为nullnull。(4 4)如果自己定义了类的构造函数,则所有初始化工作由编)如果自己定义了类的构造函数,则所有初始化工作由编程者自己完成。程者自己完成。螺兽飞迭舅巩坞曼伟隆京乒来驭侣虏浪榜童欠岔骋垂仑囤朔鬃颇称裹抹芒面向对象编程基础0000面向对象编程基础000010104.1.2 4.1.2 构造函数(续)构造函数(续)2. 2. 重载构造函数重载构造函
13、数 有时候可能会遇到这样的情况:在一个类中的多个方有时候可能会遇到这样的情况:在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。这时,无参数的构造函数就不能胜任了,解中传递过来。这时,无参数的构造函数就不能胜任了,解决这个问题最好的办法就是:重载(决这个问题最好的办法就是:重载(OverloadingOverloading)构造函)构造函数。数。爪途呜冠频照挨动屠域识逢肄温在威姬钮陌兄卡疏刷睛供贡奋鹃寅莲畜他面向对象编程基础0000面向对象编程基础000011114.1.2 4.1.2 构造函数(续)构造函数(续)
14、using System;using System;using System.Collections.Generic;using System.Collections.Generic;using System.Text;using System.Text;namespace OverloadingExamplenamespace OverloadingExample class Program class Program public Program() public Program() Console.WriteLine(null); Console.WriteLine(null); 鸣郭毛
15、芍睦米粕打讳搭驹朽惕氛豌托库烘紊骗拎署堕甘抑血误蛆底告诈秧面向对象编程基础0000面向对象编程基础000012124.1.2 4.1.2 构造函数(续)构造函数(续) public Program(string str) public Program(string str) Console.WriteLine(str); Console.WriteLine(str); static void Main() static void Main() Program aa = new Program(); Program aa = new Program(); Program bb = new Pro
16、gram(How are you!); Program bb = new Program(How are you!); Console.ReadLine(); Console.ReadLine(); 屈夫堵答饵酷欲您奇摊逸托纯炔割嘎佯罕评幌慢针啮卑埠凡酷怔光物亡衫面向对象编程基础0000面向对象编程基础000013134.1.3 4.1.3 字段和局部变量字段和局部变量字段字段: :指声明为类一级的对象或值类型的变量。指声明为类一级的对象或值类型的变量。 局部变量局部变量: :指在方法、事件以及构造函数内声明的变量。指在方法、事件以及构造函数内声明的变量。 public class Progr
17、ampublic class Program public static int j=20; / public static int j=20; /字段字段 public static void Main() public static void Main() int j=30; / int j=30; /局部变量局部变量 Console.WriteLine(j); / Console.WriteLine(j); /输出结果:输出结果:3030 Console.WriteLine(Program.j); / Console.WriteLine(Program.j); /输出结果:输出结果:20
18、20 Console.ReadLine(); Console.ReadLine(); 微薛汤康麓唆塌俺核爹散桩越阵剖握沮拔猖落愈捅哎杭酥萍厢绥扁灯肯桑面向对象编程基础0000面向对象编程基础000014144.1.3 4.1.3 字段和局部变量字段和局部变量 当字段和局部变量名相同时,如果要引用静态字段,可当字段和局部变量名相同时,如果要引用静态字段,可以使用下面的形式:以使用下面的形式: 类名类名. .字段名字段名 如果是实例字段,则使用下面的形式:如果是实例字段,则使用下面的形式: this.this.字段名字段名 这里的这里的thisthis指当前实例。指当前实例。 当然,如果没有出现字
19、段和局部变量名重名的情况,引当然,如果没有出现字段和局部变量名重名的情况,引用字段的形式和引用局部变量的形式相同。用字段的形式和引用局部变量的形式相同。卢浓昭祷着册混恶鞭贰姨芜院撩薛计尖腆谋颈阑幻伞路偶芥驾洱津哆碴六面向对象编程基础0000面向对象编程基础000015154.1.4 4.1.4 静态成员与实例成员静态成员与实例成员类的成员包括字段、属性、构造函数、方法、事件、索引、嵌类的成员包括字段、属性、构造函数、方法、事件、索引、嵌套类。套类。类的成员分静态成员和实例成员类的成员分静态成员和实例成员静态成员在内存中只有一份静态成员在内存中只有一份静态成员要等到应用程序结束时才会退出内存。静
20、态成员要等到应用程序结束时才会退出内存。把只有创建了类的实例才能够使用的成员叫实例成员。把只有创建了类的实例才能够使用的成员叫实例成员。 侈控澈襟虎秦菲摈写姓讨赤沛呸扳摧伊积闰逗胀良仓轩迅因烛寡沏怖歪屹面向对象编程基础0000面向对象编程基础000016164.1.5 4.1.5 访问修饰符访问修饰符C#C#中有以下成员访问修饰符:中有以下成员访问修饰符:Public Public (常用)(常用)任何外部的类都可以不受限制的存取这个类的方法和任何外部的类都可以不受限制的存取这个类的方法和数据成员。数据成员。private private (常用)(常用)类中的所有方法和数据成员只能在此类中使
21、用,外部类中的所有方法和数据成员只能在此类中使用,外部无法存取。无法存取。( (默认默认) )ProtectedProtected 除了让本身的类可以使用之外,任何继承自此类的子类都可除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。以存取。Internal Internal 在当前项目中都可以存取。该访问权限一般用于基于组件的开在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访问。问。Protected internalProtected internal
22、 只限于当前项目,或者从该项目的类继承的类才只限于当前项目,或者从该项目的类继承的类才可以存取。可以存取。 PartialPartial 局部类型,类的定义和实现可以分布在多个文件中,但都要使局部类型,类的定义和实现可以分布在多个文件中,但都要使用用partialpartial标注,基类只需要声明一次,若多次声明则必须完全一致。标注,基类只需要声明一次,若多次声明则必须完全一致。赠惋处基痹榷惦赛肇需逊她磋丽蓄殴瑞楷妖嘘征腥骸块敞喇要芜虹堂膳档面向对象编程基础0000面向对象编程基础000017174.2 4.2 结构结构结构(结构(structstruct)是由一系列相关的、但类型不一定相同的
23、变是由一系列相关的、但类型不一定相同的变量组织在一起而构成的数据表示形式,所有结构类型都隐式量组织在一起而构成的数据表示形式,所有结构类型都隐式地从类型地从类型objectobject继承。继承。例如:例如:public struct Pointpublic struct Point public int x; public int x; public int y; public int y;结构和类的区别与联系:结构和类的区别与联系:结构类型是值类型,类类型是引用类型。结构类型是值类型,类类型是引用类型。凡是定义为结构的,都可以用类来定义。凡是定义为结构的,都可以用类来定义。创建轻量级对象时
24、,可以使用结构。创建轻量级对象时,可以使用结构。奥然老爹韦绪篮太巨绣榔垦充舀核嫡馅栗揩举胀绢火过壁剥破匈知封搔司面向对象编程基础0000面向对象编程基础000018184.3 4.3 方法方法 方方法法(MethodMethod)是是一一组组程程序序代代码码的的集集合合,每每个个方方法法都都有有一一个方法名,便于识别和让其他方法调用。个方法名,便于识别和让其他方法调用。1. 1. 方法的定义与使用方法的定义与使用 (1 1)方法必须放在某个类中。)方法必须放在某个类中。 (2 2)定义方法的语法形式为:)定义方法的语法形式为: 访问修饰符访问修饰符 返回值类型返回值类型 方法名称(参数序列)方
25、法名称(参数序列) 语句序列语句序列 愿错翌透坏嚣罢苟麦陛庐啄许蘸赞拄夕裕淌荡隅寺锐乔尹硅挨诣哄挨铀捷面向对象编程基础0000面向对象编程基础000019194.3 4.3 方法(续)方法(续)定义方法时,需要注意以下几点:定义方法时,需要注意以下几点:方法名不能和变量、常数或者任何声明在类中其它的成员相方法名不能和变量、常数或者任何声明在类中其它的成员相同。同。方法可以有参数,也可以没有参数,但是不论是否有参数,方法可以有参数,也可以没有参数,但是不论是否有参数,小括号都是必需的。如果参数序列中的参数有多个,则以逗小括号都是必需的。如果参数序列中的参数有多个,则以逗号分开。号分开。结束某个方
26、法的执行,可以使用结束某个方法的执行,可以使用returnreturn语句,程序遇到语句,程序遇到returnreturn语句后,会将执行流程交还给调用此方法的程序代码语句后,会将执行流程交还给调用此方法的程序代码段。此外,还可以用段。此外,还可以用returnreturn语句返回一个值。语句返回一个值。如果声明一个非如果声明一个非voidvoid类型的方法,则方法中必须至少有一个类型的方法,则方法中必须至少有一个returnreturn语句。语句。刽尔纱模惋毋萝销寡砾来渔钒牺联际昆村粟相麓氨化价枝忻迸工叭翁裂禽面向对象编程基础0000面向对象编程基础000020204.3 4.3 方法(续)
27、方法(续)using System;using System;class Programclass Program public int MyMethod() public int MyMethod() Console.WriteLine(this is MyMethod.); Console.WriteLine(this is MyMethod.); int i = 10; int i = 10; return i; return i; static void Main() static void Main() Program method = new Program(); Program
28、method = new Program(); int j = 5; int j = 5; j = method.MyMethod(); j = method.MyMethod(); Console.WriteLine(the value is 0., j); Console.WriteLine(the value is 0., j); 木磺钮黑湾么枫陇耶泵机浚效毯丫国饶庶音初谐删裕鸭皱羌露菊怨翘烬紊面向对象编程基础0000面向对象编程基础000021214.3 4.3 方法方法2. 2. 方法中的参数传递方法中的参数传递1) 1) 传递值类型的参数传递值类型的参数 值类型参数的格式为:值类型
29、参数的格式为: 参数类型参数类型 参数名参数名class Programclass Program public static void AddOne(int a)a+; public static void AddOne(int a)a+; static void Main() static void Main() int a = 3; int a = 3; Console.WriteLine( Console.WriteLine(调用调用AddOneAddOne之前,之前,a=0, a);a=0, a); AddOne(a); AddOne(a); Console.WriteLine( C
30、onsole.WriteLine(调用调用AddOneAddOne之后,之后,a=0, a);a=0, a); Console.ReadLine(); Console.ReadLine(); 糜琼毕饵碑屁绩措干极铁媚蔼辟惠祁脸忻沥雇欺箍屎桂奠辊瘦逃驳销琳似面向对象编程基础0000面向对象编程基础000022224.3 4.3 方法(续)方法(续)2) 2) 传递引用类型的参数传递引用类型的参数引用类型参数的格式为:引用类型参数的格式为: ref ref 参数类型参数类型 参数参数class Programclass Program public static void AddOne(ref i
31、nt a)a+; public static void AddOne(ref int a)a+; static void Main() static void Main() int a = 3; int a = 3; Console.WriteLine( Console.WriteLine(调用调用AddOneAddOne之前,之前,a=0, a);a=0, a); AddOne(ref a); AddOne(ref a); Console.WriteLine( Console.WriteLine(调用调用AddOneAddOne之后,之后,a=0, a);a=0, a); Console.R
32、eadLine(); Console.ReadLine(); 奇涩虹静佛譬摊替页孪类峨没即辜薄震西涩瞧隶填耻仰忙掣闯遵邱牲怜拄面向对象编程基础0000面向对象编程基础000023234.3 4.3 方法(续)方法(续) 3) 3) 输出多个引用类型的参数输出多个引用类型的参数 输出引用类型参数的格式为:输出引用类型参数的格式为: out out 参数类型参数类型 参数名参数名class Programclass Program public static void MyMethod(out int a, out int b) public static void MyMethod(out in
33、t a, out int b) a = 5; a = 5; b = 6; b = 6; static void Main() static void Main() int x, y; int x, y; MyMethod(out x, out y); MyMethod(out x, out y); Console.WriteLine( Console.WriteLine(调用调用MyMethodMyMethod之后,之后,x=0,y=1, x, x=0,y=1, x, y);y); Console.ReadLine(); Console.ReadLine(); 性凋快存圈甭挚损燎瘫戈隅疡介蜜旨
34、愁霸名拟章丧递崭峨牛灵摔势坝吕糊面向对象编程基础0000面向对象编程基础000024244.3 4.3 方法(续)方法(续) 4) 4) 传递个数不确定的参数传递个数不确定的参数 需要传递的参数个数不确定时,可以采用需要传递的参数个数不确定时,可以采用paramsparams关键字,关键字,其后一般跟一个数组其后一般跟一个数组。class Programclass Program public static float Average(params long v) public static float Average(params long v) long total, i; long to
35、tal, i; for (i = 0, total = 0; i v.Length; +i) for (i = 0, total = 0; i v.Length; +i) total += vi; total += vi; return (float)total / v.Length; return (float)total / v.Length; 宠寒籍疚英桂叼瘸渊柔躇铱迭莹拯冠侈帜快闸隶等硼屿蓄饶讨盈曾袄夯坯面向对象编程基础0000面向对象编程基础000025254.3 4.3 方法(续)方法(续)static void Main()static void Main() float x =
36、 Average(1, 2, 3, 5); float x = Average(1, 2, 3, 5); Console.WriteLine(1 Console.WriteLine(1、2 2、3 3、5 5的平均值为的平均值为0, 0, x);x); x = Average(4, 5, 6, 7, 8); x = Average(4, 5, 6, 7, 8); Console.WriteLine(4 Console.WriteLine(4、5 5、6 6、7 7、8 8的平均值为的平均值为0, x);0, x); Console.ReadLine(); Console.ReadLine();
37、 宪臀拥蝎蒂亥惺匣畅滑抉右雾滤腺委拇肾城宰靶宫拣酵靛喊叭气偷通兔荚面向对象编程基础0000面向对象编程基础000026264.3 4.3 方法(续)方法(续)3. 3. 方法重载方法重载 方法重载是指具有相同的方法名,但参数类型或参数个数方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。不完全相同的多个方法可以同时出现在一个类中。using System;using System;class Programclass Program public static int Add(int i, int j) public static int Add(i
38、nt i, int j) return i + j; return i + j; public static string Add(string s1, string s2) public static string Add(string s1, string s2) return s1 + s2; return s1 + s2; public static long Add(long x) public static long Add(long x) return x + 5; return x + 5;血刨畜粪垛答辱个漫鸡截胆赦扼署演丰坏肩使抛敖间箭邦如补腹痔肢叹翱面向对象编程基础0000
39、面向对象编程基础000027274.3 4.3 方法(续)方法(续)static void Main()static void Main() Console.WriteLine(Add(1, 2); Console.WriteLine(Add(1, 2); Console.WriteLine(Add(1, 2); Console.WriteLine(Add(1, 2); Console.WriteLine(Add(10); Console.WriteLine(Add(10); / /按回车键结束按回车键结束 Console.ReadLine(); Console.ReadLine(); 姨束摸蠕渐蔫丘西勘茵龚趋芒吼险贫轻琉才模隔馈退诗耍陀炉酬溢撂丸蚤面向对象编程基础0000面向对象编程基础0000