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

上传人:s****8 文档编号:67325087 上传时间:2022-12-24 格式:PPT 页数:47 大小:2.12MB
返回 下载 相关 举报
第三章 面向对象编程基础.ppt_第1页
第1页 / 共47页
第三章 面向对象编程基础.ppt_第2页
第2页 / 共47页
点击查看更多>>
资源描述

《第三章 面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《第三章 面向对象编程基础.ppt(47页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第第第三章三章三章三章 面向对象编程基础面向对象编程基础面向对象编程基础面向对象编程基础本章学习目标本章学习目标理解理解 C#中类和对象的概念中类和对象的概念熟悉熟悉C#中类及其成员的定义中类及其成员的定义类声明类声明类成员类成员掌握属性的用法掌握属性的用法set访问器访问器get访问器访问器掌握掌握C#中方法的定义与用法中方法的定义与用法掌握不同参数传递的方法掌握不同参数传递的方法第第三章三章 面向对象编程基础面向对象编程基础3.1 面向对象概念面向对象概念3.2 类类3.3 方法方法3.4 属性属性3.1 面向对象概念面向对象概念3.1.1 对象、类、实例化对象、类、实例化3.1.2 面

2、向对象程序设计语言的三大原则面向对象程序设计语言的三大原则3.1.1 对象、类、实例化对象、类、实例化在面向对象程序设计技术中,在面向对象程序设计技术中,对象对象是具有属性(又称状态)是具有属性(又称状态)和操作(又称方法、行为方式和消息等)的实体。对象的和操作(又称方法、行为方式和消息等)的实体。对象的属性表示了它所处于的状态;对象的操作则用来改变对象属性表示了它所处于的状态;对象的操作则用来改变对象的状态达到特定的功能。的状态达到特定的功能。类类是在对象之上的抽象,它为属于该类的全部对象提供了是在对象之上的抽象,它为属于该类的全部对象提供了统一的抽象描述。统一的抽象描述。3.1.2 面向对

3、象程序设计语言的三大原则面向对象程序设计语言的三大原则封装封装封装就是把对象的全部属性和全部服务结合在一起形成一个封装就是把对象的全部属性和全部服务结合在一起形成一个不可分割的独立单元;不可分割的独立单元;封装的目的在于将对象的使用者与设计者分开,使用者不必封装的目的在于将对象的使用者与设计者分开,使用者不必了解对象行为的具体实现,只需要用设计者提供的消息接口了解对象行为的具体实现,只需要用设计者提供的消息接口来访问该对象。来访问该对象。继承继承继承机制的优势在于降低了软件开发的复杂性和费用,使软继承机制的优势在于降低了软件开发的复杂性和费用,使软件系统易扩充。件系统易扩充。多态性多态性多态性

4、是指同一个消息或操作作用于不同的对象,可以有不多态性是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果;同的解释,产生不同的执行结果;多态性有两种,一种是静态多态,一种是动态多态。多态性有两种,一种是静态多态,一种是动态多态。3.2 类类3.2.1 类的声明类的声明3.2.2 类的成员类的成员3.2.3 构造函数构造函数3.2.4 析构函数析构函数3.2.1类的声明类的声明访问修饰符访问修饰符 class 类名类名:基类基类 类主体类主体 访问修饰符:访问修饰符:public:表示不限制对类的访问;:表示不限制对类的访问;internal:可被同一个项目的程序访问;可被

5、同一个项目的程序访问;abstract:表示一个抽象类,不能实例化,只能作为基类;表示一个抽象类,不能实例化,只能作为基类;sealed:表示一个密封类,不能被继承。表示一个密封类,不能被继承。说明:说明:如果对类不指定访问修饰符,则类的默认访问修饰符为如果对类不指定访问修饰符,则类的默认访问修饰符为internal 类的声明类的声明3.2.1 类的声明类的声明class Point /Point类的访问权限缺省为类的访问权限缺省为internal int x,y;类的声明类的声明Point p=new Point();类的实例化类的实例化3.2.2 类的成员类的成员类成员由两部分组成,一个是

6、类体中以类成员声明形式引类成员由两部分组成,一个是类体中以类成员声明形式引入的类成员,另一个是直接从它的基类继承而来的成员。入的类成员,另一个是直接从它的基类继承而来的成员。类成员声明主要包括:常数、字段、属性、方法声明等。类成员声明主要包括:常数、字段、属性、方法声明等。类成员声明默认访问修饰符为类成员声明默认访问修饰符为private。3.2.2 类的成员类的成员访问修饰符访问修饰符 const 类型类型 标识符标识符=常数表达式常数表达式常数声明不允许使用常数声明不允许使用static修饰符,但它和静态成员一样修饰符,但它和静态成员一样只能通过类访问只能通过类访问 常数声明常数声明访问修

7、饰符访问修饰符 类型类型 标识符标识符=常数表达式常数表达式加加static修饰的字段是静态字段,不加修饰的字段是静态字段,不加static修饰的字段是实例字段修饰的字段是实例字段静态字段不属于某个实例对象,属于整个类;静态字段不属于某个实例对象,属于整个类;实例字段属于实例对象,一个类可以创建若干实例对象;实例字段属于实例对象,一个类可以创建若干实例对象;在在static方法中可以可以调用其他方法中可以可以调用其他static成员,但是不能调用非成员,但是不能调用非static成员。在非成员。在非static方法中可以调用方法中可以调用static成员;成员;加加readonly修饰符的字段

8、是只读字段,对只读字段的赋值只能在声修饰符的字段是只读字段,对只读字段的赋值只能在声明的同时进行,或者通过类的实例构造函数或静态构造函数实现明的同时进行,或者通过类的实例构造函数或静态构造函数实现字段声明字段声明3.2.2 类的成员类的成员class Test public const int X=10;const double PI=3.14;/默认访问修饰符默认访问修饰符private private double a,b;/实例字段通过对象访问实例字段通过对象访问 public static double sum=0.0 /静态字段通过类访问静态字段通过类访问 public readon

9、ly int Radius;/只读字段只读字段 public Test()()Radius=1.0 /通过构造函数对通过构造函数对Radius赋值赋值 常数与字段声明常数与字段声明3.2.3 构造函数构造函数构造函数构造函数构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数是用来创建对象的特殊函数,函数名和类名一样,没有返构造函数是用来创建对象的特殊函数,函数名和类名一样,没有返回值,连回值,连void都不用。都不用。构造函数可以有参数,构造函数可以有参数,new对象的时候传递函数参数即可对象的时候传递函数参数即可构

10、造函数可以重载,也就是有多个参数不同的构造函数。构造函数可以重载,也就是有多个参数不同的构造函数。如果不指定构造函数,则类有一个默认的无参构造函数。如果不指定构造函数,则类有一个默认的无参构造函数。如果指定了构造函数,则不再有默认的无参构造函数,如果需要无如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。参构造函数,则需要自己来写。3.2.3 构造函数构造函数访问修饰符访问修饰符 类名(参数列表)类名(参数列表)函数体函数体构造函数声明构造函数声明3.2.3 构造函数构造函数 class Student string id;string name;strin

11、g sex;int age;public Student()public Student(string sid,string sname,string ssex,int iage)id=sid;name=sname;sex=ssex;age=iage;构造函数构造函数3.2.3 构造函数构造函数 public class 派生类名称派生类名称:基类名称基类名称/类体类体定义派生类定义派生类无参构造函数无参构造函数public 派生类名派生类名()/函数体函数体 带参数构造函数带参数构造函数 public 派生类名派生类名(形参列表形参列表):base(基类构造函数实参列表基类构造函数实参列表)

12、/函数体函数体 派生类构造函数派生类构造函数3.2.3 构造函数构造函数派生类构造函数派生类构造函数默认执行基类的无参构造函数,如果要执行基类有参构默认执行基类的无参构造函数,如果要执行基类有参构造函数,则必须在派生类构造函数的基表列表中指出;造函数,则必须在派生类构造函数的基表列表中指出;如果基类具有带参数的构造函数,则派生类必需具有向如果基类具有带参数的构造函数,则派生类必需具有向基类传递参数的带参构造函数;基类传递参数的带参构造函数;构造函数调用顺序:构造函数调用顺序:先基类后派生类先基类后派生类。3.2.4 析构函数析构函数类名()类名()函数体函数体析构函数声明析构函数声明3.2.4

13、 析构函数析构函数析构函数析构函数创建一个对象时需要用构造函数初始化数据,与此相对创建一个对象时需要用构造函数初始化数据,与此相对应释放一个对象时就用析构函数。所以析构函数是用于应释放一个对象时就用析构函数。所以析构函数是用于实现析构类实例所需操作的方法。实现析构类实例所需操作的方法。析构函数不能写返回类型,也不能带参数,因此它不可析构函数不能写返回类型,也不能带参数,因此它不可能被重载,当然它也不能被继承,所以一个类最多只能能被重载,当然它也不能被继承,所以一个类最多只能有一个析构函数。有一个析构函数。一个类如果没有显式地声明析构函数,则编译器将自动一个类如果没有显式地声明析构函数,则编译器

14、将自动产生一个缺省默认的析构函数。产生一个缺省默认的析构函数。构造函数调用顺序:构造函数调用顺序:先派生类后基类先派生类后基类。3.3 方法方法3.3.1 方法的声明方法的声明3.3.2 方法的参数方法的参数3.3.3 静态方法与实例方法静态方法与实例方法3.3.4 方法的重载与覆盖方法的重载与覆盖3.3.1 方法的声明方法的声明 方法修饰符方法修饰符 返回类型返回类型 方法名方法名 (形参表形参表)方法体方法体 方法的声明方法的声明命名规范:单命名规范:单词首字母大写词首字母大写默认为默认为private3.3.2 方法的参数方法的参数值参数值参数引用参数引用参数ref输出参数输出参数out

15、参数数组参数数组params值参数值参数下面代码输出结果是什么?下面代码输出结果是什么?static void Main(string args)int num1=5,num2=10;/两个数字两个数字 Console.WriteLine(交换前两个数的值分别为交换前两个数的值分别为:0和和1,num1,num2);Swap(num1,num2);/交换两个数的值交换两个数的值 Console.WriteLine(交换后两个数的值分别为交换后两个数的值分别为:0和和1,num1,num2);/交换两个数的方法交换两个数的方法private static void Swap(int num1,i

16、nt num2)int temp;/中间变量中间变量 temp=num1;num1=num2;num2=temp;值传递不能保留参数的修改值传递不能保留参数的修改要要按引用传递按引用传递,使用,使用 ref引用参数引用参数refref 修饰参数:修饰参数:调用方法后,参数值的更改仍然保留调用方法后,参数值的更改仍然保留定义和调用定义和调用在参数前使用在参数前使用ref在调用方法前在调用方法前作为参数的变量声明并赋值作为参数的变量声明并赋值何时使用何时使用希望保留参数的更改希望保留参数的更改ref示例分析示例分析static void Main(string args)int num1=5,nu

17、m2=10;/两个数字两个数字 Console.WriteLine(交换前两个数的值分别为交换前两个数的值分别为:0和和1,num1,num2);/交换两个数的值交换两个数的值 Swap(ref num1,ref num2);Console.WriteLine(交换后两个数的值分别为交换后两个数的值分别为:0和和1,num1,num2);/交换两个数的方法交换两个数的方法private static void Swap(ref int num1,ref int num2)int temp;/中间变量中间变量 temp=num1;num1=num2;num2=temp;调用时也要使用调用时也要使

18、用 ref两种传参方式的比较两种传参方式的比较调用方法调用方法方法定义方法定义ModifyValue(num1,ref num2);ModifyValue(int param1,ref int param2);调用前调用前num1=3num2=5param1=3param2=5方法中修改:方法中修改:调用后调用后param1=4param2=6num1=3num2=6调用调用值传递值传递引用传递引用传递输出参数输出参数outout 修饰参数:修饰参数:调用方法后,调用方法后,out参数值被输出参数值被输出定义和调用定义和调用在参数前使用在参数前使用out在调用方法前在调用方法前作为参数的变量声

19、明,但无需赋值作为参数的变量声明,但无需赋值何时使用何时使用函数有多个返回值函数有多个返回值out示例分析示例分析static void Main(string args)int num1=1,num2=2;Console.WriteLine(两个数的值分别为两个数的值分别为:0和和1,num1,num2);int sum;Sum(num1,num2,out sum);Console.WriteLine(“两个数的和为两个数的和为:0,sum);/求两个数的和求两个数的和private static void Sum(int num1,int num2,out int sum)sum=num1

20、+num2;调用时也要使用调用时也要使用 outref与与out区别区别ref必须先初始化,因为是引用,所以必须先必须先初始化,因为是引用,所以必须先“有有”,才能引,才能引用,而用,而out则是内部为外部赋值,所以不需要初始化,而则是内部为外部赋值,所以不需要初始化,而且外部初始化也没用。且外部初始化也没用。ref应用场景内部对外部的值进行改变,应用场景内部对外部的值进行改变,out则是内部为外则是内部为外部变量赋值,部变量赋值,out一般用在函数有多个返回值的场所一般用在函数有多个返回值的场所。参数数组参数数组params当需要向方法传递任意个参数时,如何实现当需要向方法传递任意个参数时,

21、如何实现?例:求任意个整数的最大值最小值?例:求任意个整数的最大值最小值?Class Myclass public void MaxMin(out int max,out int min,params int a)if(a.Length=0)/如果可变参数为零个,可以取一个约定值或如果可变参数为零个,可以取一个约定值或产生异常产生异常 max=min=-1;return;max=min=a0;for(int i=1;imax)max=ai;if(aimin)min=ai;参数数组参数数组params当需要向方法传递任意个参数时,如何实现当需要向方法传递任意个参数时,如何实现?例:求任意个整数的

22、最大值最小值?(续)例:求任意个整数的最大值最小值?(续)class Test static void Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;int smax,smin;m.MaxMin(out smax,out smin);/可变参数的个数可以是零个可变参数的个数可以是零个 Console.WriteLine(Max=0,Min=1 ,smax,smin);/在四个数之间找最大、最小在四个数之间找最大、最小 m.MaxMin(out smax,out smin,45,76,89,90);C

23、onsole.WriteLine(Max=0,Min=1 ,smax,smin);m.MaxMin(out smax,out smin,score);/可变参数也可接受数可变参数也可接受数组对象组对象 Console.WriteLine(Max=0,Min=1 ,smax,smin);Console.Read();关于关于params数组需注意数组需注意只能在一维数组上使用只能在一维数组上使用params关键字关键字;params数组必须是方法的最后一个参数数组必须是方法的最后一个参数(也就是说每个方法只也就是说每个方法只能有一个能有一个params数组参数数组参数)。由于由于params参数

24、其实是一个数组,所以在调用时可以为参数数参数其实是一个数组,所以在调用时可以为参数数组指定零个或多个参数,其中每个参数的类型都应与参数数组组指定零个或多个参数,其中每个参数的类型都应与参数数组的元素类型相同或能隐式地转换。的元素类型相同或能隐式地转换。当调用具有当调用具有params参数的方法时,可以作为一个元素列表或作参数的方法时,可以作为一个元素列表或作为一个数组传递给为一个数组传递给params参数。参数。无论采用哪种方式来调用方法,无论采用哪种方式来调用方法,params参数都是作为一个数组参数都是作为一个数组被处理。所以在方法内可以使用数组的长度属性来确定在每次被处理。所以在方法内可

25、以使用数组的长度属性来确定在每次调用中所传递参数的个数。调用中所传递参数的个数。params参数在内部会进行数据的复制,不可能将参数在内部会进行数据的复制,不可能将params修饰修饰符与符与ref和和out修饰符组合起来用。即使对参数数据的元素进行修饰符组合起来用。即使对参数数据的元素进行了修改,这个方法之外的数值也不会发生变化。了修改,这个方法之外的数值也不会发生变化。3.3.3 静态方法与实例方法静态方法与实例方法类的数据成员可以分为静态字段和实例字段;类的数据成员可以分为静态字段和实例字段;静态字段和类相关联,不依赖特定对象的存在;静态字段和类相关联,不依赖特定对象的存在;实例字段和对

26、象相关联,访问实例字段依赖于实例的存在;实例字段和对象相关联,访问实例字段依赖于实例的存在;方法分为静态方法和实例方法;方法分为静态方法和实例方法;若一个方法声明中含有若一个方法声明中含有static修饰符,则该方法为静态方法修饰符,则该方法为静态方法;静态方法只能操作类中的静态成员;静态方法只能操作类中的静态成员;实例方法的声明中不含有实例方法的声明中不含有static修饰符;修饰符;实例方法可以直接访问静态字段和实例字段。实例方法可以直接访问静态字段和实例字段。3.4 方法的重载与覆盖方法的重载与覆盖方法重载:声明两个以上的同名方法,实现对不同数据类方法重载:声明两个以上的同名方法,实现对

27、不同数据类型的相同处理;型的相同处理;方法重载有两点要求:方法重载有两点要求:重载的方法名称必须相同;重载的方法名称必须相同;重载的方法,其形参个数或类型必须不同,否则将出现重载的方法,其形参个数或类型必须不同,否则将出现“已已经定义了一个具有相同类型参数的方法成员经定义了一个具有相同类型参数的方法成员”的编译错误。的编译错误。方法重载方法重载3.4 方法的重载与覆盖方法的重载与覆盖返回两个整型数据的最大值;返回两个整型数据的最大值;返回两个实数数据的最大值;返回两个实数数据的最大值;返回三个整型数据的最大值;返回三个整型数据的最大值;方法重载方法重载3.4 方法的重载与覆盖方法的重载与覆盖方

28、法重载方法重载Class Greatpublic int Greatest(int num1,int num2)/此方法用于找出两个此方法用于找出两个int型数据的最大值型数据的最大值public int Greatest(int num1,int num2,int num3)/此方法用于找出此方法用于找出3个个int型数据的最大值型数据的最大值public double Greatest(double num1,double num2)/此方法用于找出两个此方法用于找出两个double型数据的最大值型数据的最大值对不同数据执行相似的功能3.4 方法的重载与覆盖方法的重载与覆盖方法覆盖:如果派

29、生类需要对基类的同名方法做出修改,方法覆盖:如果派生类需要对基类的同名方法做出修改,就要在派生类中对基类方法进行覆盖;就要在派生类中对基类方法进行覆盖;方法覆盖方式有两种:方法覆盖方式有两种:用关键字用关键字new修饰修饰用关键字用关键字override修饰修饰方法覆盖方法覆盖3.4 方法的重载与覆盖方法的重载与覆盖new:如果在派生类成员函数声明中加:如果在派生类成员函数声明中加new修饰符,则在修饰符,则在派生类中有意隐藏基类方法派生类中有意隐藏基类方法;new关键字可以省略。关键字可以省略。方法覆盖方法覆盖newnew修饰符修饰符class Shapepublic void show()

30、Console.WriteLine(“执行基类函数执行基类函数”);class Circle:Shapepublic void show()Console.WriteLine(“执行派生类函数执行派生类函数”);class Teststatic void Main()Shape A=new Shape();Circle B=new Circle();A=B;/父类可以引用子类对象,父类引用只能调用子类继承自父类的方父类可以引用子类对象,父类引用只能调用子类继承自父类的方法,父类不能调用子类独有的方法法,父类不能调用子类独有的方法 A.show();执行结果为执行结果为:执行基类函数执行基类函数

31、3.4 方法的重载与覆盖方法的重载与覆盖override:将基类的方法用关键字:将基类的方法用关键字virtual修饰,在派生类修饰,在派生类成员函数声明中加成员函数声明中加override修饰符,则在派生类中覆盖基修饰符,则在派生类中覆盖基类中的虚方法。类中的虚方法。方法覆盖方法覆盖override修饰符修饰符class Shapepublic virtual void show()Console.WriteLine(“执行基类函数执行基类函数”);class Circlepublic override void show()Console.WriteLine(“执行派生类函数执行派生类函数

32、”);class Teststatic void Main()Shape A=new Shape();Circle B=new Circle();A=B;A.show();执行结果为执行结果为:执行派生类函数执行派生类函数3.4 属性属性为了实现良好的数据封装和数据隐藏,类的字段成员的访为了实现良好的数据封装和数据隐藏,类的字段成员的访问属性一般设置成问属性一般设置成private或或protected,这样在类的外部,这样在类的外部就不能直接读写这些字段成员了,通常的办法是提供就不能直接读写这些字段成员了,通常的办法是提供public级的方法来访问私有的或受保护的字段。级的方法来访问私有的或

33、受保护的字段。但但C#提供了属性(提供了属性(property)这个更好的方法,把字段)这个更好的方法,把字段域和访问它们的方法相结合。对类的用户而言,属性值的域和访问它们的方法相结合。对类的用户而言,属性值的读写与字段域语法相同,对编译器来说,属性值的读写是读写与字段域语法相同,对编译器来说,属性值的读写是通过类中封装的特别方法通过类中封装的特别方法get访问器和访问器和set访问器实现的。访问器实现的。3.4 属性属性public 数据类型数据类型 属性名属性名 get;set;读读/写属性写属性public 数据类型数据类型 属性名属性名 get;只读属性只读属性get用于读值,set用

34、于赋值只能读值3.4 属性属性 class Student string id;string name;public string ID get return id;set id=value;public string Name get return name;set name=value;属性定义属性定义3.4 属性属性 Student stu=new Student();/用属性设置修改数据成员值用属性设置修改数据成员值stu.ID=“123”;/用属性读取数据成员值为其他变量赋值用属性读取数据成员值为其他变量赋值string name=stu.Name;使用属性使用属性3.4 属性属性字段以小写字母开头字段以小写字母开头属性以大写字母开头属性以大写字母开头字段的修饰符是字段的修饰符是private属性的修饰符是属性的修饰符是public规范强制要求规范强制要求总结总结C#中类的定义及实例声明?中类的定义及实例声明?C#中属性及方法的定义?中属性及方法的定义?方法中参数传递的不同方法?方法中参数传递的不同方法?方法的重载与覆盖?方法的重载与覆盖?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com