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

上传人:sccc 文档编号:5914437 上传时间:2023-09-03 格式:PPT 页数:52 大小:600.54KB
返回 下载 相关 举报
第5章面向对象编程基础.ppt_第1页
第1页 / 共52页
第5章面向对象编程基础.ppt_第2页
第2页 / 共52页
第5章面向对象编程基础.ppt_第3页
第3页 / 共52页
第5章面向对象编程基础.ppt_第4页
第4页 / 共52页
第5章面向对象编程基础.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

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

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

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

3、;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 类名(参数);例如,创建Person类的实例:Person myTest1=new Person(“张三”,2

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

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

6、rivate 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 args)Student s=new Student();/创建对象 s.Age=20;/设置属性值 Console.WriteLine(s.Age)

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

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

9、能被类中的成员访问,外部无法访问。(3)protected声明保护成员,保护成员可以被类中成员和派生类访问。(4)internal声明内部成员,内部成员只有在同一工程中的文件内才是可访问的。(5)protected internal只限于当前项目,或者从该项目的类继承的类才可以访问。,访问修饰符,Teacher 类,private 成员,protected 成员,public 成员,internal 成员,Student 类,只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员,不可访问,不可访问,可以访问,注意:若字段定义前面的访问修饰符没有写出,则计

10、算机会默认认为是私有字段private.对于公有访问(public)字段,我们可以通过“对象名.字段名”的形式访问,对于私有(private)和保护(protected)是不行的,如对于Passtrain 的对象pss我们可以通过语句pss.wheels=4;为wheels字段赋值,而字段passengers是不行的。,5.2.6 静态成员与实例成员,1.当用static修饰符声明成员叫静态成员,静态成员属于类,为这个类的所有实例所共享。静态成员只能由类来调用,不能由对象调用。2.不用static修饰符声明成员,称为实例成员,实例成员属于类的实例。,【实作任务】客车类定义最大时速的静态成员cl

11、ass Passtrain/类名为Passtrain(客车)public static float SMAX=100;/静态公有字段,最大时速静态成员访问只能通过类名访问,如:class Test static void Main()Console.WriteLine(“客车类的最大时速为:”+Passtrain.SMAX);,【例5-3】声明一个含有静态成员和一个实例成员的Student类,class Student public int SNO;public static int count;public Student(int s)SNO=s;count+;public void dis

12、play()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 Student(20);s2.display();程序输出结果为:count=1,SNO=12;count=2,SNO=20;说 明:(1)在本例中,count是静态成员,属于类Student,所以,每生成一个学生实例,静态成员count就自动增一,记录学生总数。(2)SNO是实例成员,随实例的不同而不

13、同。,5.5 属性,5.5.1属性的定义和使用 类字段一般定义为私有或受保护的,不容许外界访问。若需要外界访问此字段,可以利用属性提供给外界访问私有或保护字段的途径。通常,创建一个属性包含两个步骤:声明一个私有字段来存储属性值 编写一个属性声明,为属性值提供访问接口。声明属性的一般形式为:,访问修饰符 类型名 属性名get return 私有字段;set 私有字段=value;,【例5-15】属性的最基本形式和用法(属性的读写控制),public class Studentprivate string studName;private int studID;public string Stud

14、entName get return studName;set studName=value;/value是关键字public class Testpublic static void Main(string args)Student Astudent=new Student();Astudent.StudentName=“Zhang San”;string aName=Astudent.StudentName;Console.WriteLine(aName);,5.5.2属性的读写控制,【例5-16】属性的读写控制。public class Studentstring studName;in

15、t studID;pulic Student(string strName)studName=strName;public string StudentName get return studName;public class Testpublic static void Main(string args)Student Astudent=new Student(“Zhang San”);string aName=Astudent.StudentName;Console.WriteLine(aName);,class Passtrain/类名为Passtrain(客车)/以下为成员字段-int

16、 weight;/此车的重量,private int passengers;/私有成员,标准容纳乘客数 public int wheels;/公有成员,该客车的轮子数 public string plate;/公有成员,车牌号/以下为成员属性-/以下声明公有访问属性以访问私有的weight成员,【实作任务】客车类的属性声明续public int Weight get return weight;/提供对weight的读权限 set weight=value;/提供对weight的写权限/以下声明公有访问属性以访问私有的passengers成员 public int Passengers get

17、 return passengers;/提供对passengers的读权限,作业1,创建一个表示羚羊的类,并且创建一个该类的对象。羚羊Antelope类至少具有以下成员:exhibitNumber(展厅号)age(年龄)weight(重量)创建一个Antelope类的对象,然后给它的成员赋值。输出Antelope对象的所有成员值2、创建一个类,它存储一个int数据成员MyNumber,并给该数据成员创建属性,当该数据成员被存储时,将其乘以100;当其被读取时,将其除以100。,5.3 构造函数和析构函数,5.3.1 构造函数 构造函数是特殊的成员函数,它主要用于为对象分配空间,完成初始化工作。

18、构造函数特殊性表现在以下几方面。构造函数的名字必须与类名相同;构造函数可以带参数,但没有返回值;构造函数在对象定义时被自动调用;构造函数也可以重载,但不可以被继承;如果没有给类定义构造函数,则编译系统会自动生存一个默认的构造函数;,【实作任务】客车类有参数的构造函数和无参数的构造函数声明/声明公有含参数的构造方法/参数we,p,wh,sp分别传递车重,载客量,车轮,车牌号 public Passtrain(int we,int p,int wh,string sp)weight=we;wheels=wh;passengers=p;plate=sp;Console.WriteLine(客车类的有

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

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

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

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

23、的值或代码都相同,它们也是不相等的。就像同一型号的每一辆车都不相同一样,用同一个类创建出来的不同对象也是不同的。,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(double r)double s;s=3.14*r*r;return s;,5.4.

24、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;if(y z)temp=y;y=z;z=temp;Console.WriteLine(a=0,b=1,c=2,x,y,z);static void Main

25、(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修饰符来解决此类问题,它告诉编译器,实参与形参的传递方式是引用。引用与值参数不同,引用参数并不创建新的存储单元,它与方法调用中的实参变量同处一个存储单元。因此,在方法内对形参的修改就是对外部实参变量的修改。,【例5-8】将例5-7程序中Sort方法的值参传递方式改成引用参数传递,观察运行结果

26、。,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=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

27、 a,ref b,ref c);Console.WriteLine(a=0,b=1,c=2,a,b,c);,5.4.2 方法的参数,3.输出参数 在参数前加out修饰符的被称为输出参数,它与ref参数很相似,只有一点除外,就是它只能从方法中传出值,而不能从方法调用处接受实参数据。在方法内out参数被认为是未赋过值的,所以在方法结束之前应该对out参数赋值。,【例5-9】求一个数组元素中的最大值、最小值和平均值。,class Myclass public void MaxMinArray(int a,out int max,out int min,out double avg)int sum;s

28、um=max=min=a0;for(int i=1;i max)max=ai;if(ai min)min=ai;sum+=ai;avg=sum/a.Length;class 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);,

29、5.4.4 方法的重载,1.参数类型重载的方法【例5-12】下面程序定义的Myclass类中含有三个名为abs的方法,它们只是参数类型不同,在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 xa

30、bs;if(x=0L)xabs=x;else 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*3.14f)

31、;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.WriteLine(“圆面积=0,梯面积=1,三角面积=2“,m.MyArea(r

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

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

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号