第5章面向对象编程基础.ppt

上传人:本田雅阁 文档编号:2257112 上传时间:2019-03-12 格式:PPT 页数:52 大小:600.51KB
返回 下载 相关 举报
第5章面向对象编程基础.ppt_第1页
第1页 / 共52页
第5章面向对象编程基础.ppt_第2页
第2页 / 共52页
第5章面向对象编程基础.ppt_第3页
第3页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第5章面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《第5章面向对象编程基础.ppt(52页珍藏版)》请在三一文库上搜索。

1、第5章 面向对象编程基础,本章要点,通过本章的学习,使读者: 了解并掌握类的概念和定义方法 掌握类的实例对象的创建和使用方法 了解并掌握构造函数的定义和使用方法 理解和掌握方法的参数传递和方法的重载 了解静态成员与实例成员的区别及特点,案例:交通工具,问题: 解决交通工具中客车的一些相关问题 。,交通工具要解决的问题 能显示该车能乘坐的乘客的数量、车轮数量、车牌号和车本身的重量,要求每次速度调整时能显示是否在安全行驶速度的范围内。,类和对象,类是 C# 中的一种结构,是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。用于在程序中模拟现实

2、生活的事物.,对象(Object)是问题域或实现域中某些事物的一个抽象,它反映此事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。,5.2 类,5.2.1 类的声明 类是C#的一种自定义数据类型,其声明格式为: 属性 类修饰符 class 类名 字段声明 构造函数 方法 属性 ,请注意: 类体是以一对大括号开始和结束的,在一对大括号后面可以跟一个分号,也可以省略分号 类体中的成员种类较多,常见的有字段、属性、方法和事件方法(Method) 类的所有成员的声明均需在类体中,class Person private string name; priva

3、te int age; private long ID; public Person(string n, int a, long i) name = n; age = a; ID = i; public void Display() Console.WriteLine(“Name:0“, name); Console.WriteLine(“Age:0“, age); Console.WriteLine(“Name:0“, ID); ,【例5-1】声明一个Person类,包含姓名、年龄和身份证号。,5.2.2 创建类实例,类实例创建格式: 类名 实例名 = new 类名(参数); 例如,创建Pe

4、rson类的实例: Person myTest1 = new Person(“张三”,21,60012); 也可以分两步创建Person类的实例: Person myTest2; MyTest2 = new Person(“张三”,21,60012);,(1) myTest1和myTest2都是类Person的实例化,分配了两块不同的存储空间。但它们的结构相同。 (2) myTest1和myTest2就可以分别访问各自类中的公有类型数据或成员函数。,5.2.3 类成员,类成员包括数据成员和函数成员。,数据成员包括: 类要处理的数据,它包括常数和字段。,函数成员包括: 方法、属性、事件、索引器、

5、运算符、实例构造函数、析构函数和静态构造函数。,类的具体成员有以下类型:, 常量:代表与类相关的常数值,是在类中声明的值不变的变量。 字段:类中的变量,相当于C+中的成员变量。 方法:完成类中各种计算或功能操作。 属性:定义类的值,并对它们提供读写操作。 事件:由类产生的通知,用于说明发生了什么事情。 索引器:又称下标指示器,允许编程人员访问数组时,通过索引器访问类的多个实例。 运算符:定义类的实例能使用的运算符。 构造函数:在类被实例化时首先执行的函数,主要完成对象初始化操作。 析构函数:在对象被销毁之前最后执行的函数,主要完成对象结束时的收尾工作。,【例5-2】创建一个学生类,学生类有年龄

