




已阅读5页,还剩83页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#面向对象基础,3.1、面向对象的思想3.2、类和对象3.3、类的构造函数和析构函数3.4、方法3.5、运算符重载3.6、域与属性3.7、索引指示器,3.1、面向对象的思想,1、面向对象程序设计的由来面向对象设计方法(ObjectOrientedProgramming,OOP)的总体设计思路是:将数据及处理这些数据的操作都封装到一个称为类的数据结构中,在程序中使用的是类的实例对象。对象是代码与数据的集合,是封装好的一个整体。对象具有一定的功能,也就是说对象是具有一定功能的程序实体。程序是由一个个对象构成的,对象之间通过一定的“相互操作”传递消息,在消息的作用下,完成特定的功能。,2、面向对象程序设计语言的三大原则封装:就是用一个框架把数据和代码组合在一起,形成一个对象,对象是封装的基本单元。继承:是面向对象编程技术的一块基石,通过它可以创建分级层次的类。继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。多态性:同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。,3、面向对象程序设计的基本概念1)、类和对象2)、属性、方法与事件3)、封装4)、继承5)、重载6)、多态性,3.2、类和对象,通常把具有同样性质和功能的东西所构成的集合叫做类(class)。在C#中,也可以把具有相同内部存储结构和相同一组操作的对象看成是同一类。在指定一个类后,往往把属于这个类的对象称为类的实例,可以把类看成是对象的模板,把对象看成是类的实例。,1、类的声明【格式】:类修饰符class类名:基类类名成员定义列表;【功能】:定义一个由“类名”指定的类。,1)支持的类修饰符,2)如果缺省类修饰符,默认为private。3)“基类类名”用来指定派生该类的基类,如果该类没有从任何类继承,则不需要该选项。4)“成员定义列表”声明该类包含的成员,类成员有两部分组成:一个是类体中以类成员声明形式引入的类成员;另一个则是直接从它的基类继承而来的成员。类成员声明主要包括:常数、字段、方法、属性、事件、索引器、运算符、构造函数、析构函数等。当字段、方法、属性、事件、运算符和构造函数等声明中含有static修饰符时,则表明它们是静态成员,否则是实例成员。类成员声明中可有:public、private、protected、internal、protectedinternal中的一个修饰。默认约定访问修饰符为private。,字段:字段是与类相关的变量,相当于C+中的变量。常量:用来定义与类相关的常量值。事件:是类的成员,它可以让对象通知调用者某些特定的行为发生时间。方法:完成类中各种计算或功能的操作,类似函数。属性:定义类的特征,并对他们提供读、写操作。,索引器:允许编程人员在访问数组时,通过索引器访问类的多个实例。又称下标指示器。运算符:定义类的实例能使用的运算符。构造函数:在类被实例化时首先执行的函数,主要完成对象初始化操作。析构函数:在对象被销毁之前最后执行的函数,主要是完成对象结束时的收尾操作。,例:成员常量的声明成员常量是那些表示常量值。关键字const用于声明常量,后跟数据类型的声明。类的常量可以加上new、public、protected、internal或private修饰。ClassApublicconstdoublea=1.0;publicconstdoublex=1.0,y=2.0,z=3.0;,2、类的静态成员和实例成员静态成员:有static,属于类所有,只能通过类名来访问。实例成员:没有static,属于类的实例所有,又称实例成员,只能通过类的实例对象来访问。example1.cs,usingSystem;classExample1staticpublicinta;/静态成员publicintb;/实例成员voidMeth1()/实例方法a=10;/实例方法中可以访问本类的静态成员b=20;/实例方法中可以访问本类的实例成员staticvoidMeth2()a=30;/静态方法能够访问本类的静态成员/b=40;/静态方法不能访问本类的实例成员,publicstaticvoidMain()Example1E1=newExample1();/产生类的实例E1Example1E2=newExample1();/产生类的实例E2E1.Meth1();/调用非静态方法需使用类的实例/E1.Meth2();/此语句出现错误,因为静态方法只能由类来调用Console.WriteLine(a=0,b=1,Example1.a,E1.b);/E2.a=50;/此语句出现错误,因为静态方法只能由类来调用Example1.a=Example1.a+50;/静态成员只能通过类来访问E2.b=Example1.a+60;/此语句正确,实例成员由对象来访问,静态成员由类来访问Console.WriteLine(a=0,b=1,Example1.a,E2.b);,3、对象的声明【格式】:类名实例名=new类名(参数);【功能】:生成一个由“类名”指定的类的名为“实例名”的实例,如果有参数则将参数传递给构造函数。【说明】:1)、new关键字实际上是调用构造函数来完成实例的初始化工作。,2)、创建实例也可以分为两步:先定义实例变量,然后用new关键字创建实例。类名实例名/定义类的实例变量实例名=new类名(参数);/创建类的实例。StudentStu1=newStudent();/定义并生成Student类的实例Stu1。等价于:StudentStu1;Stu1=newStudent();,3.3、类的构造函数和析构函数,C#中有两个特殊的函数:构造函数、析构函数。构造函数:是在创建类的实例(也就是对象)时首先执行的函数。析构函数:是当实例(对象)从内存中销毁前最后执行的函数。这两个函数的执行是无条件的,系统会自动在创建对象时调用构造函数,在销毁对象时调用析构函数,而不需要程序员通过代码调试。,1、构造函数作用:主要用来为对象分配存储空间,完成初始化操作(给类的成员变量赋值等)。定义类的构造函数有如下规则:1)构造函数的函数名和类的名称一样。2)当某个类没有构造函数时,系统将自动为其创建构造函数,这种构造函数称为默认构造函数。example1();,3)构造函数的访问修饰符总是public。如果是private,则表示这个类不能被实例化,这通常用于只含有静态成员的类中。4)构造函数由于不需要显示调用,因而不用声明返回类型。5)构造函数可以带参数也可以不带参数。example2.cs,classEmployeeprotectedstringID,Name,Salary;publicEmployee()ID=0000;Name=*;Salary=0;Console.WriteLine(0t1t2,ID,Name,Salary);publicEmployee(stringid)ID=id;Name=空缺;Salary=空缺;Console.WriteLine(0t1t2,ID,Name,Salary);publicEmployee(stringid,stringname)ID=id;Name=name;Salary=空缺;Console.WriteLine(0t1t2,ID,Name,Salary);publicEmployee(stringid,stringname,stringsalary)ID=id;Name=name;Salary=salary;Console.WriteLine(0t1t2,ID,Name,Salary);,classInquirepublicstaticvoidMain()Console.WriteLine(员工IDt员工姓名t薪水);Employeee1=newEmployee();Employeee2=newEmployee(0001);Employeee3=newEmployee(0023,Green);Employeee4=newEmployee(1023,Smith,3400);,2、析构函数析构函数在对象销毁时被调用,常用来释放对象占用的存储空间。有如下特点:1)析构函数不能带有参数2)析构函数不能拥有访问修饰符3)不能显示地调用析构函数4)析构函数的命名规则是在类名前加上一个“”。5)析构函数在对象销毁时自动调用example3.cs,classExamstaticpublicinta;publicintb;publicExam()a=0;b=0;publicExam(intm,intn)a=m;b=n;Exam()/析构函数,classexamplepublicstaticvoidMain()ExamE1=newExam();Console.WriteLine(a=0,b=1,Exam.a,E1.b);ExamE2=newExam(10,20);Console.WriteLine(a=0,b=1,Exam.a,E2.b);,3.4、方法,1、方法的定义2、方法的调用3、参数的传递4、方法的嵌套与递归调用5、静态方法和非静态方法6、方法重载,1、方法的定义【格式】:方法修饰符数据类型说明符方法名(形式参数说明列表)变量、数组的定义语句;其他可执行部分,【说明】:1)方法定义的第一行称为方法头,“方法名”必须是一个有效的标示符,“数据类型说明符”说明方法的返回值类型。2)“形式参数说明列表”是一个由逗号分隔开的列表。3)如果方法需要返回一个值,则方法中个必须有一条“return(表达式);”。4)如果方法不返回任何值,应在定义方法时把数据类型说明符定义成“void”。5)方法头不是一条语句,其后不能跟分号“;”。,举例:求任意两个整数之间的所有数的平方和。privatestaticintpfh(intx,inty)/方法头inti,sum=0;/方法中变量的定义for(i=x;i=y;i+)sum=sum+i*i;return(sum);,privatestaticvoidWelcome()/方法头inti;stringxm;Console.WriteLine(请输入您的姓名:);xm=Console.ReadLine();for(i=1;i=5;i+)Console.WriteLine(欢迎您,0同志。这里是C#编程世界!,xm);,举例:要求用户输入姓名,然后输出五行如下信息:“欢迎您,*同志。这里是c#编程世界!”,2、方法的调用有三种:【格式1】:方法名(实际参数类表)【格式2】:对象名.方法名(实际参数类表)【格式3】:类名.方法名(实际参数类表),【说明】:1)调用方法时,如果方法有形式参数,在调用时应在“()”中使用实际参数。2)如果方法是没有返回值的方法,方法的调用只能作为一条语句;如果方法有返回值,方法的调用相当于一个同类型的数据,可以作为表达式或表达式的一部分参与运算。3)在形式上可以这样理解形似参数和实际参数:定义方法时使用的参数是形式参数,调用方法时使用的参数是实际参数。example4.cs、example5.cs,example4.csclassexampleprivatestaticintpfh(intx,inty)/方法头inti,sum=0;/方法中变量的定义for(i=x;i=y;i+)sum=sum+i*i;return(sum);publicstaticvoidMain()inta,b;Console.WriteLine(请输入两个整数);a=Convert.ToInt32(Console.ReadLine();b=Convert.ToInt32(Console.ReadLine();Console.WriteLine(0到1之间的所有整数的平方和是2,a,b,pfh(a,b);,example5.csclassexampleprivatestaticvoidWelcome()/方法头inti;stringxm;Console.WriteLine(请输入您的姓名:);xm=Console.ReadLine();for(i=1;i=5;i+)Console.WriteLine(欢迎您,0同志。这里是C#编程世界!,xm);publicstaticvoidMain()Welcome();,3、参数的传递所谓参数传递时指实参把数据传给形参的方式,C#中的参数传递可分为4种:值传递、引用传递、输出参数和参数数组。1)值传递使用“值传递”的方法来传递参数时,实参把值复制一份传给形参,形参接受了实参的值后与实参已不再存在任何联系。在方法中对形参的修改不会影响到对应的实参,这种传递方式又称为单向传递。example6.cs,usingSystem;classexamplestaticvoidexch(inta,intb)intt;t=a;a=b;b=t;publicstaticvoidMain()intx,y;Console.WriteLine(请输入x和y的值:);x=Convert.ToInt32(Console.ReadLine();y=Convert.ToInt32(Console.ReadLine();exch(x,y);Console.WriteLine(转化后的x和y的值:0,1,x,y);,没有改变的原因是“值传递”。,x,x,(a)函数调用时的参数传递,(b)改变形参的值不会影响实参,可见实参把值传递给形参后,实参和形参之间不再存在联系,对形参的修改不会影响到对应的实参值。,2)引用传递和值参数不同,引用型参数并不开辟新的内存区域,而是向方法传递实参在内存中的地址。在C#中要通过引用方式传递数据,需要使用关键字ref。使用方法是在定义方法时,在按引用传递的形式参数的类型说明符前加上关键字ref,在调用方法时,在按引用传递的实际参数之前加上关键字ref。example7.cs,classexamplestaticvoidexch(refinta,refintb)intt;t=a;a=b;b=t;publicstaticvoidMain()intx,y;Console.WriteLine(请输入x和y的值:);x=Convert.ToInt32(Console.ReadLine();y=Convert.ToInt32(Console.ReadLine();exch(refx,refy);Console.WriteLine(转化后的x和y的值:0,1,x,y);,3)输出型参数C#提供了一种特殊的参数传递方式,在参数前加out修饰符,它与ref参数很相似,只有一点除外,就是它只能用于从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。与引用型参数的参数类似,输出型参数也不开辟新的内存区域。它与引用参数的区别:调用方法前无须对变量进行初始化。Example8.cs,usingSystem;publicclassCalculatepublicvoidCal(intinNum,outintoutNum)outNum=inNum*inNum;classCalAPPpublicstaticvoidMain()Calculatecal=newCalculate();intoutnum;/不必初始化cal.Cal(35,outoutnum);Console.WriteLine(outnum);,求一个数组元素中的最大值、最小值以及平均值。usingSystemClassMyclasspublicvoidmaxminarray(inta,outintmax,outintmin,outdoubleavg)intsum;sum=max=min=a0;for(inti=1;imax)max=ai;if(aimin)min=ai;sum+=ai;avg=sum/a.length;,classTeststaticvoidmain()Myclassm=newMyclass();intscore=87,89,78,100,90,68;intsmax,smin;doublesavg;m.maxminarray(score,outsmax,outsmin,outsavg);Console.Write(“max=0,min=1,avg=2”,smax,smin,savg);,4)参数数组形参数组前如果用params修饰符进行声明就是参数数组,通过参数数组可以向函数传递个数变化的参数。若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。参数数组必须是一维数组。不允许将params修饰符与ref和out修饰符组合起来使用。与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量。若实参是数组则按引用传递,若实参是变量或表达式则按值传递。Example10.cs,staticintParamsMeth(refintsum,paramsintarr)inti;for(i=0;iarr.Length;i+)sum=sum+arri;arri=arri*arri;return(arrarr.Length-1);,staticvoidMain()inta=1,2,3;inti,l;ints=0;ParamsMeth(refs,a);Console.WriteLine(和为0,s);for(i=0;ia.Length;i+)Console.WriteLine(a0=1,i,ai);l=ParamsMeth(refs,23,45);Console.WriteLine(和为:0,1,s,l);,4、方法的嵌套与递归调用1)、方法的嵌套调用在C#中,所有方法的级别都是一样的,不能在一个方法中定义另一个方法,但c#中方法可以嵌套调用。所谓方法的嵌套调用时指一个方法调用了另一个方法,被调用方法在执行过程中又调用了另外一个方法。,编写一个函数求下列的函数值:s(x,n)=x/(1!+2!+3!+n!)分析:要求s函数值,必须知道两个自变量x和n的值,这可以通过输入语句输入这两个自变量的值。本例的关键是求分母:1!+2!+3!+n!,这是一个连加的式子,其关键是求第i项的值i!,求i!是一个连乘的式子。example11.cs,staticdoublefact(intk)/求k的阶乘函数inti;doublef=1.0;for(i=1;i0)Console.WriteLine(0+1i,a,b);elseConsole.WriteLine(0-1i,a,b);,classTestpublicstaticvoidMain()Complexx=newComplex(1,2);x.DispCom();Complexy=newComplex(3,4);y.DispCom();Complexz=newComplex(0,0);z=x+y;z.DispCom();,3.6域与属性,1、域又称字段,它是类的一个成员,这个成员代表与对象或类相关的变量。实际上域就相当于C+类中的一种简单成员变量,而在C#中换了名字罢了。【格式】:域修饰符域类名域名;,【说明】:1)修饰符有:new,public,protected,internal,private,static,readonly等。2)在域定义时如果加上了readonly修饰符表明该域为只读域。3)只读域只能在域定义中及域所属类的构造函数或静态构造函数中进行赋值,在其他情况下均不能改变只读域的值。example16.cs,classboxpublicdoublehigh;publicdoublewidth;publicreadonlydoubleweight=5;publicstaticintcount=0;publicbox(doubleh,doublew,doublewt)high=h;width=w;weight=wt;count+;,classboxTestpublicstaticvoidMain()boxB1=newbox(10,20,300);Console.WriteLine(Count=0,High=1,Width=2,Weight=3,box.count,B1.high,B1.width,B1.weight);/B1.weight=B1.weight+5;/错误,只读域只能在定义时和构造函数中赋值boxB2=newbox(20,40,600);Console.WriteLine(Count=0,High=1,Width=2,Weight=3,box.count,B1.high,B2.width,B2.weight);,2、属性属性(property)是指对象的特征和形态,具体说就是指对象的数据成员。C#是完全面向对象的语句,C#倡导一种新途径,对数据成员能够更好的封装和保护,同时又向外界提供更有效的访问形式。C#中用来达到这个目标的就是“属性”,而那些数据成员,在C#中称为“字段”或“域”。属性是一种特殊的成分,它具有方法的本质,又具有字段的形式,定义属性类似定义方法,使用属性类似于使用字段。属性完善了C#的封装功能,使得所有的数据成员都可以称为私有的数据,从而更好地体现面向对象的特征封装性。,属性由两个部分组成:属性头和存取器。存取器分为get访问器和set访问器。【格式】:属性修饰符类型说明符属性名get/get存取程序语句set/set存取程序语句,【说明】:1)属性修饰符有new,public,protected,internal,private,static,virtual,override和abstract9种。2)get和set是一种特定的方法,给属性赋值时使用存取器set,C#使用value表示输入的数据;获取属性值时使用存取器get。3)在程序中,如果只有get访问器,表示是只读属性;如果只有set访问器,表示只写属性;两个都有,表示读写属性。4)get访问函数是一个不带参数的方法,它用于向外部返回属性成员的值。通常访问函数的语句或语句块主要由return或throw语句返回某个变量成员的值。,如:publicclassEnployeeprivatestringname;privatelongID;privateintsalary;publicstringName/定义属性成员Namegetreturnname;setif(name!=value)name=value;,EnployeeMyenployee=newEnployee();Stringname1=Myenployee.Name;,Stringname1=M;X,可以通过属性成员的访问函数访问类中的某个变量(私有或公有),这样就可以通过属性成员把类本身与应用该类的程序分割开来,很好的体现了类的封装性。,set访问函数Set访问函数是一个带有简单值类型参数的方法,用于处理类外部的写入值。set函数带有一个特殊的关键字value,value就是set访问函数的隐式参数,在set函数中通过value将外部的输入传递进来,然后赋值给类中的某个变量成员。上例中,set函数将对象的值赋给了私有变量name。example17.cs,publicclassEmployeeprivatestringname;privatelongID;privateintsalary;publicEmployee(stringn,longi,ints)name=n;ID=i;salary=s;publicstringNamegetreturnname;setif(name!=value)name=value;,publicintSalarygetreturnsalary;setsalary=value;publiclongGetIDgetreturnID;setID=value;publicvoidEmployeeInfo()Console.WriteLine(Name:+name);Console.WriteLine(IDnumber:+ID);Consol
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 区块链数据备份光盘驱动器租赁与远程监控服务协议
- 智慧农业无人机精准喷洒系统租赁服务合同
- 高校与知名企业联合培养实习生就业保障协议
- 管理者任职资格答辩
- 《情感调控》课件
- 《聚酰亚胺》课件:一种耐高温高分子材料的深度解析
- 《聚合物X射线研究》课件
- 防火放电安全教育
- 《慢性肾衰竭》课件
- 《咖啡文化基础知识》课件
- 《阿莫西林的生物合成》课件
- 江苏省海安中学、金陵中学、宿迁中学三校2024-2025学年高三年级下学期4月联考测试 化学试卷(含答案)
- 2024年江苏省灌南县事业单位公开招聘医疗卫生岗笔试题带答案
- 2025年上海车展报告(乘用车篇)
- 租地合同补充协议格式
- 离婚协议书正规打印电子版(2025年版)
- 【数学】三角形 问题解决策略:特殊化课件2024-2025学年北师大版数学七年级下册
- 【MOOC】跨文化交际入门-华中师范大学 中国大学慕课MOOC答案
- 人工智能导论(天津大学)知到智慧树章节答案
- 中考数学计算题练习100道(2024年中考真题)
- 激光跟踪仪使用手册
评论
0/150
提交评论