C程序设计附光盘 宋文强 26962-00chapter04_第1页
C程序设计附光盘 宋文强 26962-00chapter04_第2页
C程序设计附光盘 宋文强 26962-00chapter04_第3页
C程序设计附光盘 宋文强 26962-00chapter04_第4页
C程序设计附光盘 宋文强 26962-00chapter04_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,2,本章教学目标,理解类和对象的基本概念掌握如何在C#中创建自定义类掌握为自定义类设置属性和方法的操作,理解静态成员和静态方法理解方法重载和构造函数重载的概念理解类的继承和覆盖,3,4.1面向对象概述,对象(object)状态行为标识(与其他对象的区别)类(class)相同性质对象的抽象属性方法封装(encapsulation)方法与数据合并到一个类中控制方法与数据的可访问性消息(message),4,4.1.1类的创建,访问修饰符class类名称:基类,接口列表字段声明构造函数方法事件类访问修饰符:internalpublicsealedabstract,5,在集成开发环境中新建自定义类,这种方法是把自定义类作为一个单独的文件,6,在应用程序中添加新的自定义类,7,自定义类的框架代码,名为Person.cs的自定义类文件,8,4.1.2字段的定义,访问修饰符数据类型变量声明列表;classPersonpublicstringname;publicstringsex;,9,例4.1声明和引用名为Person的类,usingSystem;usingSystem.Windows.Forms;namespaceex4-01publicpartialclassForm1:Form/通过继承创建了Form1类publicForm1()InitializeComponent();privatevoidForm1_Click(objectsender,EventArgse)Personstudent1=newPerson();/创建了Person类的第一个实例=高山;/为第一个实例student1的字段赋值student1.sex=男;label1.Text+=student1.sex+同学++说:朋友们好!nn;Personstudent2=newPerson();/创建了Person类的第二个实例=吕蒙;/为第二个实例student2的字段赋值student2.sex=女;label1.Text+=student2.sex+同学++说:朋友们好!nn;publicclassPerson/声明了名为Person的类publicstringname,sex;/声明了Person类的字段,10,4.1.3属性的定义和访问,访问修饰符数据类型属性名get/读取属性值的访问器/可执行代码return;set/设置属性值的访问器/可执行代码/表达式(可以使用关键字value),11,例4.2引用具有公有字段和属性的对象,publicclassPerson/定义Person类的代码publicstringname;/公有字段privatestringmysex;/私有字段publicstringsex/定义一个既可读又可写的属性sexget/读取属性值returnmysex;set/设置属性值if(value=男|value=女)/若sex属性赋值为“男”或“女”mysex=value;/把属性赋值保存到mysexelse/若sex属性赋值为其它mysex=性别保密;/把“性别保密”赋值保存到mysex,12,例4.2引用具有公有字段和属性的对象,publicpartialclassForm1:FormpublicForm1()InitializeComponent();privatevoidbutton1_Click(objectsender,EventArgse)Personstudent1=newPerson();/创建Person类的实例=textBox1.Text;/接收用户输入的姓名值,赋给公有字段student1.sex=textBox2.Text;/接收用户输入的性别值,赋给sex属性label3.Text=student1.sex+同学++说:朋友们好!;,13,4.1.4方法的定义和调用,方法(method):包含在类体中的函数成员之一,用来执行某些预定义的操作。,14,方法的定义,方法的定义的语法格式如下:访问修饰符返回值类型方法名(参数列表)语句序列;,15,说明,返回值类型指明调用方法后返回结果的数据类型,可以是普通数据类型,也可以是类或结构。方法名是用户为方法定义的名称。形式参数列表,指明调用方法所需的参数个数和数据类型,多个参数之间使用逗号进行分隔。如果调用方法不需要参数,圆括号也不能省略。如果方法不要求返回值,返回值类型定义为void,可以省略return语句。如果返回值类型不为void,则方法中必须至少有一个return语句。,16,方法的调用,方法的调用的格式如下:对象名.方法名(实际参数表);,17,方法调用时的参数传递,值参数实际参数和形式参数各自占用不同的内存空间,只把实际参数的值复制给对应的形式参数,因此在方法中的代码执行期间形式参数值的改变对实际参数无任何影响引用参数(ref)实际参数和形式参数使用的是相同的内存单元,如果在方法代码执行期间形式参数值发生了改变,实际参数的值就会发生相同的改变输出参数(out)参量参数(数组),18,例4.3引用具有字段和方法的Person对象,publicclassPersonpublicstringname;/公有字段privatestringmysex;/私有字段publicstringsex/定义一个既可读又可写的属性sexget/读取属性值returnmysex;set/设置属性值if(value=男|value=女)/若sex属性赋值为“男”或“女”mysex=value;/把属性赋值保存到mysexelse/若sex属性赋值为其它mysex=性别保密;/把“性别保密”赋值保存到mysexpublicstringtalk(stringword)/定义具有形式参数word的方法if(word=自我介绍)return我是一个学生。;elseif(word=问候)return朋友们好!;elsereturn我对各位的敬仰如滔滔江水;,19,例4.3引用具有字段和方法的Person对象,publicpartialclassForm1:FormpublicForm1()InitializeComponent();privatevoidbutton1_Click(objectsender,EventArgse)Personstudent1=newPerson();=textBox1.Text;student1.sex=textBox2.Text;label4.Text=student1.sex+同学++说:;label4.Text+=student1.talk(comboBox1.Text);/调用对象的talk()方法,20,4.1.5方法的递归调用,递归(recursion),就是通过一个对象自身的结构来描述或部分描述该对象。在C#程序中,递归调用是指在方法中直接或间接地调用方法本身。一个方法在执行时直接调用方法本身,称为直接递归;如果方法A在执行时调用方法B,而方法B又调用方法A,则称为间接递归。,21,例4.4利用递归方法计算阶乘,阶乘的定义n!=1*2*3*(n-1)*n将阶乘的定义改写成递归的形式:n!=n*(n-1)!(n-1)!=(n-1)*(n-2)!1!=1由此得到递归公式:递归的结束条件为n=1时,n!=1。,22,例4.4利用递归方法计算阶乘,privatevoidbutton1_Click(objectsender,EventArgse)label2.Text=计算结果:n;intn=int.Parse(textBox1.Text);for(inti=1;i=n;i+)label2.Text+=i.ToString()+!=+factorial(i)+n;publicintfactorial(intnum)/计算阶乘的递归函数if(num=0|num=1)/递归结束条件return1;elsereturnnum*factorial(num-1);/实现递归的关键语句,23,4.2重载,方法的重载(overloading)在同一个类中,可以定义多个名称相同,但参数不同的方法,当程序中按名称调用这样的方法时,编译器将根据参数的个数、类型和顺序,选择执行与之匹配的方法。MessageBox.Show()方法的重载形式,24,例4.5引用Person类的方法重载,publicclassPerson/定义Person类拥有可以重载的方法publicstringname;/公有字段privatestringmysex;/私有字段publicstringsex/定义一个既可读又可写的属性sexget/读取属性值的访问器returnmysex;set/设置属性值的访问器if(value=男|value=女)/若sex属性赋值为“男”或“女”mysex=value;/把属性赋值保存到mysexelse/若sex属性赋值为其它mysex=性别保密;/把“性别保密”赋值保存到mysexpublicstringtalk()/没有参数的talk()方法return呵呵我很激动,不知道该说什么!;publicstringtalk(stringword)/有一个参数的talk()方法if(word=自我介绍)return我是一个学生。;elseif(word=问候)return朋友们好!;elsereturn我对各位的敬仰如滔滔江水;,25,实现方法重载的代码,publicstringtalk()/没有参数的talk()方法return呵呵我很激动,不知道该说什么!;publicstringtalk(stringword)/有一个参数的talk()方法if(word=自我介绍)return我是一个学生。;elseif(word=问候)return朋友们好!;elsereturn我对各位的敬仰如滔滔江水;,26,例4.5引用Person类的方法重载,privatevoidbutton1_Click(objectsender,EventArgse)Personstudent1=newPerson();=textBox1.Text;student1.sex=textBox2.Text;label4.Text=student1.sex+同学++说:;if(comboBox1.Text=)/未选择“发言”选项,调用无参数的方法重载形式label4.Text+=student1.talk();else/选择了“发言”选项,调用有参数的方法重载形式label4.Text+=student1.talk(comboBox1.Text);,27,4.2.2构造函数的重载,构造函数(constructor)用来在创建对象时进行初始化操作。通过new运算符创建对象时,就会自动调用构造函数,以确保每一个对象在被使用之前都已经进行了必要的初始化。,28,构造函数的特点,构造函数的命名必须和类名完全相同;每个类至少有一个构造函数,如果类定义的代码中没有构造函数,系统会自动地提供一个默认的不带参数的构造函数;一个类可以有多个构造函数,根据其参数的个数或类型的不同,实现构造函数的重载;构造函数不包含任何返回值,也不能用void来修饰;构造函数一般使用访问修饰符public,以便在其它函数中可以创建该类的实例。,29,例4.6在Person类中定义构造函数的重载,publicclassPersonpublicstringname,sex;publicPerson(stringmyname,stringmysex)/具有两个参数的构造函数=myname;/这里的this指对象本身this.sex=mysex;publicPerson(stringmyname)/具有一个参数的构造函数=myname;this.sex=性别保密;publicPerson()/没有参数的构造函数=无名氏;this.sex=性别保密;publicstringtalk(stringword)/具有一个参数的talk()方法if(word=问候)return朋友们好!nn;elsereturn我是一个学生!nn;publicstringtalk()/没有参数的talk()方法return呵呵我很激动,不知道该说什么好了!nn;,30,例4.6在Person类中定义构造函数的重载,publicPerson(stringmyname)/具有一个参数的构造函数=myname;this.sex=性别保密;publicPerson()/没有参数的构造函数=无名氏;this.sex=性别保密;,31,例4.6在Person类中定义构造函数的重载,privatevoidForm1_Click(objectsender,EventArgse)Personstudent1=newPerson();/调用不带参数的构造函数label1.Text+=student1.sex+同学++说:;label1.Text+=student1.talk(问候);Personstudent2=newPerson(王雪蕊,女);/调用带两个参数的构造函数label1.Text+=student2.sex+同学++说:;label1.Text+=student2.talk(自我介绍);Personstudent3=newPerson(谢俊鹏);/调用带一个参数的构造函数label1.Text+=student3.sex+同学++说:;label1.Text+=student3.talk();,32,4.3类的静态成员,静态成员使用访问修饰符static定义类的成员静态字段静态方法主要用于解决数据共享问题静态成员和非静态成员之间的区别:静态成员属于类非静态成员属于对象,33,4.3.1静态数据成员,类的所有对象共享的成员,使用访问修饰符static定义例如:classStudent/定义Student类publicstaticintStudentNumber;/静态数据成员publicstringName;publicstringSex;publicintAge;publicstringHome;,对于每个具体的学生对象来说,没有必要都存储一个学生总人数字段,34,4.3.2静态方法,使用访问修饰符static定义的方法静态方法属于类,引用静态方法时应该使用类名,而不是使用对象名例如:Console.WriteLine()Console.Read()在静态方法的实现中,不能直接引用类中声明的非静态成员,但可以引用类中声明的静态成员,35,例4.7静态成员应用实例,publicclassStudentprivateintIDBase=20080000;privateintID;publicstaticintStudentNumber;/只能被Student类引用的静态数据成员publicstringName;publicstringSex;publicintAge;publicstringHome;publicStudent(stringname,stringsex,intage,stringhome)/构造函数StudentNumber+;/每创建一个Student类的实例,自动加1this.ID=IDBase+StudentNumber;/自动生成学生的学号this.Name=name;/this.Name是类的字段,name是构造函数的参数this.Sex=sex;this.Age=age;this.Home=home;publicstringgetStudentInfo()StringInfo=;Info+=学号:+ID.ToString()+;Info+=姓名:+Name+;Info+=性别:+Sex+;Info+=年龄:+Age.ToString()+;Info+=籍贯:+Home+n;returnInfo;publicstaticintgetStudentNumber()/只能被Student类引用的静态方法returnStudentNumber;,36,例4.7静态成员应用实例,publicclassStudentprivateintIDBase=20080000;privateintID;publicstaticintStudentNumber;/只能被Student类引用的静态数据成员publicstringName;publicstringSex;publicintAge;publicstringHome;,定义数据成员,37,例4.7静态成员应用实例,publicclassStudentpublicStudent(stringname,stringsex,intage,stringhome)/构造函数StudentNumber+;/每创建一个Student类的实例,自动加1this.ID=IDBase+StudentNumber;/自动生成学生的学号this.Name=name;/this.Name是类的字段,name是构造函数的参数this.Sex=sex;this.Age=age;this.Home=home;,定义构造函数,38,例4.7静态成员应用实例,publicclassStudentpublicstringgetStudentInfo()StringInfo=;Info+=学号:+ID.ToString()+;Info+=姓名:+Name+;Info+=性别:+Sex+;Info+=年龄:+Age.ToString()+;Info+=籍贯:+Home+n;returnInfo;publicstaticintgetStudentNumber()/只能被Student类引用的静态方法returnStudentNumber;,定义方法,39,例4.7静态成员应用实例,privatevoidbutton1_Click(objectsender,EventArgse)StudentStu1=newStudent(刘飞翔,男,25,上海);StudentStu2=newStudent(王虹桥,女,27,北京);StudentStu3=newStudent(杨柳青,男,22,深圳);label1.Text=学生总数:+Student.getStudentNumber().ToString()+n;label1.Text+=Stu1.getStudentInfo();label1.Text+=Stu2.getStudentInfo();label1.Text+=Stu3.getStudentInfo();,40,4.4类的继承,继承(inheritance):从一个已经存在的类中获得公有数据成员和方法成员,从而创建新的类通过继承实现代码的共享,可以提高开发效率,并且有助于减少错误Microsoft在.NET中提供了内容丰富的类库程序员可以创建自定义的类,41,4.4.1继承的实现,publicclass类名:基类/派生类类体,42,继承的特点,新的类可以从现有类库中继承。基类的私有成员只能被基类的方法访问,而不能被它所派生的子类的方法访问。在建立子类的实例时,先调用基类的构造函数来初始化派生类对象中的基类成员,接着执行派生类成员对象的构造函数,最后调用派生类构造函数。派生类的对象可以作为基类的对象处理,即派生类对象可以访问基类的公有成员,也允许将派生类对象赋值给基类对象。,43,4.4.2覆盖,在类的继承中,如果子类中声明了与基类相同名称的方法,并且使用了相同的签名(参数个数、参数类型、返回值等),就称派生类的成员覆盖了基类中的成员。,44,覆盖的实现,在基类中声明方法时,使用virtual关键字在子类中声明方法时,使用override关键字,45,覆盖与重载概念的比较,46,例4.8继承与覆盖的应用,publicclassPerson/新创建的自定义类Personpublicstringname,sex;publicvirtualstringtalk()/使用virtual定义talk()方法,允许覆盖return朋友们好!;,47,例4.8继承与覆盖的应用,publicclassStudent:Person/以Person为基类,创建了Student类publicintgrade;/派生类中添加的数据成员publicstringmajor;publicclassTeacher:Person/以Person为基类,创建了Teacher类publicstringCourse,Department;/派生类中添加的数据成员publicoverridestringtalk()/使用override对基类中talk()方法形成覆盖return同学们好!;,48,例4.8继承与覆盖的应用,privatevoidbutton1_Click(objectsender,EventArgse)if(comboBox1.Text=教师)Teacherteach1=newTeacher();=textBox1.Text;teach1.sex=textBox2.Text;teach1.Course=textBox3.Text;teach1.Department=textBox4.Text;label1.Text=teach1.talk()+n我叫+;label1.Text+=,是+teach1.Department+的+teach1.Course;elseStudentstu1=newStudent();=textBox1.Text;stu1.sex=textBox2.Text;stu1.grade=int.Parse(textBox3.Text);stu1.major=textBox4.Text;label1.Text+=stu1.talk()+n我叫+;label1.Text+=,是+stu1.grade+级+stu1.major+专业学生;,49,例4.8继承与覆盖的应用,privatevoidcomboBox1_SelectedValueChanged(objectsender,EventArgse)if(comboBox1.Text=教师)label4.Text=职称:;label5.Text=部门:;elselabel4.Text=年级:;label5.Text=专业:;textBox1.Text=;textBox2.Text=;textBox3.Text=;textBox4.Text=;label1.Text=;,50,例4.8继承与覆盖的应用,51,继承与覆盖的补充应用实例,usingSystem;usingSystem.Text;namespaceOverrideTestclassProgram:CountValuedoublesum=1;staticvoidMain(stringargs)constintnum=5;doubledblArray=newdoublenum;Console.WriteLine(请输入0个数组元素的值:,num);for(inti=0;i5;i+)doubleiNumber=double.Parse(Console.ReadLine();dblArrayi=iNumber;ProgramcallCount=newProgram();callCount.CountResult(dblArray);newpublicvoidCountResult(doubledblArray)for(inti=0;idblArray.Length;i+)sum*=dblArrayi;Console.WriteLine(数组中值的积=0,sum);,52,覆盖实例,classCountValuedoublesum=0.0;publicvoidCountResult(doubledblArray)for(inti=0;idblArray.Length;i+)sum+=dblArrayi;Console.WriteLine(数组中值的和=0,sum);,53,4.5命名空间,54,命名空间的作用,命名空间类的资源管理器利用命名空间对类进行逻辑分组,形成树形结构,55,控制台应用程序,usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1classProgramstaticvoidMain(stringargs)Console.WriteLine(同学们好!);,默认引用的命名空间,56,控制台应用程序,/usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSyst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论