6、字段、年龄属性和所属系部常量,class Student /定义学生类 private int nAge;/定义字段nAge private const string sDepartment=“Computer“;/定义常量sDepartment public int Age /定义属性Age get /获取属性值(字段值) return nAge; set/设置属性值(字段值) this.nAge = value; public string Department/只读属性Department get return sDepartment; ,static void Main(string

7、args) Student s = new Student();/创建对象 s.Age = 20; /设置属性值 Console.WriteLine(s.Age); /获取属性值 Console.WriteLine(s.Department); Console.ReadLine(); ,5.2.4 字段,字段是类成员中最基础也较重要的一个成员,是与对象或类相关联的变量。其作用主要是用于保存与类有关的一些数据。它的声明格式与普通变量的声明格式基本相同,声明位置没有特殊要求,习惯上将字段说明放在类体中的最前面。 定义字段的基本格式为:,访问修饰符 数据类型 字段名,先给出客车类的字段定义,clas

8、s Passtrain /类名为Passtrain (客车) /以下为成员字段- int weight; /此车的重量, private int passengers; /私有成员,标准容纳乘客数 public int wheels; /公有成员,该客车的轮子数 public string plate; /公有成员,车牌号 ,字段解析 客车类模型Passtrain中定义了四个成员,分别用于保存客车的重量、可容纳的乘客数、轮子数和车牌号。 在面向对象程序设计中,类里面的成员在定义时一般都要加上访问控制修饰符,以标志该成员在哪些范围能够被访问得到。 若声明成员时没有使用任何修饰符,则该成员被人为是

9、私有的(private) 。,5.2.5 访问修饰符,(1) public 声明公有成员,对公有成员访问不受限制,可以从类的外部、内部和派生类访问公有成员; (2) private 声明私有成员,私有成员只能被类中的成员访问,外部无法访问。 (3) protected 声明保护成员,保护成员可以被类中成员和派生类访问。 (4) internal 声明内部成员,内部成员只有在同一工程中的文件内才是可访问的。 (5) protected internal 只限于当前项目,或者从该项目的类继承的类才可以访问。,访问修饰符,Teacher 类,private 成员,protected 成员,publi

10、c 成员,internal 成员,Student 类,只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员,不可访问,不可访问,可以访问,注意: 若字段定义前面的访问修饰符没有写出,则计算机会默认认为是私有字段private. 对于公有访问(public)字段,我们可以通过“对象名.字段名”的形式访问,对于私有(private)和保护(protected)是不行的,如对于Passtrain 的对象pss我们可以通过语句pss.wheels = 4;为wheels字段赋值,而字段passengers是不行的。,5.2.6 静态成员与实例成员,1. 当用st

11、atic修饰符声明成员叫静态成员,静态成员属于类,为这个类的所有实例所共享。静态成员只能由类来调用,不能由对象调用。 2. 不用static修饰符声明成员,称为实例成员,实例成员属于类的实例。,【实作任务】 客车类定义最大时速的静态成员 class Passtrain /类名为Passtrain (客车) public static float SMAX = 100; /静态公有字段,最大时速 静态成员访问只能通过类名访问,如: class Test static void Main() Console.WriteLine(“客车类的最大时速为:”+ Passtrain.SMAX); ,【例5

12、-3】声明一个含有静态成员和一个实例成员的Student类,class Student public int SNO; public static int count; public Student(int s) SNO=s; count+; public void display() Console.WriteLine(“count=0,SNO=1“, count, SNO); ,class Program static void Main(string args) Student s1 = new Student( 12); s1.display(); Student s2= new St

13、udent(20); s2.display(); 程序输出结果为: count= 1,SNO=12; count= 2,SNO=20; 说 明: (1) 在本例中,count是静态成员,属于类Student,所以, 每生成一个学生实例,静态成员count就自动增一,记录学生总数。 (2) SNO是实例成员,随实例的不同而不同。,5.5 属性,5.5.1属性的定义和使用 类字段一般定义为私有或受保护的,不容许外界访问。若需要外界访问此字段,可以利用属性提供给外界访问私有或保护字段的途径。通常,创建一个属性包含两个步骤: 声明一个私有字段来存储属性值 编写一个属性声明,为属性值提供访问接口。 声明

