C#的面向对象程序设计.ppt

上传人:wuy****n92 文档编号:80452782 上传时间:2023-03-23 格式:PPT 页数:77 大小:317.49KB
返回 下载 相关 举报
C#的面向对象程序设计.ppt_第1页
第1页 / 共77页
C#的面向对象程序设计.ppt_第2页
第2页 / 共77页
点击查看更多>>
资源描述

《C#的面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《C#的面向对象程序设计.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第6章章 C#的面向对象程序设计的面向对象程序设计内容提要:内容提要:类、对象的概念及使用类、对象的概念及使用 方法、属性、索引的概念、声明及调用方法、属性、索引的概念、声明及调用 构造函数和析构函数的定义构造函数和析构函数的定义 继承和接口的用法继承和接口的用法 委托和事件的声明及调用委托和事件的声明及调用目的要求:目的要求:理解类、对象、构造函数和析构函数的意义理解类、对象、构造函数和析构函数的意义 掌握方法、属性、索引的用法掌握方法、属性、索引的用法 掌握继承和接口、委托和事件的声明及调用掌握继承和接口、委托和事件的声明及调用重点难点:重点难点:类、对象、方法、属性、继承、接口、委托和

2、事件类、对象、方法、属性、继承、接口、委托和事件 面向对象的程序设计面向对象的程序设计(OOP)的主要思想是将数据及处的主要思想是将数据及处 理这些数据的操作都封装到一个称为类(理这些数据的操作都封装到一个称为类(Class)的数据结)的数据结 构中。使用这个类时,只需要定义一个类的变量即可,这构中。使用这个类时,只需要定义一个类的变量即可,这 个变量叫做对象(个变量叫做对象(Object)。通过调用对象的数据成员完)。通过调用对象的数据成员完 成对类的使用。成对类的使用。1.类类 在面向对象理论中,类(在面向对象理论中,类(class)就是对具有相同特征就是对具有相同特征的一类事物所做的抽象

3、(或者说,归纳)。的一类事物所做的抽象(或者说,归纳)。6.1 面向对象程序设计的基本概念面向对象程序设计的基本概念 2.对象对象 类是一种抽象,而对象类是一种抽象,而对象(object)则是实例则是实例(instance),是具体的。是具体的。如果使用如下格式来代表一个类生成一个对象:如果使用如下格式来代表一个类生成一个对象:类名类名 对象名;对象名;则:则:电子计算机电子计算机 ComputerA;电子计算机电子计算机 ComputerB;就代表就代表ComputerA和和ComputerB是是“电子计算机电子计算机”类类的的 两个不同对象。两个不同对象。3.类的属性类的属性 属性说明了这

4、个类的特点。属性说明了这个类的特点。例如例如“PC计算机计算机”类则可能具备如下属性:类则可能具备如下属性:计算机的名称计算机的名称 CPU类型类型 内存容量内存容量 硬盘容量硬盘容量 主板型号主板型号 显示适配器型号显示适配器型号 声卡型号声卡型号 操作系统类型操作系统类型 通过这些属性,就可以将不同的通过这些属性,就可以将不同的PC计算机区分开。计算机区分开。4.类的方法类的方法 类的方法(类的方法(method)代表了一类事物所具备的动作,代表了一类事物所具备的动作,是对属性的操作。是对属性的操作。比如:比如:“石英钟石英钟”类的方法有:秒针前进一格、分秒类的方法有:秒针前进一格、分秒针

5、针 前进一格、时针前进一格等,而前进一格、时针前进一格等,而“录像机录像机”类所具备的方类所具备的方法法 可以有:播放、定格、录像、倒带、快进等。可以有:播放、定格、录像、倒带、快进等。5.派生和继承派生和继承 在类的继承中,被继承的类称为基类(又称为父类),在类的继承中,被继承的类称为基类(又称为父类),由基类继承的类称为派生类(又称为子类)。派生类自动获由基类继承的类称为派生类(又称为子类)。派生类自动获 得基类的所有属性和方法,而且可以在派生类中添加新的属得基类的所有属性和方法,而且可以在派生类中添加新的属 性和方法。性和方法。6.6.多态性多态性多态性多态性 多态性是指在一般类中定义的

6、属性或行为,被特殊多态性是指在一般类中定义的属性或行为,被特殊多态性是指在一般类中定义的属性或行为,被特殊多态性是指在一般类中定义的属性或行为,被特殊 类继承之后,可以具有不同数据类型或表现出不同的行类继承之后,可以具有不同数据类型或表现出不同的行类继承之后,可以具有不同数据类型或表现出不同的行类继承之后,可以具有不同数据类型或表现出不同的行 为。就是程序在运行时,会自动判断对象的派生类型,为。就是程序在运行时,会自动判断对象的派生类型,为。就是程序在运行时,会自动判断对象的派生类型,为。就是程序在运行时,会自动判断对象的派生类型,并调用相应的方法。并调用相应的方法。并调用相应的方法。并调用相

7、应的方法。7.7.封装封装封装封装 封装就是把对象的属性和服务结合成一个独立的系封装就是把对象的属性和服务结合成一个独立的系封装就是把对象的属性和服务结合成一个独立的系封装就是把对象的属性和服务结合成一个独立的系 统单位,并尽可能隐蔽对象的内部细节统单位,并尽可能隐蔽对象的内部细节统单位,并尽可能隐蔽对象的内部细节统单位,并尽可能隐蔽对象的内部细节。6.2 类和对象类和对象 6.2.1 类的声明类的声明 类是类是C#的一种自定义数据类型,其声明格式为:的一种自定义数据类型,其声明格式为:类修饰符类修饰符 class 类名类名:基类类名:基类类名 类的成员;类的成员;说明:说明:C#支持的类修饰

8、符有:支持的类修饰符有:new、public、protected、internal、private、abstract、sealed。例:定义一个车辆类(有三个变量)例:定义一个车辆类(有三个变量)class Vehicle public int passengers;/乘客数乘客数 public int fuelcap;/所耗燃料所耗燃料 public int mpg;/每公里耗油量每公里耗油量 6.2.2 类的成员类的成员 类的成员可以分为两大类:类本身所声明的,以及类的成员可以分为两大类:类本身所声明的,以及从基类其分为两种:从基类其分为两种:一种不以函数形式体现,称为成员变量;一种不以函

9、数形式体现,称为成员变量;另一种是以函数形式体现,称为成员函数。另一种是以函数形式体现,称为成员函数。1.类成员的访问修饰符类成员的访问修饰符 (1)public:允许类的内部或外界直接访问;允许类的内部或外界直接访问;(2)private:不允许外界访问,也不允许派生类不允许外界访问,也不允许派生类 访问,即只能在类的内部访问。如访问,即只能在类的内部访问。如 果没有设定访问修饰符,默认为果没有设定访问修饰符,默认为 private;(3)protected:不允许外界访问,但允许派生类不允许外界访问,但允许派生类 访问;访问;(4)internal:只有本类的成员才能访问。只有本类的成员才

10、能访问。(5)readonly:该成员的值只能读,不能写。也就:该成员的值只能读,不能写。也就 是说,除了赋予初始值外,在程序是说,除了赋予初始值外,在程序 的任何一个部分将无法更改这个成的任何一个部分将无法更改这个成 员的值。员的值。class ClassA public int a;private int b;protected int c;public void SetA()a=1;/正确,允许访问类自身公有成员正确,允许访问类自身公有成员 b=2;/正确,允许访问类自身私有成员正确,允许访问类自身私有成员 c=3;/正确,允许访问类自身保护成员正确,允许访问类自身保护成员 class

11、ClassB:ClassA public void SetB()ClassA BaseA=new ClassA();BaseA.a=5;/正确,允许访问基类公有成员正确,允许访问基类公有成员 BaseA.b=23;/错误,不允许访问基类私有成员错误,不允许访问基类私有成员 BaseA.c=68;/正确,允许访问基类保护成员正确,允许访问基类保护成员 class ClassC public void SetB()ClassA BaseA=new ClassA();BaseA.a=5;/正确,允许访问类的其他公有成员正确,允许访问类的其他公有成员 BaseA.b=23;/错误,不允许访问类的其他私

12、有成员错误,不允许访问类的其他私有成员 BaseA.c=68;/错误,不允许访问类的其他保护成员错误,不允许访问类的其他保护成员 2.静态成员与非静态成员静态成员与非静态成员 静态成员是在声明成员时在前面加上静态成员是在声明成员时在前面加上static保留字;保留字;非静态成员是在声明成员时前面没有非静态成员是在声明成员时前面没有static保留字;保留字;静态成员属于类所有,非静态成员属于类的对象所有。静态成员属于类所有,非静态成员属于类的对象所有。静态成员的访问格式:静态成员的访问格式:类名类名.静态成员名静态成员名 若将类中的某个成员声明为若将类中的某个成员声明为static,则该成员称

13、为,则该成员称为静态静态 成员成员。类中的成员要么是静态的,要么是非静态的。类中的成员要么是静态的,要么是非静态的。类的类的非静态非静态成员属于类的实例所有,每创建一个类的成员属于类的实例所有,每创建一个类的 实例都在内存中为非静态成员开辟了一块区域。而类的静实例都在内存中为非静态成员开辟了一块区域。而类的静 态成员属于类所有,为这个类的所有实例所共享。无论这态成员属于类所有,为这个类的所有实例所共享。无论这 个创建了多少个对象(实例),一个静态成员在内存中只个创建了多少个对象(实例),一个静态成员在内存中只 占有一块区域。占有一块区域。例:静态成员的访问例:静态成员的访问using Syst

14、em;class Myclass public int nIndex=10;static public double fphi=45.6;class classTest static void Main()int a=Myclass.nIndex;/错误,因为错误,因为nIndex是非是非静态成员静态成员 double b=Myclass.fphi;/正确,因为正确,因为fphi是静态是静态成员成员 Console.Write(b);6.2.3 对象的声明对象的声明 创建类的对象。分两步:创建类的对象。分两步:(1)先声明对象名)先声明对象名 格式:格式:类名类名 对象名;对象名;例:例:Ve

15、hicle minivan;/定义类定义类Vehicle的一个对象的一个对象 (2)创建类的实例。)创建类的实例。格式:对象名格式:对象名=new 类名类名();例:例:minivan=new Vehicle();/创建一个实例创建一个实例 以上两步也可以合并成一步。以上两步也可以合并成一步。格式:格式:类名类名 对象名对象名=new 类名类名();例:例:Vehicle minivan=new Vehicle();6.3 构造函数和析构函数构造函数和析构函数 C#C#C#C#中有两个特殊的函数:构造函数和析构函数。中有两个特殊的函数:构造函数和析构函数。中有两个特殊的函数:构造函数和析构函数

