1本章教学目标n理解类和对象的基本概念n掌握如何在C#中创建自定义类n掌握为自定义类设置属性和方法的操作,理解静态成员和静态方法n理解方法重载和构造函数重载的概念n理解类的继承和覆盖24.1 面向对象概述n对象(object) ¡ 状态 ¡ 行为 ¡ 标识(与其他对象的区别) n类(class)——相同性质对象的抽象 ¡ 属性 ¡ 方法 ¡ 封装(encapsulation)n方法与数据合并到一个类中n控制方法与数据的可访问性 n消息(message)34.1.1 类的创建[访问修饰符] class 类名称 [:基类] [,接口列表] {[字段声明][构造函数][方法][事件]}类访问修饰符:internal public sealed abstract4在集成开发环境中新建自定义类 这种方法是把自 定义类作为一个 单独的文件5在应用程序中添加新的自定义类 6自定义类的框架代码 名为Person.cs的自定义类文件74.1.2 字段的定义[访问修饰符] 数据类型 变量声明列表;class Person{public string name;public string sex;} 8例4.1 声明和引用名为Person的类using System;using System.Windows.Forms;namespace ex4-01{public partial class Form1 : Form//通过继承创建了Form1类{public Form1(){InitializeComponent();}private void Form1_Click(object sender, EventArgs e){Person student1 = new Person();//创建了Person类的第一个实例student1.name = “高山“;//为第一个实例student1的字段赋值student1.sex = “男“;label1.Text += student1.sex + “同学“ + student1.name + “说:朋友们好!\n\n“;Person student2 = new Person();//创建了Person类的第二个实例student2.name = “吕蒙“;//为第二个实例student2的字段赋值student2.sex = “女“;label1.Text += student2.sex + “同学“ + student2.name + “说:朋友们好!\n\n“;}}public class Person//声明了名为Person的类{public string name, sex;//声明了Person类的字段}}94.1.3 属性的定义和访问[访问修饰符] 数据类型 属性名 { get//读取属性值的访问器 { //可执行代码 return ; } set//设置属性值的访问器 { //可执行代码 //表达式(可以使用关键字value) } }10例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;//把属性赋值保存到mysexelse//若sex属性赋值为其它mysex = “性别保密“;//把“性别保密”赋值保存到mysex}} } 11例4.2 引用具有公有字段和属性的对象 public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Person student1 = new Person(); //创建Person类的实例student1.name = textBox1.Text;//接收用户输入的姓名值,赋给公有字段student1.sex = textBox2.Text;//接收用户输入的性别值,赋给sex属性label3.Text = student1.sex + “同学“ + student1.name + “说:朋友们好!“;}}124.1.4 方法的定义和调用n方法(method):包含在类体中的函数成员之一,用来执行某些预定义的操作 。
13方法的定义方法的定义的语法格式如下:[访问修饰符] 返回值类型 方法名(参数列表){语句序列;}14说明n返回值类型指明调用方法后返回结果的数据类型,可以是普通数据类型,也可以是类或结构n方法名是用户为方法定义的名称n形式参数列表,指明调用方法所需的参数个数和数据类型,多个参数之间使用逗号进行分隔如果调用方法不需要参数,圆括号也不能省略n如果方法不要求返回值,返回值类型定义为void,可以省略return语句如果返回值类型不为void,则方法中必须至少有一个return语句15方法的调用 方法的调用的格式如下:对象名.方法名(实际参数表);16方法调用时的参数传递 n值参数¡ 实际参数和形式参数各自占用不同的内存空间,只把 实际参数的值复制给对应的形式参数,因此在方法中 的代码执行期间形式参数值的改变对实际参数无任何 影响 n引用参数(ref)¡ 实际参数和形式参数使用的是相同的内存单元,如果 在方法代码执行期间形式参数值发生了改变,实际参 数的值就会发生相同的改变 n输出参数(out)n参量参数 (数组)17例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;//把属性赋值保存到mysexelse//若sex属性赋值为其它mysex = “性别保密“;//把“性别保密”赋值保存到mysex}}public string talk(string word)//定义具有形式参数word的方法{if (word == “自我介绍“)return “我是一个学生。
else if (word == “问候“)return “朋友们好!“;elsereturn “我对各位的敬仰如滔滔江水……“;}}18例4.3 引用具有字段和方法的Person对象 public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){Person student1 = new Person();student1.name = textBox1.Text;student1.sex = textBox2.Text;label4.Text = student1.sex + “同学“ + student1.name + “说:“;label4.Text += student1.talk(comboBox1.Text); //调用对象的talk()方法}}194.1.5 方法的递归调用递归(recursion),就是通过一个对象自身 的结构来描述或部分描述该对象在C#程序中,递归调用是指在方法中直接或 间接地调用方法本身。
n一个方法在执行时直接调用方法本身,称 为直接递归; n如果方法A在执行时调用方法B,而方法B 又调用方法A,则称为间接递归 20例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 21例4.4 利用递归方法计算阶乘private void button1_Click(object sender, EventArgs e) {label2.Text = “计算结果:\n“;int n = int.Parse(textBox1.Text);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;elsereturn num * factorial(num - 1);//实现递归的关键语句 }224.2 重载n方法的重载 (overloading)¡ 在同一个类中,可以定义多个名称相同, 但参数不同的方法,当程序中按名称调用 这样的方法时,编译器将根据参数的个数 、类型和顺序,选择执行与之匹配的方法 。
¡ MessageBox.Show()方法的重载形式 23例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;//把属性赋值保存到mysexelse//若sex属性赋值为其它mysex = “性别保密“;//把“性别保密”赋值保存到mysex}}public string talk()//没有参数的talk()方法{return “呵呵……我很激动,不知道该说什么!“;}public string talk(string word) //有一个参数的talk()方法{if (word == “自我介绍“)return “我是一个学生。
else if (word == “问候“)return “朋友们好!“;elsereturn “我对各位的敬仰如滔滔江水……“;}}24实现方法重载的代码public string talk()//没有参数的talk()方法{return “呵呵……我很激动,不知道该说什么!“;}public string talk(string word) //有一个参数的talk()方法{if (word == “自我介绍“)return “我是一个学生else if (word == “问候“)return “朋友们好!“;elsereturn “我对各位的敬仰如滔滔江水……“;}25例4.5 引用Person类的方法重载 private void button1_Click(object sender, EventArgs e){Person student1 = new Person();student1.name = textBox1.Text;student1.sex = te。