14、属性的一般形式为:,访问修饰符 类型名 属性名 get return 私有字段; set 私有字段 = value; ,【例5-15】属性的最基本形式和用法(属性的读写控制),public class Student private string studName; private int studID; public string StudentName get return studName; set studName = value;/value是关键字 public class Test public static void Main(string args) Student Astu

15、dent = new Student(); Astudent.StudentName = “Zhang San”; string aName = Astudent.StudentName; Console.WriteLine(aName); ,5.5.2属性的读写控制,【例5-16】 属性的读写控制。 public class Student string studName;int studID; pulic Student(string strName) studName = strName; public string StudentName get return studName; pu

16、blic class Test public static void Main(string args) Student Astudent = new Student(“Zhang San”); string aName = Astudent.StudentName; Console.WriteLine(aName); ,class Passtrain /类名为Passtrain (客车) /以下为成员字段- int weight; /此车的重量, private int passengers; /私有成员,标准容纳乘客数 public int wheels; /公有成员,该客车的轮子数 pu

17、blic string plate; /公有成员,车牌号 /以下为成员属性- /以下声明公有访问属性以访问私有的weight成员,【实作任务】 客车类的属性声明续 public int Weight get return weight; /提供对weight的读权限 set weight = value; /提供对weight的写权限 /以下声明公有访问属性以访问私有的passengers成员 public int Passengers get return passengers; /提供对passengers的读权限 ,作业1,创建一个表示羚羊的类,并且创建一个该类的对象。 羚羊Antelo

18、pe类至少具有以下成员: exhibitNumber (展厅号) age (年龄) weight (重量) 创建一个Antelope类的对象,然后给它的成员赋值。 输出Antelope对象的所有成员值 2、创建一个类,它存储一个int数据成员MyNumber,并给该数据成员创建属性,当该数据成员被存储时,将其乘以100;当其被读取时,将其除以100。,5.3 构造函数和析构函数,5.3.1 构造函数 构造函数是特殊的成员函数,它主要用于为对象分配空间,完成初始化工作。构造函数特殊性表现在以下几方面。 构造函数的名字必须与类名相同; 构造函数可以带参数,但没有返回值; 构造函数在对象定义时被自动

19、调用; 构造函数也可以重载,但不可以被继承; 如果没有给类定义构造函数,则编译系统会自动生存一个默认的构造函数;,【实作任务】 客车类有参数的构造函数和无参数的构造函数声明 /声明公有含参数的构造方法 /参数we,p,wh,sp分别传递车重,载客量,车轮,车牌号 public Passtrain(int we ,int p,int wh, string sp) weight = we; wheels = wh; passengers = p; plate = sp; Console.WriteLine(“客车类的有参构造函数被调用“); ,【实作任务】续 客车类有参数的构造函数和无参数的构造函

20、数声明 /声明一个不含参数的构造方法 public Passtrain( ) weight = 100; passengers = 20; wheels = 4; plate = “000000“; Console.WriteLine(“客车类的无参构造函数被调用“); ,5.3 构造函数和析构函数,5.3.4 析构函数 析构函数是特殊的成员函数,它主要用于释放类实例。析构函数特殊性表现在以下几方面。 析构函数的名字与类名相同,但它前面加了一个“”符号; 析构函数不能带参数,也没有返回值; 当撤消对象时,析构函数被自动调用; 析构函数不能被继承,也不能重载。 如果没有给类定义析构函数,则编译系

21、统会自动生存一个默认的析构函数;,补充: 类对象的创建,类是抽象的,要使用类定义的功能,就必须实例化类,即创建类的对象。类与对象的关系可以比喻为车型设计和具体的车:类就像车型设计一样说明了车所应该具备的所有属性和功能,但是车型设计并不是车,你不能发动和驾驶车型;对象就象根据车型设计制造出的车,它们都具备车型设计所描述的属性和功能,车是能发动和驾驶的。,补充:类对象的创建,C#使用new运算符来创建类的对象,格式如下: 类名 对象名 = new 类名(参数表); 也可以使用如下两步完成创建类的对象: 类名 对象名; 对象名 = new 类名(参数表); 其中,参数表是可选的,根据类模型提供的构造