16、。中有两个特殊的函数:构造函数和析构函数。构造函数构造函数构造函数构造函数:当类实例化时首先执行的函数;:当类实例化时首先执行的函数;:当类实例化时首先执行的函数;:当类实例化时首先执行的函数;析构函数析构函数析构函数析构函数:当实例(即对象)从内存中销毁前最后执行:当实例(即对象)从内存中销毁前最后执行:当实例(即对象)从内存中销毁前最后执行:当实例(即对象)从内存中销毁前最后执行 的函数。的函数。的函数。的函数。6.3.1 6.3.1 构造函数构造函数构造函数构造函数 在在C#中,当创建一个对象时,系统首先为这个对中,当创建一个对象时,系统首先为这个对象赋予一个标识符,然后给对象分配合适的

17、内存空间,象赋予一个标识符,然后给对象分配合适的内存空间,随后系统就自动调用对象的构造函数。随后系统就自动调用对象的构造函数。构造函数的类型修饰符总是构造函数的类型修饰符总是public,因为构造函数,因为构造函数主要是在类外创建对象时自动调用。主要是在类外创建对象时自动调用。格式:格式:class 类名类名 public 类名类名()/构造函数体构造函数体 例:例:using System;class MyClass public int x;public Myclass()/类类MyClass的构造函数的构造函数 x=10;class ConsDemo public static void

