1、学习情景7Visual C#面向对象程序设计面向对象面向对象的软件开发技术是当今计算机技术发展的重要成果和趋势之一。C#是完全面向对象的程序设计语言是完全面向对象的程序设计语言。封装性、继承性和多态性封装性、继承性和多态性是面向对象的特点。2023-2-112C#程序设计实用教程7.1 类和对象类和对象 数据成员成成员员方方法法对象对象:桑塔纳桑塔纳对象特征对象特征:黑色黑色 200020002.4T 2.4T 上海大众上海大众动态特征动态特征:载人载人类类:汽车汽车属性属性:颜色颜色 型号型号 马力马力 生产厂家生产厂家服务服务:运输运输数据值执执行行的的操操作作类与对象的关系示例类与对象的
2、关系示例7.1 类和对象类和对象类:是一种抽象的数据类型,它是所有具有一定共性的对象的抽象。本质上可以认为是对对象的描述,是创建对象的“模板”。类的某一个对象则被称为是类的一个实例,是类的实例化结果。对象类实例化抽象课堂讨论课堂讨论 先有对象还是先有类?应该先定义类才可以从类的定义声明对象应该先定义类才可以从类的定义声明对象。7.3 类的定义类的定义格式为:格式为:类修饰符 class 类名类名:基类类名 类体类体 关键字关键字合法的标识符合法的标识符字段字段(成员变量成员变量)方法方法1.声明字段声明字段(成员变量成员变量)与普通变量的声明格式相同。与普通变量的声明格式相同。在类体中,字段声
3、在类体中,字段声明的位置没有特殊要求,习惯上将字段声明在类体明的位置没有特殊要求,习惯上将字段声明在类体中的最前面,以便于阅读。中的最前面,以便于阅读。7.3 类的定义类的定义 定义简单的学生类,包含姓名和年龄两项定义简单的学生类,包含姓名和年龄两项学生信息,并能输出。学生信息,并能输出。class Student /字段声明字段声明 public string strName;public int nAge;/方法方法 public void pri()Console.Write(姓名为:姓名为:0,年龄为,年龄为1,strName,nAge);添加构造方法,添加构造方法,完成字段初始化完成
4、字段初始化 例例7-17.3 类的定义 在哪儿书写类的代码?在哪儿书写类的代码?与你的源代码文件在一块,同一个命名空间与你的源代码文件在一块,同一个命名空间(namespace)下。下。C#允许在一个类中嵌套另一个类的定义。允许在一个类中嵌套另一个类的定义。建议建议将类书写在另外一个将类书写在另外一个.cs文件中。文件中。7.3 类的定义类的定义-创建类的对象创建类的对象 在 C#中,我们使用 new 运算符来创建类的对象。定义定义StudentStudent类的对象类的对象 Student stu=new Student();类名类名 对象名对象名=new 类名类名();实例化对象实例化对象
5、 引用对象成员变量的语法形式为:引用对象成员变量的语法形式为:对象名对象名.成员变量名成员变量名(成员方法成员方法);例如:例如:stu.strName;stu.nAge;stu.pri();访问对象成员访问对象成员 7-2,创建对象创建对象class Student /字段 public string strName;public int nAge;public void PintInfo()Console.Write(姓名为:0的学生年龄为:1,strName,nAge);class test static void Main(string args)Student stu=new Stu
6、dent();stu.strName=张三;stu.nAge=19;stu.PintInfo();编写一个矩形类Rect,包含:2个成员变量:长、宽 2个方法:面积方法area,周长方法cir,分别用于计算矩形的面积和周长。创建一个长4,宽5的矩形对象,并分别计算矩形的面积和周长。练练 习习12 分钟分钟编写一个课程类Cource,包含:3个成员变量:课程编号(cNumber)、课程名(cName)和学分数(cUnit);1个方法:printCourceInfo:用于输出课程的相关信息;创建一个Cource的对象C#,其中课程编号为:030517,课程名“C#程序设计”,学分为6,输出该课程信
7、息。练练 习习12 分钟分钟 7.3 类的定义class student public string name;/姓名姓名 private int age;/年龄年龄 private string idNumber;/身份证号身份证号static void Main(string args)student myStudent=new student();myStudent.name=张三张三;myStudent.age=20;私有成员私有成员 公有成员公有成员 实例化一个对象实例化一个对象 可以访问可以访问 无法访问编译错误无法访问编译错误 表表7.1 7.1 类访问修饰符类访问修饰符访问修饰
8、符访问修饰符意意 义义publicpublic(公有)(公有)类可以在其他名字空间访问类可以在其他名字空间访问internalinternal(内部)(内部)类只能为所在名字空间访问类只能为所在名字空间访问(默认默认此此)()(如果引用类库,则不能访问如果引用类库,则不能访问)表表7.27.2成员访问修饰符成员访问修饰符访问修饰符访问修饰符意意 义义publicpublic(公有)(公有)访问不受限制访问不受限制protectedprotected(受保护)(受保护)访问限于所在类和所在类的派生类访问限于所在类和所在类的派生类internalinternal(内部)(内部)访问限于所在名字空间
9、内(访问限于所在名字空间内(如果引用类库,如果引用类库,则不能访问则不能访问)private(私有)(私有)访问限于访问限于所在类所在类。7.3 类的定义7.4类的方法-方法的定义语法访问修饰符(可选),默认情况下为 private访问修饰符 返回类型(参数列表)/方法主体如果不需要返回任何值,方法可能返回 void 数据类型 方法是类或对象的行为方法是类或对象的行为 对象需要做某些事情,在类中添加方法对象需要做某些事情,在类中添加方法 方法的定义方法的定义合法的标识符合法的标识符不能加不能加“;”用逗号隔开变量定义用逗号隔开变量定义通过通过return返回值返回值 如果返回类型是如果返回类型
10、是void,方法是否需要返回值?,方法是否需要返回值?【例5-9】方法的定义。方法的定义。class Motorcycle public void StartEngine()public void AddGas(int gallons)public int Drive(int miles,int speed)return 0;2023-2-1118C#程序设计实用教程7.4 类的方法类的方法2.调用方法调用方法 从方法被调用的位置,可以分为在方法声明的类内部类内部调用该方法和在类外部类外部调用方法。内部调用语法格式为:方法名方法名(参数列表参数列表)在方法声明的类定义外部调用该方法实际上是通过
11、类声明的对象调用该方法,其格式为:对象名对象名.方法名方法名(参数列表参数列表)例如:组件例如:组件事件方法的事件方法的调用调用7.4 类的方法-方法的参数1.值参数 简单数据类型的参数为值参数,它表明实参与形参之间按值传递。当这个方法被调用时,编译器为值参数分配存储单元,然后将对应的实参的值拷贝到形参中。这种传递方式的好处是在方法中对形参的修改不会影响外部的实参。2023-2-1120C#程序设计实用教程5.4.2 方法的参数【例【例5-14】使用值参数。使用值参数。using System;namespace ValueParameters class MyClass public voi
12、d Swap(int x,int y)int k;k=x;x=y;y=k;2023-2-1121C#程序设计实用教程class Test static void Main()int a=8,b=10;Console.WriteLine(a=0,b=1,a,b);MyClass mycls=new MyClass();mycls.Swap(a,b);Console.WriteLine(a=0,b=1,a,b);程序的运行结果为:a=8,b=10a=8,b=10练练 习习10 分钟分钟7.4 类的方法-方法的参数2.2.引用参数引用参数 用ref修饰符声明的简单数据类型参数为引用参数。引用数据类型
13、作为参数 引用参数并不创建新存储单元,它与实参变量同处一个存储单元。因此,对形参的修改就是对实参变量的修改。2023-2-1122C#程序设计实用教程7.4 类的方法-方法的参数【例【例5-15】使用引用参数。使用引用参数。using System;namespace ReferenceParameters class MyClass public void Swap(ref int x,ref int y)int k;k=x;x=y;y=k;2023-2-1123C#程序设计实用教程 class Test static void Main()int a=8,b=10;Console.Writ
14、eLine(a=0,b=1,a,b);MyClass mycls=new MyClass();mycls.Swap(ref a,ref b);Console.WriteLine(a=0,b=1,a,b);程序的运行结果为:a=8,b=10a=10,b=82023-2-1124C#程序设计实用教程练练 习习10 分钟分钟7-5构造函数构造函数 构造函数是类的一种特殊方法,每次创建类的实例都会调用它。访问修饰符访问修饰符(参数列表参数列表)/构造函数的主体语法:语法:声明构造方法有两个特别要求声明构造方法有两个特别要求:一是构造方法一是构造方法不允许有返回类型不允许有返回类型包括包括void类型类
15、型二是构造方法的名称必须二是构造方法的名称必须与类名相同与类名相同。有以下几点特殊性:构造方法在创建对象时构造方法在创建对象时被自动调用被自动调用。构造方法的构造方法的方法名方法名与与类名相同类名相同。没有返回类型没有返回类型和和返回值返回值。构造方法可以构造方法可以重载重载。通常用通常用public修饰修饰7-5构造函数构造函数7-5构造函数构造函数【例【例5-5】通过构造函数,实现在产生一个学生对象时为其通过构造函数,实现在产生一个学生对象时为其完成起名工作。完成起名工作。using System;public class Student public string strName;/字段
16、 public Student(string _strName)this.strName=_strName;2023-2-1127C#程序设计实用教程 7-5构造函数构造函数class Class1 static void Main(string args)Student s=new Student(张三);Console.WriteLine(s.strName);2023-2-1128C#程序设计实用教程7-5构造函数构造函数练练 习习10 分钟分钟为例为例7_2添加构造方法,完成姓名与添加构造方法,完成姓名与年龄的初始化。年龄的初始化。析构函数析构函数 是用于执行清除操作的特殊方法()0
17、/析构函数的主体 语法语法:Student()示例:7.6 类和类的成员类和类的成员属性属性class Student private static string strName;private static int nAge;public void SetAge(int _nAge)this.nAge=_nAge;public int GetAge()return this.nAge;方法 SetAge(Value)和 GetAge()分别读取和写入学生 Age Student s;s.SetAge(20);int StuAge=s.GetAge()每次都调用 GetId()和 SetId(
18、)方法会很繁琐属性7.6 类和类的成员类和类的成员属性属性class Student public string strName;private int nAge;public int Age get return nAge;set nAge=value;读取 nAge 时调用 将值赋给 nAge 时调用 试一试:创建Student对象,调用属性属性的语法格式为:属性的语法格式为:访问修饰符访问修饰符 属性名属性名 get /读访问器读访问器 /执行体执行体 return;/执行体可任写,但须有执行体可任写,但须有return 语句。语句。set /写访问器写访问器 /执行体执行体 =valu
19、e;/执行体可任写,但须有执行体可任写,但须有value值给某字段语句。值给某字段语句。7.6 类和类的成员类和类的成员属性属性7.6 类和类的成员类和类的成员属性属性访问修饰符 数据类型 属性名get;只读属性只能检索值7.6 类和类的成员类和类的成员属性属性访问修饰符 数据类型 属性名set;只写属性只能赋值 什么是属性什么是属性class Student /姓名姓名 private string name;public string Name get return name;set name=value;返回返回name get用于获取用于获取相应字段的值相应字段的值set用于设置用于设
20、置字段的值字段的值只有只有get时时:只读属性只读属性只有只有set时时:只写属性只写属性get和和set都存在都存在:读写属性读写属性属性的类型和字段类属性的类型和字段类型必须一致。型必须一致。给给name赋值赋值 7.6 类和类的成员类和类的成员属性属性属性是属性是“聪明聪明”的字段,的字段,“特殊特殊”的方法的方法定义属性类似于定义一个方法,但使用属性时定义属性类似于定义一个方法,但使用属性时如同使用一个字段如同使用一个字段class student private string name;private int age;static void Main()student s1=new
21、student();s.age=-13;/错误错误 7.6 类和类的成员类和类的成员属性属性private int age;/年龄年龄public int Age get return age;set if(value 0&value 0&value 100)age=value;else age=18;控制私有字段的可访问性控制私有字段的可访问性 保护内部数据的安全保护内部数据的安全 建议类内部敏感字段使用建议类内部敏感字段使用属性来控制访问属性来控制访问类型可以是各种数据类型,如:对象、数组等等类型可以是各种数据类型,如:对象、数组等等 7.6 类和类的成员类和类的成员属性属性public
22、class Student int age=26;/姓名姓名 private string name;public string Name get return name;set name=value;/信息输出信息输出 public void pr()类的成员类的成员字段字段 属性属性 方法方法 类名类名 7.6 类和类的成员类和类的成员属性属性 如果只提供了如果只提供了get,没有,没有set,这样的属性,这样的属性为只读属性为只读属性 如果只提供了如果只提供了set,没有,没有get,只写属性,只写属性 优点:优点:属性在使用时类似于类的字段,简单属性在使用时类似于类的字段,简单 属性在
23、实现时类似于方法,可以编写代码控制用户属性在实现时类似于方法,可以编写代码控制用户对数据的存、取,增加安全性检查对数据的存、取,增加安全性检查 可以设置只读或只写属性可以设置只读或只写属性 编写学生管理系统中的编写学生管理系统中的Student类类 包含的属性包含的属性 年龄(年龄(0-100)不符合的设为)不符合的设为18 姓名(只读属性)姓名(只读属性)爱好(读写)爱好(读写)给属性赋值并打印出来给属性赋值并打印出来练练 习习10 分钟分钟 课本25页,编写学生类实例。7.7 方法重载方法重载7.7.17.7.1成员方法重载成员方法重载 方法可以重载,即两个或两个以上方法有方法可以重载,即
24、两个或两个以上方法有相同的名称相同的名称。重载后的方法被调用时重载后的方法被调用时,可根据方法的可根据方法的参数个数、类型参数个数、类型来区分来区分应该调用哪个方法。应该调用哪个方法。例如能同时处理整型与浮点型数据的重载方法:例如能同时处理整型与浮点型数据的重载方法:public void max(int a,int b)public void max(float a,float b)public void max(int a,int b,int c)为什么要重载为什么要重载 public int Sum(int para1,int para2)return para1+para2;整形参数,
25、整形参数,返回值整型返回值整型如果想让两个如果想让两个string型、两个型、两个double型相加,怎么做?型相加,怎么做?编写两个不同名字的方法,根据参数的不同调用相应编写两个不同名字的方法,根据参数的不同调用相应不同的方法不同的方法 方法的重载方法的重载 同一个类中添加几个名字相同,参数与返回值不同的方法同一个类中添加几个名字相同,参数与返回值不同的方法 public string Sum(string para1,string para2)return para1+para2;public double Sum(double para1,double para2)return para
26、1+para2;重载的方式重载的方式class Add public string Sum(string para1,string para2)public int Sum(int para1,int para2)基于不同类型参数的重载基于不同类型参数的重载 class Add public int Sum(int para1,int para2)public int Sum(int para1,int para2,int para3)相同类型不同参数个数的重载相同类型不同参数个数的重载 不允许重载方法仅仅是返回值不同不允许重载方法仅仅是返回值不同 编写两个得到最小值的方法,一个方法得到两个数中的最小值,一个方法得到三个数中的最小值。练练 习习10 分钟分钟7.7 方法重载方法重载-构造方法重载构造方法重载 构造函数重载构造函数重载 构造函数名称相同,参数个数或类型不同,从而构成重载。见课本28页学生类设计。2023-2-1149C#程序设计实用教程C#常用基础类常用基础类自学了解:Math类,常用Math方法 Random类,会产生多个随机数 Convert类,常用数据类型转换练练 习习20 分钟分钟Thank You!