22、函数来确定。 声明类相当于定义一个模型,在类定义完毕之后使用new运算符创建类的对象(实例),计算机将为对象(实例)分配内存,并且返回对该对象(实例)的引用。,补充:类对象的创建,采用下面的语句创建Passtrain 对象,并且将那些对象的引用保存到变量pss中: Passtrain pss = new Passtrain ( ); /声明对象的同时实例化 也可以使用如下语句: Passtrain pss; /先声明对象 pss = new Passtrain(); /实例化对象 上面的语句 new Passtrain ( )实例化时计算机会自动调用类Passtrain 的无参构造函数实例化和

23、初始化各个成员。,补充: 类对象的创建,若采用如下语句: Passtrain pss = new Passtrain (1000,20,4,“123456“ ); 说明:此时计算机将会调用类Passtrain 的有参数的构造函数实例化对象,并且将车重1000,车能容纳的人数20,车轮数4和车牌号”123456”按指定的输入进行初始化。,补充:对象成员的引用,补充: 对象成员的引用,注意 创建类的对象、创建类的实例、实例化类等说法是等价的,都说明以类为模板生成了一个对象的操作。 用new创建一个类的对象时,将在计算机中为对象分配一块内存,每一个对象都有不同的内存。代表对象的变量存储的是存放对象的

24、内存的地址。因此,两个不同的对象,即使它们的所有成员的值或代码都相同,它们也是不相等的。就像同一型号的每一辆车都不相同一样,用同一个类创建出来的不同对象也是不同的。,5.4 方法,5.4.1 方法的声明 方法的声明的语法形式:,方法修饰符 返回类型 方法名(形参表) 方法体 ,【例5-6】 在下面程序中,MyArea类定义了两个方法以求三角形和圆的面积,class MyAream public double TangleArea(double a, double h) double s; s = a * h /2 ; return s; public double CircleArea(dou

25、ble r) double s; s = 3.14 * r * r ; return s; ,5.4.2 方法的参数,1值参数 在方法声明时不加修饰的形参数,它表明实参与形参之间按值传递。 【例5-7】 下面的程序演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。,5.4.2 方法的参数,class Program static void Sort(int x, int y, int z) int temp; /将x,y,z按从小到大排序 if (x y) temp = x; x = y; y = temp; if (x z) temp = x; x = z; z = temp;

26、 if (y z) temp = y; y = z; z = temp; Console.WriteLine(“a=0,b=1,c=2“, x, y, z); static void Main(string args) int a, b, c; a = 20; b = 10; c = 5; Sort(a, b, c); Console.WriteLine(“a=0,b=1,c=2“, a, b, c); ,5.4.2 方法的参数,2引用参数 如果调用一个方法,期望能够对传递给它的实际变量进行操作,按值传递是不可能实现的。所以C#用了ref修饰符来解决此类问题,它告诉编译器,实参与形参的传递方式

27、是引用。 引用与值参数不同,引用参数并不创建新的存储单元,它与方法调用中的实参变量同处一个存储单元。因此,在方法内对形参的修改就是对外部实参变量的修改。,【例5-8】将例5-7程序中Sort方法的值参传递方式改成引用参数传递,观察运行结果。,class Myclass public void Sort(ref int x,ref int y,ref int z) int temp; /将x,y,z按从小到大排序 if (x y) temp = x; x = y; y = temp; if (x z) temp = x; x = z; z = temp; if (y z) temp = y; y