18、 Main()MyClass t1=new MyClass();MyClass t2=new MyClass();Console.WriteLine(“0t1”,t1.x,t2.x);运行结果如下:运行结果如下:构造函数也可以带参数。构造函数也可以带参数。例:例:using System;class Fruit public string color;public string shape;public Fruit(string c,string s)/类类Fruit的构造函数的构造函数 color=c;shape=s;class Test public static void Main()F

19、ruit Orange=new Fruit(“orange”,”round”);/创建创建Orange实例实例 Console.WriteLine(“0,1”,Orange.color,Orange.shape);运行结果如下:运行结果如下:构造函数也可以重载。构造函数也可以重载。例:例:using System;class A public int count;public A()count=-1;public A(int n)count=n;class Test static void Main()A a=new A();Console.WriteLine(count=0,a.count)

20、;A b=new A(5);Console.WriteLine(count=0,b.count);运行结果如下:运行结果如下:使用使用 this关键字关键字 C#中的中的this关键字是用来代表对象自身。关键字是用来代表对象自身。this一般用在构造函数中,一般用在构造函数中,以便区别同名的构造函数参数和类成员变量。以便区别同名的构造函数参数和类成员变量。例:例:using System;class Point int x,y;public Point(int x,int y)this.x=x;this.y=y;运行结果如下:运行结果如下:class Test static void Main

