版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,2,本章教学目标,理解类和对象的基本概念 掌握如何在C#中创建自定义类 掌握为自定义类设置属性和方法的操作,理解静态成员和静态方法 理解方法重载和构造函数重载的概念 理解类的继承和覆盖,3,4.1 面向对象概述,对象(object) 状态 行为 标识(与其他对象的区别) 类(class)相同性质对象的抽象 属性 方法 封装(encapsulation) 方法与数据合并到一个类中 控制方法与数据的可访问性 消息(message),4,4.1.1 类的创建,访问修饰符 class 类名称 :基类 ,接口列表 字段声明 构造函数 方法 事件 类访问修饰符:internal public seal
2、ed abstract,5,在集成开发环境中新建自定义类,这种方法是把自定义类作为一个单独的文件,6,在应用程序中添加新的自定义类,7,自定义类的框架代码,名为Person.cs的自定义类文件,8,4.1.2 字段的定义,访问修饰符 数据类型 变量声明列表; class Person public string name; public string sex; ,9,例4.1 声明和引用名为Person的类,using System; using System.Windows.Forms; namespace ex4-01 public partial class Form1 : Form/通
3、过继承创建了Form1类 public Form1() InitializeComponent(); private void Form1_Click(object sender, EventArgs e) Person student1 = new Person();/创建了Person类的第一个实例 = 高山;/为第一个实例student1的字段赋值 student1.sex = 男; label1.Text += student1.sex + 同学 + + 说:朋友们好!nn; Person student2 = new Perso
4、n();/创建了Person类的第二个实例 = 吕蒙;/为第二个实例student2的字段赋值 student2.sex = 女; label1.Text += student2.sex + 同学 + + 说:朋友们好!nn; public class Person/声明了名为Person的类 public string name, sex;/声明了Person类的字段 ,10,4.1.3 属性的定义和访问,访问修饰符 数据类型 属性名 get/读取属性值的访问器 /可执行代码 return ; set/设置属性值的访问器 /可执行代码
5、/表达式(可以使用关键字value) ,11,例4.2 引用具有公有字段和属性的对象,public class Person/定义Person类的代码 public string name;/公有字段 private string mysex;/私有字段 public string sex/定义一个既可读又可写的属性sex get/读取属性值 return mysex; set/设置属性值 if (value = 男 | value = 女)/若sex属性赋值为“男”或“女” mysex = value;/把属性赋值保存到mysex else/若sex属性赋值为其它 mysex = 性别保密;
6、/把“性别保密”赋值保存到mysex ,12,例4.2 引用具有公有字段和属性的对象,public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) Person student1 = new Person(); /创建Person类的实例 = textBox1.Text;/接收用户输入的姓名值,赋给公有字段 student1.sex = textBox2.Text;/接收用户输
7、入的性别值,赋给sex属性 label3.Text = student1.sex + 同学 + + 说:朋友们好!; ,13,4.1.4 方法的定义和调用,方法(method):包含在类体中的函数成员之一,用来执行某些预定义的操作 。,14,方法的定义,方法的定义的语法格式如下: 访问修饰符 返回值类型 方法名(参数列表) 语句序列; ,15,说明,返回值类型指明调用方法后返回结果的数据类型,可以是普通数据类型,也可以是类或结构。 方法名是用户为方法定义的名称。 形式参数列表,指明调用方法所需的参数个数和数据类型,多个参数之间使用逗号进行分隔。如果调用方法不需要参数
8、,圆括号也不能省略。 如果方法不要求返回值,返回值类型定义为void,可以省略return语句。如果返回值类型不为void,则方法中必须至少有一个return语句。,16,方法的调用,方法的调用的格式如下: 对象名.方法名(实际参数表);,17,方法调用时的参数传递,值参数 实际参数和形式参数各自占用不同的内存空间,只把实际参数的值复制给对应的形式参数,因此在方法中的代码执行期间形式参数值的改变对实际参数无任何影响 引用参数(ref) 实际参数和形式参数使用的是相同的内存单元,如果在方法代码执行期间形式参数值发生了改变,实际参数的值就会发生相同的改变 输出参数(out) 参量参数 (数组),1
9、8,例4.3 引用具有字段和方法的Person对象,public class Person public string name;/公有字段 private string mysex;/私有字段 public string sex/定义一个既可读又可写的属性sex get/读取属性值 return mysex; set/设置属性值 if (value = 男 | value = 女)/若sex属性赋值为“男”或“女” mysex = value;/把属性赋值保存到mysex else/若sex属性赋值为其它 mysex = 性别保密;/把“性别保密”赋值保存到mysex public stri
10、ng talk(string word)/定义具有形式参数word的方法 if (word = 自我介绍) return 我是一个学生。; else if (word = 问候) return 朋友们好!; else return 我对各位的敬仰如滔滔江水; ,19,例4.3 引用具有字段和方法的Person对象,public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) Person student1
11、 = new Person(); = textBox1.Text; student1.sex = textBox2.Text; label4.Text = student1.sex + 同学 + + 说:; label4.Text += student1.talk(comboBox1.Text); /调用对象的talk()方法 ,20,4.1.5 方法的递归调用,递归(recursion),就是通过一个对象自身的结构来描述或部分描述该对象。 在C#程序中,递归调用是指在方法中直接或间接地调用方法本身。 一个方法在执行时直接调用方法本身,称
12、为直接递归; 如果方法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 利用递归方法计算阶乘,private void button1_Click(object sender, EventArgs e) label2.Text = 计算结果:n; int n = int.Parse(textBox1.Tex
13、t); for (int i = 1; i = n; i+) label2.Text += i.ToString() + != + factorial(i) + n; public int factorial(int num)/计算阶乘的递归函数 if (num = 0 | num = 1)/递归结束条件 return 1; else return num * factorial(num - 1);/实现递归的关键语句 ,23,4.2 重载,方法的重载 (overloading) 在同一个类中,可以定义多个名称相同,但参数不同的方法,当程序中按名称调用这样的方法时,编译器将根据参数的个数、类型
14、和顺序,选择执行与之匹配的方法。 MessageBox.Show()方法的重载形式,24,例4.5 引用Person类的方法重载,public class Person/定义Person类拥有可以重载的方法 public string name;/公有字段 private string mysex;/私有字段 public string sex/定义一个既可读又可写的属性sex get/读取属性值的访问器 return mysex; set/设置属性值的访问器 if (value = 男 | value = 女)/若sex属性赋值为“男”或“女” mysex = value;/把属性赋值保存到
15、mysex else/若sex属性赋值为其它 mysex = 性别保密;/把“性别保密”赋值保存到mysex public string talk()/没有参数的talk()方法 return 呵呵我很激动,不知道该说什么!; public string talk(string word) /有一个参数的talk()方法 if (word = 自我介绍) return 我是一个学生。; else if (word = 问候) return 朋友们好!; else return 我对各位的敬仰如滔滔江水; ,25,实现方法重载的代码,public string talk()/没有参数的talk(
16、)方法 return 呵呵我很激动,不知道该说什么!; public string talk(string word) /有一个参数的talk()方法 if (word = 自我介绍) return 我是一个学生。; else if (word = 问候) return 朋友们好!; else return 我对各位的敬仰如滔滔江水; ,26,例4.5 引用Person类的方法重载,private void button1_Click(object sender, EventArgs e) Person student1 = new Person(); = text
17、Box1.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)用来在创建对象时进行初始化操作。
18、通过new运算符创建对象时,就会自动调用构造函数,以确保每一个对象在被使用之前都已经进行了必要的初始化。,28,构造函数的特点,构造函数的命名必须和类名完全相同; 每个类至少有一个构造函数,如果类定义的代码中没有构造函数,系统会自动地提供一个默认的不带参数的构造函数; 一个类可以有多个构造函数,根据其参数的个数或类型的不同,实现构造函数的重载; 构造函数不包含任何返回值,也不能用void来修饰; 构造函数一般使用访问修饰符public,以便在其它函数中可以创建该类的实例。,29,例4.6 在Person类中定义构造函数的重载,public class Person public string
19、name, sex; public Person(string myname, string mysex)/具有两个参数的构造函数 = myname;/这里的this指对象本身 this.sex = mysex; public Person(string myname)/具有一个参数的构造函数 = myname; this.sex = 性别保密; public Person()/没有参数的构造函数 = 无名氏; this.sex = 性别保密; public string talk(string word)/具有一个参数的talk()
20、方法 if (word = 问候) return 朋友们好!nn; else return 我是一个学生!nn; public string talk()/没有参数的talk()方法 return 呵呵我很激动,不知道该说什么好了!nn; ,30,例4.6 在Person类中定义构造函数的重载,public Person(string myname)/具有一个参数的构造函数 = myname; this.sex = 性别保密; public Person()/没有参数的构造函数 = 无名氏; this.sex = 性别保密; ,31,例4.6 在Pers
21、on类中定义构造函数的重载,private void Form1_Click(object sender, EventArgs e) Person student1 = new Person();/调用不带参数的构造函数 label1.Text += student1.sex + 同学 + + 说:; label1.Text += student1.talk(问候); Person student2 = new Person(王雪蕊, 女);/调用带两个参数的构造函数 label1.Text += student2.sex + 同学 +
22、+ 说:; label1.Text += student2.talk(自我介绍); Person student3 = new Person(谢俊鹏);/调用带一个参数的构造函数 label1.Text += student3.sex + 同学 + + 说:; label1.Text += student3.talk(); ,32,4.3 类的静态成员,静态成员使用访问修饰符static定义类的成员 静态字段 静态方法 主要用于解决数据共享问题 静态成员和非静态成员之间的区别: 静态成员属于类 非静态成员属于对象,33,4.3.1 静态数据成员,类的所有对象共享的成
23、员,使用访问修饰符static定义 例如: class Student/定义Student类 public static int StudentNumber; /静态数据成员 public string Name; public string Sex; public int Age; public string Home; ,对于每个具体的学生对象来说,没有必要都存储一个学生总人数字段,34,4.3.2 静态方法,使用访问修饰符static定义的方法 静态方法属于类,引用静态方法时应该使用类名,而不是使用对象名 例如: Console.WriteLine() Console.Read() 在静
24、态方法的实现中,不能直接引用类中声明的非静态成员,但可以引用类中声明的静态成员,35,例4.7 静态成员应用实例,public class Student private int IDBase = 20080000; private int ID; public static int StudentNumber;/只能被Student类引用的静态数据成员 public string Name; public string Sex; public int Age; public string Home; public Student(string name, string sex, int ag
25、e, string home)/构造函数 StudentNumber+; /每创建一个Student类的实例,自动加1 this.ID = IDBase + StudentNumber;/自动生成学生的学号 this.Name = name;/this.Name是类的字段, name是构造函数的参数 this.Sex = sex; this.Age = age; this.Home = home; public string getStudentInfo() String Info = ; Info += 学号: + ID.ToString() + ; Info += 姓名: + Name +
26、 ; Info += 性别: + Sex + ; Info += 年龄: + Age.ToString() + ; Info += 籍贯: + Home + n; return Info; public static int getStudentNumber()/只能被Student类引用的静态方法 return StudentNumber; ,36,例4.7 静态成员应用实例,public class Student private int IDBase = 20080000; private int ID; public static int StudentNumber;/只能被Stude
27、nt类引用的静态数据成员 public string Name; public string Sex; public int Age; public string Home; ,定义数据成员,37,例4.7 静态成员应用实例,public class Student public Student(string name, string sex, int age, string home)/构造函数 StudentNumber+; /每创建一个Student类的实例,自动加1 this.ID = IDBase + StudentNumber;/自动生成学生的学号 this.Name = name
28、;/this.Name是类的字段, name是构造函数的参数 this.Sex = sex; this.Age = age; this.Home = home; ,定义构造函数,38,例4.7 静态成员应用实例,public class Student public string getStudentInfo() String Info = ; Info += 学号: + ID.ToString() + ; Info += 姓名: + Name + ; Info += 性别: + Sex + ; Info += 年龄: + Age.ToString() + ; Info += 籍贯: + Ho
29、me + n; return Info; public static int getStudentNumber()/只能被Student类引用的静态方法 return StudentNumber; ,定义方法,39,例4.7 静态成员应用实例,private void button1_Click(object sender, EventArgs e) Student Stu1 = new Student(刘飞翔, 男, 25, 上海); Student Stu2 = new Student(王虹桥, 女, 27, 北京); Student Stu3 = new Student(杨柳青, 男,
30、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中提供了
31、内容丰富的类库 程序员可以创建自定义的类,41,4.4.1 继承的实现,public class 类名 :基类 /派生类类体 ,42,继承的特点,新的类可以从现有类库中继承。 基类的私有成员只能被基类的方法访问,而不能被它所派生的子类的方法访问。 在建立子类的实例时,先调用基类的构造函数来初始化派生类对象中的基类成员,接着执行派生类成员对象的构造函数,最后调用派生类构造函数。 派生类的对象可以作为基类的对象处理,即派生类对象可以访问基类的公有成员,也允许将派生类对象赋值给基类对象。,43,4.4.2 覆盖,在类的继承中,如果子类中声明了与基类相同名称的方法,并且使用了相同的签名(参数个数、参数
32、类型、返回值等),就称派生类的成员覆盖了基类中的成员。,44,覆盖的实现,在基类中声明方法时,使用virtual关键字 在子类中声明方法时,使用override关键字,45,覆盖与重载概念的比较,46,例4.8 继承与覆盖的应用,public class Person/新创建的自定义类Person public string name, sex; public virtual string talk()/使用virtual定义talk()方法,允许覆盖 return 朋友们好!; ,47,例4.8 继承与覆盖的应用,public class Student : Person/以Person为基
33、类,创建了Student类 public int grade;/派生类中添加的数据成员 public string major; public class Teacher : Person/以Person为基类,创建了Teacher类 public string Course, Department;/派生类中添加的数据成员 public override string talk()/使用override对基类中talk()方法形成覆盖 return 同学们好!; ,48,例4.8 继承与覆盖的应用,private void button1_Click(object sender, Event
34、Args e) if (comboBox1.Text = 教师) Teacher teach1 = new Teacher(); = 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; else
35、Student stu1 = new Student(); = 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 继承与覆盖的应用,private void comboBox1_Selecte
36、dValueChanged(object sender, EventArgs e) if (comboBox1.Text = 教师) label4.Text = 职称:; label5.Text = 部门:; else label4.Text = 年级:; label5.Text = 专业:; textBox1.Text = ; textBox2.Text = ; textBox3.Text = ; textBox4.Text = ; label1.Text = ; ,50,例4.8 继承与覆盖的应用,51,继承与覆盖的补充应用实例,using System; using System.Tex
37、t; namespace OverrideTest class Program : CountValue double sum = 1; static void Main(string args) const int num = 5; double dblArray = new doublenum; Console.WriteLine(请输入0个数组元素的值:, num); for (int i = 0; i 5; i+) double iNumber = double.Parse(Console.ReadLine(); dblArrayi = iNumber; Program callCou
38、nt = new Program(); callCount.CountResult(dblArray); new public void CountResult(double dblArray) for (int i = 0; i dblArray.Length; i+) sum *= dblArrayi; Console.WriteLine(数组中值的积=0, sum); ,52,覆盖实例,class CountValue double sum = 0.0; public void CountResult(double dblArray) for (int i = 0; i dblArray
39、.Length; i+) sum += dblArrayi; Console.WriteLine(数组中值的和=0, sum); ,53,4.5 命名空间,54,命名空间的作用,命名空间类的资源管理器 利用命名空间对类进行逻辑分组,形成树形结构,55,控制台应用程序,using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 class Program static void Main(string args) Console.WriteLine(同学们好!); ,默认引用的命名空
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2029年中国船舶制造行业市场发展前瞻及投资战略研究报告
- 2024-2029年中国数据中心RFID行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 2024-2029年中国手势控制接口行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 2024-2029年中国平台式扫描仪行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 2024-2029年中国实木复合板行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 2024-2029年中国基于人工智能的安全行业市场现状供需分析及市场深度研究发展前景及规划战略投资分析研究报告
- 胶印产业发展分析及发展趋势与投资前景预测报告(2024-2030)
- 电梯电缆张力计行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告(2024-2030)
- 玻璃纤维隔音屏障行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告(2024-2030)
- 2024-2029年鸡尾酒项目可行性研究报告
- 2022年09月广西广播电视技术中心度公开招考50名工作人员笔试题库含答案解析
- 化工过程安全管理解读fd
- 初一家长会班主任发言稿
- 铁路建设施工单位管理之首件工程评估验收实施办法 模版
- NX75三维PMI标注培训
- 公司董事会对经理层授权管理办法
- 2022年景区IP行业深度分析报告
- 桩机操作工考试(重点)题库200题(含答案)
- IBM-三一重工业绩指标体系
- 工程勘察设计收费标准计价格(200210号)
- 苏科版五年级下册《劳动》全一册全部课件(共11节)
评论
0/150
提交评论