28、 = z; z = temp; Console.WriteLine(“a=0,b=1,c=2“, x, y, z); class Program static void Main(string args) Myclass m = new Myclass(); int a, b, c; a = 20; b = 10; c = 5; m.Sort(ref a, ref b, ref c); Console.WriteLine(“a=0,b=1,c=2“, a, b, c); ,5.4.2 方法的参数,3. 输出参数 在参数前加out修饰符的被称为输出参数,它与ref参数很相似,只有一点除外,就是它

29、只能从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。,【例5-9】 求一个数组元素中的最大值、最小值和平均值。,class Myclass public void MaxMinArray(int a,out int max,out int min,out double avg) int sum; sum = max = min = a0; for (int i = 1; i max) max = ai; if (ai min) min = ai; sum += ai; avg = sum / a.Length; cl

30、ass Program static void Main(string args) Myclass m = new Myclass(); int score = 66, 33, 4, 5, 81, 32, 56 ; int smax, smin; double savg; m.MaxMinArray(score, out smax, out smin, out savg); Console.Write(“Max=0,Min=1,Avg=2“,smax,smin,savg); ,5.4.4 方法的重载,1. 参数类型重载的方法 【例5-12】 下面程序定义的Myclass类中含有三个名为abs的

31、方法,它们只是参数类型不同,在Main中调用该方法时编译系统会根据不同的参数类型确定调用哪个方法。,class Myclass public int Myabs(int x) int xabs; if (x = 0) xabs = x; else xabs = -x; return xabs; public float Myabs(float x) float xabs; if (x = 0) xabs = x; else xabs = -x; return xabs; public long Myabs(long x) long xabs; if (x = 0L) xabs = x; els

32、e xabs = -x; return xabs; ,class Program static void Main(string args) Myclass m = new Myclass(); int a = -54; float b = -89.54f; long c = -23456L; Console.WriteLine(“|a|=0,|b|=1, |c|=2“, m.Myabs(a),m.Myabs(b),m.Myabs(c); 运行结果如下:,2. 参数个数重载的方法,class Myclass public float MyArea(float r) return (r * r

33、* 3.14f); public float MyArea(float a,float h) return (a * h * 0.5f); public float MyArea(float a,float b,float h) return (a+b) * h * 0.5f); ,【例5-13】 参数个数的方法重载。,参数个数重载,class Program static void Main(string args) Myclass m = new Myclass(); float r = 1.5f; float a = 2.0f, b = 2.5f, h = 1.2f; Console.W

34、riteLine(“圆面积=0,梯面积=1, 三角面积=2“, m.MyArea(r),m.MyArea(a,b,h), m.MyArea(a,h); 运行结果如下:,作业2,编写一个矩形类,私有数据成员为矩形的长(len)和宽(wid),无参构造函数将len和wid设置为0,有参构造函数设置他们的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。 动物园医学中心需要对动物的相关信息进行管理。为此,需要开发一个描述狮子信息的对象。这些对象包括名字(name)、年龄(age)、体重(weight)和性别(gender)。编写程序,使g

35、ender成为一个方法,以统计用户构造的动物园内各种性别的狮子头数,最后输出。,课堂实训,1设计一个表示猫的类,包括猫的颜色,体重,年龄等数据,具有设置猫的颜色,修改和显示猫的体重,年龄等操作。 2设计一个表示学习成绩的类,至少包括3门课程的成绩,可以设置,显示每门课程的成绩,可以计算,显示平均成绩 3使用方法重载设计一个求面积的类,包括圆、三角形和梯形。并设计一个输入成员方法和输出成员方法。 4编写程序,用来判断学生能否通过某个级别的考试,全部操作在来Grade中实现。要求: (1) 在定义对象时指定学生的姓名和分数。 4个学生的姓名和分数分别为: Wang l00 Zhang 90 Li 52 Zhao 0 (2) 编写一个私有成员方法idPass,判断能否通过。 (3) 编写一个成员方法PrintData输出结果,包含学生姓名、分数、是否能通过。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1