21、()Point p=new Point(5,6);Console.WriteLine(x=0,p.x);Console.WriteLine(y=0,p.y);6.3.2 析构函数析构函数 析构函数也是类的特殊的成员函数,它主要用析构函数也是类的特殊的成员函数,它主要用于释放类实例。于释放类实例。析构函数的特殊性表现在以下几个方面:析构函数的特殊性表现在以下几个方面:(1)析构函数的名字与类名相同,但它前面需)析构函数的名字与类名相同,但它前面需要要 加一个加一个“”符号;符号;(2)析构函数不能带参数,也没有返回值;)析构函数不能带参数,也没有返回值;(3)当撤消对象时,自动调用析构函数;)当

22、撤消对象时,自动调用析构函数;(4)析构函数不能被继承,也不能被重载。)析构函数不能被继承,也不能被重载。格式:格式:class 类名类名 类名类名()/析构函数体析构函数体 析构函数以与构造函数相反的顺序被调用。析构函数以与构造函数相反的顺序被调用。例:例:using System;class Decon1 public Decon1()Console.WriteLine(“调用构造函数调用构造函数Decon1”);Decon1()Console.WriteLine(“调用析构函数调用析构函数Decon1”);class Decon2 public Decon2()Console.Write

23、Line(“调用构造函数调用构造函数Decon2”);Decon2()Console.WriteLine(“调用析构函数调用析构函数Decon2”);class Test public static void Main()Decon1 dec1=new Decon1();Decon2 dec2=new Decon2();运行结果如下:运行结果如下:可以按照程序代码执行的功能或其他依据把相关的可以按照程序代码执行的功能或其他依据把相关的语句组织在一起,并给它们注明相应的名称,利用这种语句组织在一起,并给它们注明相应的名称,利用这种方式把程序分块,就形成了类的方法。方式把程序分块,就形成了类的方法

24、。方法的功能是通过方法调用实现的。方法调用指定方法的功能是通过方法调用实现的。方法调用指定了被调用方法的名字和调用方法所需的信息(参数),了被调用方法的名字和调用方法所需的信息(参数),调用方法要求被调用方法按照方法参数完成某个任务,调用方法要求被调用方法按照方法参数完成某个任务,并在完成这项任务后由方法返回。如果调用过程出错,并在完成这项任务后由方法返回。如果调用过程出错,则无法完成正常的任务。则无法完成正常的任务。6.4 方法方法6.4.1 方法的定义及调用方法的定义及调用 方法是类中用于计算或进行其他操作的成员。类的方方法是类中用于计算或进行其他操作的成员。类的方法主要用来操作类的数据,

25、提供一种访问数据的途径。法主要用来操作类的数据,提供一种访问数据的途径。1.方法的定义方法的定义 格式:格式:修饰符修饰符 返回值类型返回值类型 方法名(形式参数列表)方法名(形式参数列表)方法体各语句;方法体各语句;说明:说明:说明:说明:(1 1)如果如果如果如果省略省略省略省略“方法修饰符方法修饰符方法修饰符方法修饰符”,该方法为类的私该方法为类的私该方法为类的私该方法为类的私 有成员。有成员。有成员。有成员。(2 2)“返回类型返回类型返回类型返回类型”指定该方法返回数据的类型,指定该方法返回数据的类型,指定该方法返回数据的类型,指定该方法返回数据的类型,它可以是任何有效的类型。如果方

26、法不需它可以是任何有效的类型。如果方法不需它可以是任何有效的类型。如果方法不需它可以是任何有效的类型。如果方法不需 要返回一个值,其返回类型必须是要返回一个值,其返回类型必须是要返回一个值,其返回类型必须是要返回一个值,其返回类型必须是voidvoid。(3 3)“方法参数列表方法参数列表方法参数列表方法参数列表”是用逗号分隔的类型、是用逗号分隔的类型、是用逗号分隔的类型、是用逗号分隔的类型、标标标标 识符对。这里的参数是形式参数,本质上识符对。这里的参数是形式参数,本质上识符对。这里的参数是形式参数,本质上识符对。这里的参数是形式参数,本质上 是一个变量,它用来在调用方法时接收传是一个变量,

27、它用来在调用方法时接收传是一个变量,它用来在调用方法时接收传是一个变量,它用来在调用方法时接收传 给方法的实际参数值,如果方法没有参给方法的实际参数值,如果方法没有参给方法的实际参数值,如果方法没有参给方法的实际参数值,如果方法没有参 数,那么参数列表为空。数,那么参数列表为空。数,那么参数列表为空。数,那么参数列表为空。2.从方法返回从方法返回 一般来说有两种情况将导致方法返回。一般来说有两种情况将导致方法返回。第一种情况:当碰到方法的结束花括号。第一种情况:当碰到方法的结束花括号。第二种情况:执行到第二种情况:执行到return语句。语句。有两种形式的有两种形式的 return:一种用在:

28、一种用在void方法中(就是那方法中(就是那些没有返回值的方法),另一种用在有返回值的方法中。些没有返回值的方法),另一种用在有返回值的方法中。例:通过方法的结束花括号返回。例:通过方法的结束花括号返回。using System;class Test public void myMeth()int j;for(j=0;j=5)j=j*2;Console.WriteLine(j);return;else j=j*3;Console.WriteLine(j);return;static void Main()Test lei=new Test();lei.myMeth();运行结果如下:运行结果如

29、下:注意:一个注意:一个void方法在下述情况之一下将返回方法在下述情况之一下将返回程序执行时碰到方法的结束花括号;或者程序执行程序执行时碰到方法的结束花括号;或者程序执行到一条到一条return语句时。语句时。使用下述形式的使用下述形式的return语句来从方法返回一个值语句来从方法返回一个值给调用者。给调用者。格式:格式:return value;说明:这里说明:这里value是要从方法中返回的值。是要从方法中返回的值。例:例:用用return语句返回值。语句返回值。public int myMeth()int j=8;if(j=5)return j*2;else return j*3;6

30、.4.2 方法的参数类型方法的参数类型 调用方法时,可以给方法传递一个或多个值。调用方法时,可以给方法传递一个或多个值。传给方法的值叫做实参(传给方法的值叫做实参(argument),在方法内部,在方法内部,接收实参值的变量叫做形参(接收实参值的变量叫做形参(parameter),形参在紧形参在紧跟着方法名的括号中声明。形参的声明语法与变量跟着方法名的括号中声明。形参的声明语法与变量的声明语法一样。形参只在方法内部有效,除了将的声明语法一样。形参只在方法内部有效,除了将接收实参的值外,它与一般的变量没什么区别。接收实参的值外,它与一般的变量没什么区别。C#方法的参数类型主要有:值参数、引用参数

31、方法的参数类型主要有:值参数、引用参数和输出参数。和输出参数。1值参数值参数 未用任何修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员时创建,并用调用中给定的实参值初始化。当从该函数返回时值参数被销毁。对值参数的修改不会影响到原自变量。值参数通过复制原自变量的值来初始化。例:使用值参数。例:使用值参数。using System;class Test public void Swap(int x,int y)int k;k=x;x=y;y=x;static void Main()int a=8,b=68;Console.WriteLine(a=0,y=1,a,b);Test sw=ne

32、w Test();sw.Swap(a,b);Console.WriteLine(a=0,y=1,a,b);程序的运行结果为:程序的运行结果为:a=8,b=68 a=8,b=68 2.引用型参数引用型参数 用用ref修饰符声明的参数为引用参数。引用参数本修饰符声明的参数为引用参数。引用参数本身并不创建新的存储空间,而是将实参的存储地址传身并不创建新的存储空间,而是将实参的存储地址传递给形参。可以认为引用参数中就是调用方法时给出递给形参。可以认为引用参数中就是调用方法时给出的变量,而不是一个新变量。在函数调用中,引用参的变量,而不是一个新变量。在函数调用中,引用参数必须被赋初值。在调用时,传送给数

33、必须被赋初值。在调用时,传送给ref参数的必须是参数的必须是变量,类型必须相同,并且必须使用变量,类型必须相同,并且必须使用ref修饰。修饰。格式:格式:方法修饰符方法修饰符 返回类型返回类型 方法名(方法名(,ref参数参数1,ref 参数参数 2,)方法实现部分;方法实现部分;调用方法时,实参前面也必须要加上调用方法时,实参前面也必须要加上ref。例:使用引用参数。例:使用引用参数。using System;using System;class Testclass Test public void Swap(ref int x,ref int y)public void Swap(ref

34、int x,ref int y)int k;int k;k=x;k=x;x=y;x=y;y=x;y=x;static void Main()static void Main()int a=8,b=68;int a=8,b=68;Console.WriteLine(a=0,y=1,a,b);Console.WriteLine(a=0,y=1,a,b);Test sw=new Test();Test sw=new Test();sw.Swap(ref a,ref b);sw.Swap(ref a,ref b);Console.WriteLine(a=0,y=1,a,b);Console.Write

35、Line(a=0,y=1,a,b);程序的运行结果为:程序的运行结果为:a=8,b=68 a=68,b=8 3.输出参数输出参数 用用out修饰符定义的参数称为输出参数。如果希望方法返回修饰符定义的参数称为输出参数。如果希望方法返回 多个值,可使用输出参数。多个值,可使用输出参数。格式:格式:方法修饰符方法修饰符 返回类型返回类型 方法名(方法名(,out 参数参数1,out 参数参数 2,)方法实现部分;方法实现部分;调用方法时,实参前面也要加上调用方法时,实参前面也要加上out。例:使用输出参数例:使用输出参数using System;class MyClass public string

36、 TestOut(out string i)i=使用使用out关键字关键字;return out参数参数;class test static void Main()string x;MyClass app=new MyClass();Console.WriteLine(app.TestOut(out x);Console.WriteLine(x);运行结果如下:运行结果如下:例:例:using System;class TestOut /b就是利用就是利用out这个输出参数而返回的值这个输出参数而返回的值 static int OutValue(int a,out char b)b=(char

37、)a;return 9;static void Main()int t=65,r;char m;r=OutValue(t,out m);Console.WriteLine(r=0,m=1,r,m);运行结果如下:运行结果如下:注意:注意:在把引用型实参的值传递给形参之前,必须先在把引用型实参的值传递给形参之前,必须先对其赋值。这一点是引用参数与输出参数的不同之对其赋值。这一点是引用参数与输出参数的不同之处。处。在带有引用参数的方法中,有可能导致多个变在带有引用参数的方法中,有可能导致多个变量名指向同一内存地址,从而导致出错。量名指向同一内存地址,从而导致出错。6.4.2 方法的重载方法的重载

38、类中两个以上的方法类中两个以上的方法(包括隐藏的继承而来的方包括隐藏的继承而来的方法法)取的名字相同,只要使用的参数类型或参数个数取的名字相同,只要使用的参数类型或参数个数不同,编译器便知道在何种情况下应该调用哪个方不同,编译器便知道在何种情况下应该调用哪个方法,这就叫做方法的重载。法,这就叫做方法的重载。方法重载必须遵守一个重要的约束:每一个被方法重载必须遵守一个重要的约束:每一个被重载方法的参数类型或个数必须不同。当调用重载重载方法的参数类型或个数必须不同。当调用重载方法时,将执行形参与实参相匹配的那个方法。方法时,将执行形参与实参相匹配的那个方法。例:方法重载。例:方法重载。using

39、System;using System;class TestoverLoad class TestoverLoad public void print(int i)public void print(int i)Console.WriteLine(Console.WriteLine(输出的整数输出的整数=0=0,i);i);public void print(string s)public void print(string s)Console.WriteLine(Console.WriteLine(输出的字符串输出的字符串=0,s);=0,s);public void print(doubl

40、e d)public void print(double d)Console.WriteLine(Console.WriteLine(输出的双精度数输出的双精度数=0=0,d);d);class test class test public static void Main()public static void Main()TestoverLoad app=new TestoverLoad();TestoverLoad app=new TestoverLoad();app.print(6);app.print(6);app.print(app.print(理解方法重载了吗?理解方法重载了吗?

41、););app.print(3.14);app.print(3.14);运行结果为:运行结果为:输出的整数输出的整数=6 输出的字符串输出的字符串=理解方法重载了吗?理解方法重载了吗?输出的双精度数输出的双精度数=3.14 6.4.4 静态方法与非静态方法静态方法与非静态方法 类的成员类型有静态和非静态两种,因此方法也有静态类的成员类型有静态和非静态两种,因此方法也有静态方法和非静态方法两种。使用方法和非静态方法两种。使用static 修饰符的方法称为静态方修饰符的方法称为静态方法,没有使用法,没有使用static 修饰符的方法称为非静态方法。修饰符的方法称为非静态方法。静态方法和非静态方法的

42、区别是:静态方法属于类所有,静态方法和非静态方法的区别是:静态方法属于类所有,非静态方法属于用该类定义的对象所有。非静态方法属于用该类定义的对象所有。例:使用静态方法和非静态方法。例:使用静态方法和非静态方法。using System;class TestMethod public int a;static public int b;void Fun1()/定义一个非静态方法定义一个非静态方法 a=10;/正确,直接访问非静态成员正确,直接访问非静态成员 b=20;/正确,直接访问静态成员正确,直接访问静态成员 static void Fun2()/定义一个静态成员方法定义一个静态成员方法 a

43、=10;/错误,不能访问非静态成员错误,不能访问非静态成员 b=20;/正确,可以访问静态成员,相当于正确,可以访问静态成员,相当于myClass.b=20 class Teststatic void Main()myClass A=new myClass();A.a=10;/正确,访问类正确,访问类myClass的非静态公有成员变量的非静态公有成员变量 A.b=10;/错误,不能直接访问类中静态公有成员错误,不能直接访问类中静态公有成员 MyClass.a=20;/错误,不能通过类访问类中非静态公有成员错误,不能通过类访问类中非静态公有成员 MyClass.b=20;/正确,可以通过类访问类

44、正确,可以通过类访问类myClass中的中的 /静态公有成员静态公有成员 6.4.5 6.4.5 运算符的重载运算符的重载运算符的重载运算符的重载为类定义自己的运算符的操作,就称为运算符重载。为类定义自己的运算符的操作,就称为运算符重载。1运算符重载的声明运算符重载的声明 C#中运算符重载总是在类进行声明。实际上中运算符重载总是在类进行声明。实际上一个运算符重载不过是一个方法罢了,比较特别的是它一个运算符重载不过是一个方法罢了,比较特别的是它的名称需要遵守一个特殊的格式来定义。所有的重载运的名称需要遵守一个特殊的格式来定义。所有的重载运算符的名称都是以算符的名称都是以operator开始,加上

45、欲重载的运算符,开始,加上欲重载的运算符,而且重载运算符的方法一定是而且重载运算符的方法一定是public且为且为static的。的。声明重载运算符的一般格式如下:声明重载运算符的一般格式如下:public static 返回类型返回类型 operator 运算符运算符(参数列表参数列表)/可执行语句可执行语句 C#中下列运算符都是可以重载的:中下列运算符都是可以重载的:一元运算符:一元运算符:+-!+-true false 二元运算符:二元运算符:+-*/%&|=!=和和,以及,以及=同样如此。同样如此。同样,同样,true与与false也必须成对出现。也必须成对出现。C#中还有一些运算符是

46、允许重载的中还有一些运算符是允许重载的,如下所示:,如下所示:=&?:new typeof sizeof is2一元运算符重载一元运算符重载 一元运算符重载必须使用类一元运算符重载必须使用类T的单个参数,的单个参数,其中其中+、-、!可以返回任何类型;、!可以返回任何类型;+或或-的的返返回类型必须是类回类型必须是类T,而且重载之后的,而且重载之后的+或或-无无法区分前缀与后缀;法区分前缀与后缀;true和和false要求返回类型要求返回类型是是布尔类型。布尔类型。3二元运算符重载二元运算符重载 二元运算符重载必须有两个参数,而且其二元运算符重载必须有两个参数,而且其中至少一个必须是声明运算符

47、的类类型。一个中至少一个必须是声明运算符的类类型。一个二元运算符可以返回任何类型。二元运算符可以返回任何类型。6.4.6 递归递归 类方法成员间允许相互调用,也可以自己调用自己。类方法成员间允许相互调用,也可以自己调用自己。类的方法如果在方法体内直接或间接地类的方法如果在方法体内直接或间接地自己调用自己自己调用自己就称就称为为递归方法递归方法。递归是常用的程序设计技术,其基本思想就是递归是常用的程序设计技术,其基本思想就是“自己自己调用自己调用自己”。递归方法实际上体现了递归方法实际上体现了“依此类推依此类推”、“用同样的步骤重复用同样的步骤重复”这样的思想,它可以用简单的程序来这样的思想,它

48、可以用简单的程序来解决某些复杂的计算问题。解决某些复杂的计算问题。递归调用在完成阶乘运算、级数运算、幂指数运算等递归调用在完成阶乘运算、级数运算、幂指数运算等方面特别有效。方面特别有效。在执行递归操作时,在执行递归操作时,C#语言把递归过程中的信息保存语言把递归过程中的信息保存在堆栈中。如果无限循环地递归,或者递归次数太多,则在堆栈中。如果无限循环地递归,或者递归次数太多,则产生产生“堆栈溢出堆栈溢出”错误。错误。例:用递归方法求阶乘。利用的数学公式为例:用递归方法求阶乘。利用的数学公式为n!=n*(n-1)!。当。当n=0时,时,n!=1。代码如下:代码如下:public long F(lo

49、ng n)if(n=0|n=1)return 1;else return n*F(n-1);6.5 属性属性6.5.1 属性的声明属性的声明 格式:格式:属性修饰符属性修饰符 属性的类型属性的类型 属性名称属性名称方法声明方法声明 说明:若属性是静态成员,通过说明:若属性是静态成员,通过“类名类名.属性成员名属性成员名”访问;若属性是非静态成员,通过访问;若属性是非静态成员,通过“对象名对象名.属性成员属性成员名名”访问。访问。通过访问器,类的属性成员可以返回一个值(通过访问器,类的属性成员可以返回一个值(get访访问器),或者接受外界通过赋值语句提供的值(问器),或者接受外界通过赋值语句提供

50、的值(set访问访问器)。器)。get访问器访问器 格式:格式:get 语句语句 说明:说明:get访问器中的语句主要是用访问器中的语句主要是用return语句返回某一个变语句返回某一个变量成员的值。量成员的值。例:例:class Circle protected int page=2;public int pa get return page;class Test static void Main()Circle MyCircle=new Circle();int n=MyCircle.pa*10;/读读pa属性属性 int m=MyCircle.page*10;/错误!错误!Page是是p

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

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