《c#面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《c#面向对象程序设计.ppt(175页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第4章 面向对象的编程基础什么是面向对象编程什么是面向对象编程什么是面向对象编程什么是面向对象编程面向对象编程是当前最流行,同时也是技术最成熟,规范最完善的编程理念面向对象编程是当前最流行,同时也是技术最成熟,规范最完善的编程理念面向对象编程是当前最流行,同时也是技术最成熟,规范最完善的编程理念面向对象编程是当前最流行,同时也是技术最成熟,规范最完善的编程理念和技术,相对于传统的面向过程编程方法,面向对象编程具有强大的优势,和技术,相对于传统的面向过程编程方法,面向对象编程具有强大的优势,和技术,相对于传统的面向过程编程方法,面向对象编程具有强大的优势,和技术,相对于传统的面向过程编程方法,
2、面向对象编程具有强大的优势,解决了代码的重用问题,极大提高了开发人员的工作效率。如果一种语言支解决了代码的重用问题,极大提高了开发人员的工作效率。如果一种语言支解决了代码的重用问题,极大提高了开发人员的工作效率。如果一种语言支解决了代码的重用问题,极大提高了开发人员的工作效率。如果一种语言支持面向对象风格的编程,便称其为面向对象编程语言,持面向对象风格的编程,便称其为面向对象编程语言,持面向对象风格的编程,便称其为面向对象编程语言,持面向对象风格的编程,便称其为面向对象编程语言,C#C#就是支持面向对象就是支持面向对象就是支持面向对象就是支持面向对象编程的语言之一编程的语言之一编程的语言之一编
3、程的语言之一。为什么要使用面向对象编程为什么要使用面向对象编程为什么要使用面向对象编程为什么要使用面向对象编程面向过程的编程方法:模块之间依赖性强,代码重用率低,维护性差。面向过程的编程方法:模块之间依赖性强,代码重用率低,维护性差。面向过程的编程方法:模块之间依赖性强,代码重用率低,维护性差。面向过程的编程方法:模块之间依赖性强,代码重用率低,维护性差。面向对象的编程方法:每个模块用于实现特定的功能,且这些模块之间都是面向对象的编程方法:每个模块用于实现特定的功能,且这些模块之间都是面向对象的编程方法:每个模块用于实现特定的功能,且这些模块之间都是面向对象的编程方法:每个模块用于实现特定的功
4、能,且这些模块之间都是相互独立的。传统的应用程序在执行方式上通常是简单的、线性的,面向对相互独立的。传统的应用程序在执行方式上通常是简单的、线性的,面向对相互独立的。传统的应用程序在执行方式上通常是简单的、线性的,面向对相互独立的。传统的应用程序在执行方式上通常是简单的、线性的,面向对象编程以结构、数据的含义以及数据与数据之间的交互操作为基础,这意味象编程以结构、数据的含义以及数据与数据之间的交互操作为基础,这意味象编程以结构、数据的含义以及数据与数据之间的交互操作为基础,这意味象编程以结构、数据的含义以及数据与数据之间的交互操作为基础,这意味着开发人员需要将更多的精力放在程序的设计阶段,但程
5、序的可扩展性很强。着开发人员需要将更多的精力放在程序的设计阶段,但程序的可扩展性很强。着开发人员需要将更多的精力放在程序的设计阶段,但程序的可扩展性很强。着开发人员需要将更多的精力放在程序的设计阶段,但程序的可扩展性很强。第4章 面向对象的编程基础面向对象程序设计的基本概念面向对象程序设计的基本概念(1 1)类和对象)类和对象)类和对象)类和对象通常把具有同样性质和功能的东西所构成的集合叫作类。通常把具有同样性质和功能的东西所构成的集合叫作类。通常把具有同样性质和功能的东西所构成的集合叫作类。通常把具有同样性质和功能的东西所构成的集合叫作类。(2 2)属性、方法与事件)属性、方法与事件)属性、
6、方法与事件)属性、方法与事件属性是对象的状态和特点。属性是对象的状态和特点。属性是对象的状态和特点。属性是对象的状态和特点。方法是方法是方法是方法是对对对对象能象能象能象能够执够执够执够执行的一些操作,它体行的一些操作,它体行的一些操作,它体行的一些操作,它体现现现现了了了了对对对对象的功能。象的功能。象的功能。象的功能。事件是事件是事件是事件是对对对对象能象能象能象能够识别够识别够识别够识别和响和响和响和响应应应应的某些操作的某些操作的某些操作的某些操作。(3 3)封装)封装)封装)封装 所谓的封装,就是将用来描述客观事物的一组数据和所谓的封装,就是将用来描述客观事物的一组数据和所谓的封装,
7、就是将用来描述客观事物的一组数据和所谓的封装,就是将用来描述客观事物的一组数据和操作组装在一起,形成一个类。操作组装在一起,形成一个类。操作组装在一起,形成一个类。操作组装在一起,形成一个类。第4章 面向对象的编程基础(4 4)继承)继承)继承)继承类之间除了有相互交流或访问的关系以外,还类之间除了有相互交流或访问的关系以外,还类之间除了有相互交流或访问的关系以外,还类之间除了有相互交流或访问的关系以外,还可能存在着一种特殊的关系,这就是继承。在可能存在着一种特殊的关系,这就是继承。在可能存在着一种特殊的关系,这就是继承。在可能存在着一种特殊的关系,这就是继承。在VisualC#VisualC
8、#中只支持单继承,即一个派生类只能有一中只支持单继承,即一个派生类只能有一中只支持单继承,即一个派生类只能有一中只支持单继承,即一个派生类只能有一个基类。个基类。个基类。个基类。(5 5)重载)重载)重载)重载重载指的是方法名称一样,但如果参数不同,重载指的是方法名称一样,但如果参数不同,重载指的是方法名称一样,但如果参数不同,重载指的是方法名称一样,但如果参数不同,就会有不同的具体实现。重载主要有两类:方法重载就会有不同的具体实现。重载主要有两类:方法重载就会有不同的具体实现。重载主要有两类:方法重载就会有不同的具体实现。重载主要有两类:方法重载及运算符重载。及运算符重载。及运算符重载。及运
9、算符重载。(6 6)多态性)多态性)多态性)多态性所谓多态性就是在程序运行时,面向对象的语所谓多态性就是在程序运行时,面向对象的语所谓多态性就是在程序运行时,面向对象的语所谓多态性就是在程序运行时,面向对象的语言会自动判断对象的派生类型,并调用相应的方法。言会自动判断对象的派生类型,并调用相应的方法。言会自动判断对象的派生类型,并调用相应的方法。言会自动判断对象的派生类型,并调用相应的方法。4.1类类4.1.14.1.1类的声明及使用类的声明及使用类的声明及使用类的声明及使用任何类型都需要先声明,然后才使任何类型都需要先声明,然后才使用。我们能够直接使用用。我们能够直接使用int、double
10、和和string等基础类型,是因为等基础类型,是因为.NET基础类基础类库中已经声明了他们。一个类一旦被成库中已经声明了他们。一个类一旦被成功声明,就可以当成一种新的类型来使功声明,就可以当成一种新的类型来使用(引用类型)。用(引用类型)。C#中的类声明中的类声明格式格式格式格式:类的修饰符类的修饰符类的修饰符类的修饰符classclass类名类名类名类名:基类或接口基类或接口基类或接口基类或接口 类体;类体;类体;类体;类的访问修饰符是可选的,类的访问修饰符是可选的,类的访问修饰符是可选的,类的访问修饰符是可选的,C#C#中定义了以下几种访问修饰符:中定义了以下几种访问修饰符:中定义了以下几
11、种访问修饰符:中定义了以下几种访问修饰符:internalinternal:内部类,表明仅有本程序能够访问该类。内部类,表明仅有本程序能够访问该类。内部类,表明仅有本程序能够访问该类。内部类,表明仅有本程序能够访问该类。publicpublic:公有类,表示外界可以不受限制的访问该类。公有类,表示外界可以不受限制的访问该类。公有类,表示外界可以不受限制的访问该类。公有类,表示外界可以不受限制的访问该类。privateprivate私有类,定义在一个类中,在定义它的类中可以访私有类,定义在一个类中,在定义它的类中可以访私有类,定义在一个类中,在定义它的类中可以访私有类,定义在一个类中,在定义它的
12、类中可以访问它。问它。问它。问它。protectedprotected:保护类,表示可以访问该类或从该类派生的类型。保护类,表示可以访问该类或从该类派生的类型。保护类,表示可以访问该类或从该类派生的类型。保护类,表示可以访问该类或从该类派生的类型。(类和它的派生类可以访问该类)(类和它的派生类可以访问该类)(类和它的派生类可以访问该类)(类和它的派生类可以访问该类)abstract:abstract:抽象类,只能做其它类的基类。抽象类,只能做其它类的基类。抽象类,只能做其它类的基类。抽象类,只能做其它类的基类。sealed:sealed:密封类,该类不能做其他类的基类。密封类,该类不能做其他类
13、的基类。密封类,该类不能做其他类的基类。密封类,该类不能做其他类的基类。类的默认修饰符为类的默认修饰符为类的默认修饰符为类的默认修饰符为internal.internal.classclass和类名是必需的;基类或接口是可选的,但如果存在,和类名是必需的;基类或接口是可选的,但如果存在,和类名是必需的;基类或接口是可选的,但如果存在,和类名是必需的;基类或接口是可选的,但如果存在,则基类或接口就是必需的;类体是必需的,可以为空。则基类或接口就是必需的;类体是必需的,可以为空。则基类或接口就是必需的;类体是必需的,可以为空。则基类或接口就是必需的;类体是必需的,可以为空。C#的类名是一种标识符,
14、必须符合的类名是一种标识符,必须符合标识符标识符的命名规则。类名最好能够体现类的含义的命名规则。类名最好能够体现类的含义和用途。和用途。【例【例4-1】定义一个】定义一个Student类,用来对类,用来对学生的信息和功能进行描述。假设学生学生的信息和功能进行描述。假设学生具有学号、姓名、年龄、性别、平均成具有学号、姓名、年龄、性别、平均成绩等特征。绩等特征。【例【例【例【例5-15-1】using System;/using System;/引入名称空间引入名称空间public class Student/public class Student/定义学生类定义学生类 private stri
15、ng No;/private string No;/学号学号 private string Name;/private string Name;/姓名姓名 private int Age;/private int Age;/年龄年龄 private char Sex;/private char Sex;/性别性别 private double Aver;/private double Aver;/平均成绩平均成绩 4.2 类的成员定义在类体内的元素都是类的成员。类的主定义在类体内的元素都是类的成员。类的主要成员包括两种类型,即描述状态的数据成员要成员包括两种类型,即描述状态的数据成员和描述操作
16、的函数成员。和描述操作的函数成员。类的数据成员包括:类的数据成员包括:l l字段字段(域域)l l常量常量例如:下面的例如:下面的Person类定义了两个数据成员类定义了两个数据成员Class Person string name;const int age=1;/默认为默认为static属性属性 此例中,此例中,name即为字段成员,即为字段成员,age就是常就是常量成员。量成员。类的函数成员包括:类的函数成员包括:l l方法方法l l属性属性l l索引器索引器l l事件事件l l运算符运算符l l构造方法和析构方法构造方法和析构方法方法(函数)用来实现类执行的计算和操作方法(函数)用来实现
17、类执行的计算和操作,使用前必须先定义。方法(函数)具有一个参数使用前必须先定义。方法(函数)具有一个参数列表(可以为空);同时还具有一个返回类型,列表(可以为空);同时还具有一个返回类型,指定该方法计算和返回的值的类型。如果方法不指定该方法计算和返回的值的类型。如果方法不返回值,则返回值类型为返回值,则返回值类型为void。此时。此时return可可以不写。以不写。*一个一个return只能返回一个值。只能返回一个值。例如:例如:例如:例如:Class PersonClass Person string name;string name;int age=10;int age=10;void S
18、peak()void Speak()Console.WriteLine(“Hello World!”);Console.WriteLine(“Hello World!”);属性与访问器属性与访问器属性与访问器属性与访问器属性属性属性属性属性可以让用户可以象访问公有成员字属性可以让用户可以象访问公有成员字属性可以让用户可以象访问公有成员字属性可以让用户可以象访问公有成员字段一样访问私有成员字段。段一样访问私有成员字段。段一样访问私有成员字段。段一样访问私有成员字段。属性由一个字段声明和存取器组成,存属性由一个字段声明和存取器组成,存属性由一个字段声明和存取器组成,存属性由一个字段声明和存取器组成
19、,存取器指定在它们的值被读取或写入时需执行取器指定在它们的值被读取或写入时需执行取器指定在它们的值被读取或写入时需执行取器指定在它们的值被读取或写入时需执行的语句。的语句。的语句。的语句。属性声明的格式:属性声明的格式:属性声明的格式:属性声明的格式:【修饰符】【类型】属性名【修饰符】【类型】属性名【修饰符】【类型】属性名【修饰符】【类型】属性名 getget【getget访问体】访问体】访问体】访问体】setset【setset访问体】访问体】访问体】访问体】get 访问器访问器可以对成员的值进行读操作,可以对成员的值进行读操作,get访问器对应一个不带参数的方法它返回访问器对应一个不带参数
20、的方法它返回一个和属性相同类型的值。一个和属性相同类型的值。setset访问器访问器访问器访问器setset访问器可以对成员的值进行操作。访问器可以对成员的值进行操作。访问器可以对成员的值进行操作。访问器可以对成员的值进行操作。通过通过通过通过valuevalue隐式参数间接的对私有字段赋值。隐式参数间接的对私有字段赋值。隐式参数间接的对私有字段赋值。隐式参数间接的对私有字段赋值。并且可以包含大量的语句,对赋予的值进行并且可以包含大量的语句,对赋予的值进行并且可以包含大量的语句,对赋予的值进行并且可以包含大量的语句,对赋予的值进行检查,如果值不安全或者不符合要求,就可检查,如果值不安全或者不符
21、合要求,就可检查,如果值不安全或者不符合要求,就可检查,如果值不安全或者不符合要求,就可以进行提示。这样可以避免因为给类的数据以进行提示。这样可以避免因为给类的数据以进行提示。这样可以避免因为给类的数据以进行提示。这样可以避免因为给类的数据成员设置了错误的值而导致的错误。成员设置了错误的值而导致的错误。成员设置了错误的值而导致的错误。成员设置了错误的值而导致的错误。请看下面的代码:请看下面的代码:请看下面的代码:请看下面的代码:usingSystem;usingSystem;n nclassRectangleclassRectanglen nn nprotectedintwidth;prote
22、ctedintwidth;n nprotectedintheight;protectedintheight;n npublicintWidthpublicintWidthn nn ngetgetn nn nreturnwidth;returnwidth;n nn nsetsetn nn nif(value0)if(value0)n nwidth=value;width=value;n nelseelsen nConsole.WriteLine(WidthConsole.WriteLine(Width的值不能为负数的值不能为负数的值不能为负数的值不能为负数););n nn nn n public
23、intHeightpublicintHeightn nn ngetgetn nn nreturnheight;returnheight;n nn nsetsetn nn nif(value0)if(value0)n nheight=value;height=value;n nelseelsen nConsole.WriteLine(HeightConsole.WriteLine(Height的值不能为负数的值不能为负数的值不能为负数的值不能为负数););n nn nn npublicintAreapublicintArean nn ngetgetn nreturnwidth*height;re
24、turnwidth*height;n nn nn npublicRectangle()publicRectangle()n nn nn nstaticvoidMain(stringargs)staticvoidMain(stringargs)n nn nRectanglerect=newRectangle();Rectanglerect=newRectangle();n nrect.Height=2;rect.Width=4;rect.Height=2;rect.Width=4;n nConsole.WriteLine(Console.WriteLine(长方形:宽长方形:宽长方形:宽长方形:
25、宽=0,=0,长长长长=1,=1,面积面积面积面积=2,rect.Width,rect.Height,rect.Area);=2,rect.Width,rect.Height,rect.Area);n nRectanglerect1=newRectangle();Rectanglerect1=newRectangle();n nrect1.Height=-2;rect.Width=-4;rect1.Height=-2;rect.Width=-4;n nConsole.WriteLine(Console.WriteLine(长方形:宽长方形:宽长方形:宽长方形:宽=0,=0,长长长长=1,=1,
26、面积面积面积面积=2,=2,rect1.Width,rect1.Height,rect1.Area);rect1.Width,rect1.Height,rect1.Area);n nC#C#中的属性分别通过中的属性分别通过中的属性分别通过中的属性分别通过getget和和和和setset访问器来对属性的值进行读写。访问器来对属性的值进行读写。访问器来对属性的值进行读写。访问器来对属性的值进行读写。getget和和和和setset访问器是可选的。访问器是可选的。访问器是可选的。访问器是可选的。getget访问器体与方法体相似。它必须返回属性类型的值。执行访问器体与方法体相似。它必须返回属性类型的值
27、。执行访问器体与方法体相似。它必须返回属性类型的值。执行访问器体与方法体相似。它必须返回属性类型的值。执行getget访问器相当于读取字段的值。访问器相当于读取字段的值。访问器相当于读取字段的值。访问器相当于读取字段的值。getget访问器可以用访问器可以用访问器可以用访问器可以用returnreturn语语语语句返回一个属性值。句返回一个属性值。句返回一个属性值。句返回一个属性值。setset访问器与返回访问器与返回访问器与返回访问器与返回voidvoid的方法类似。它使用称为的方法类似。它使用称为的方法类似。它使用称为的方法类似。它使用称为valuevalue的隐式的隐式的隐式的隐式参数,
28、此参数的类型是属性的类型。参数,此参数的类型是属性的类型。参数,此参数的类型是属性的类型。参数,此参数的类型是属性的类型。根据根据根据根据getget和和和和setset访问器是否存在,属性可分为以下类型:访问器是否存在,属性可分为以下类型:访问器是否存在,属性可分为以下类型:访问器是否存在,属性可分为以下类型:读写属性读写属性读写属性读写属性只读属性只读属性只读属性只读属性只写属性只写属性只写属性只写属性 属性与字段的区别:属性与字段的区别:属性与字段的区别:属性与字段的区别:l l属性可以实现只读或只写,而字段不能属性可以实现只读或只写,而字段不能属性可以实现只读或只写,而字段不能属性可以
29、实现只读或只写,而字段不能l l属性的属性的属性的属性的setset方法可以对用户指定的值方法可以对用户指定的值方法可以对用户指定的值方法可以对用户指定的值(valuevalue),进行有效检查,而保证只有正确),进行有效检查,而保证只有正确),进行有效检查,而保证只有正确),进行有效检查,而保证只有正确的状态才能得到设置,而字段不能的状态才能得到设置,而字段不能的状态才能得到设置,而字段不能的状态才能得到设置,而字段不能l l属性的属性的属性的属性的getget方法不仅可以返回字段变量的值,方法不仅可以返回字段变量的值,方法不仅可以返回字段变量的值,方法不仅可以返回字段变量的值,还可以返回经
30、过计算或处理过的数据,如上还可以返回经过计算或处理过的数据,如上还可以返回经过计算或处理过的数据,如上还可以返回经过计算或处理过的数据,如上例中的例中的例中的例中的AreaArea属性属性属性属性l l属性在实现时,实际上是方法的实现。属性在实现时,实际上是方法的实现。属性在实现时,实际上是方法的实现。属性在实现时,实际上是方法的实现。在在在在C#C#中,属性更好地表达了事物的状态的中,属性更好地表达了事物的状态的中,属性更好地表达了事物的状态的中,属性更好地表达了事物的状态的设置与获取。在设置与获取。在设置与获取。在设置与获取。在C#C#中一般采用以下原则:中一般采用以下原则:中一般采用以下
31、原则:中一般采用以下原则:l l若在类的内部记录事物的状态信息,则使用字段若在类的内部记录事物的状态信息,则使用字段若在类的内部记录事物的状态信息,则使用字段若在类的内部记录事物的状态信息,则使用字段变量变量变量变量l l字段变量一般使用字段变量一般使用字段变量一般使用字段变量一般使用private/protectedprivate/protected修饰修饰修饰修饰l l对外公布信息时,则使用属性对外公布信息时,则使用属性对外公布信息时,则使用属性对外公布信息时,则使用属性l l属性一般与某个或某几个字段变量有对应关系属性一般与某个或某几个字段变量有对应关系属性一般与某个或某几个字段变量有对
32、应关系属性一般与某个或某几个字段变量有对应关系属性与方法的主要区别:属性与方法的主要区别:11、属性不必使用括号,但方法一定要使用括号。、属性不必使用括号,但方法一定要使用括号。、属性不必使用括号,但方法一定要使用括号。、属性不必使用括号,但方法一定要使用括号。22、属性不能指定参数,方法可以指定参数。、属性不能指定参数,方法可以指定参数。、属性不能指定参数,方法可以指定参数。、属性不能指定参数,方法可以指定参数。33、属性不能使用、属性不能使用、属性不能使用、属性不能使用voidvoid类型,方法可以使用类型,方法可以使用类型,方法可以使用类型,方法可以使用voidvoid类类类类型。型。型
33、。型。构造函数与析构函数 构造方法是名称与类名相同的特殊构造方法是名称与类名相同的特殊方法方法,当类被实例化时,首先执行构造当类被实例化时,首先执行构造方法;方法;析构方法也是一种特殊的方法,其析构方法也是一种特殊的方法,其名称由名称由“”和类名构成,当类的实例和类名构成,当类的实例被撤销时,执行的方法。被撤销时,执行的方法。1构造函数构造函数 构构造造函函数数主主要要用用来来为为对对象象分分配配存存储储空空间间,完完成成初始化操作(如给类的成员变量赋值等)。初始化操作(如给类的成员变量赋值等)。class class 类类名名 类类名(参数表)名(参数表)语语句;句;在在在在C#C#C#C#
34、中,类的构造函数遵循以下规定。中,类的构造函数遵循以下规定。中,类的构造函数遵循以下规定。中,类的构造函数遵循以下规定。(1 1 1 1)构造函数的函数名和类的名称一样。)构造函数的函数名和类的名称一样。)构造函数的函数名和类的名称一样。)构造函数的函数名和类的名称一样。(2 2 2 2)当某个类没有构造函数时,系统将自动为其创建构)当某个类没有构造函数时,系统将自动为其创建构)当某个类没有构造函数时,系统将自动为其创建构)当某个类没有构造函数时,系统将自动为其创建构 造函数,这种构造函数称为默认构造函数。造函数,这种构造函数称为默认构造函数。造函数,这种构造函数称为默认构造函数。造函数,这种
35、构造函数称为默认构造函数。如果一个类含有构造函数则系统不创建如果一个类含有构造函数则系统不创建如果一个类含有构造函数则系统不创建如果一个类含有构造函数则系统不创建(3 3 3 3)构造函数的访问修饰符总是)构造函数的访问修饰符总是)构造函数的访问修饰符总是)构造函数的访问修饰符总是publicpublicpublicpublic。如果是。如果是。如果是。如果是privateprivateprivateprivate 则表示这个类不能被实例化,这通常用于只含有静则表示这个类不能被实例化,这通常用于只含有静则表示这个类不能被实例化,这通常用于只含有静则表示这个类不能被实例化,这通常用于只含有静 态
36、成员的类中。态成员的类中。态成员的类中。态成员的类中。(4 4 4 4)构造函数由于不需要显式调用,因而不用声明返回)构造函数由于不需要显式调用,因而不用声明返回)构造函数由于不需要显式调用,因而不用声明返回)构造函数由于不需要显式调用,因而不用声明返回 类型。类型。类型。类型。(5 5 5 5)构造函数可以带参数也可以不带参数。)构造函数可以带参数也可以不带参数。)构造函数可以带参数也可以不带参数。)构造函数可以带参数也可以不带参数。下面代码说明了构造方法的声明方式:下面代码说明了构造方法的声明方式:n nusingSystem;usingSystem;n nusingSystem.Coll
37、ections.Generic;usingSystem.Collections.Generic;n nusingSystem.Text;usingSystem.Text;n nnamespacenamespace面向对象面向对象面向对象面向对象3 3n n n nn nclassDogclassDogn npublicstringname;publicstringname;n npublicDog()publicDog()n nn nname=name=未知未知未知未知;n nConsole.WriteLine(DogConsole.WriteLine(Dog类已经被实例化类已经被实例化类已经
38、被实例化类已经被实例化););n nn npublicvoidBark()publicvoidBark()n nn nConsole.WriteLine(Console.WriteLine(汪汪汪汪汪汪汪汪););n nn nstaticvoidMain(stringargs)staticvoidMain(stringargs)n nn nDogmyDog=newDog();DogmyDog=newDog();n nConsole.Write(myDogConsole.Write(myDog的名字为的名字为的名字为的名字为0,myDog.name);0,myDog.name);n nConso
39、le.WriteLine(Console.WriteLine(叫声为叫声为叫声为叫声为););n nmyDog.Bark();myDog.Bark();n nConsole.ReadKey();Console.ReadKey();n nn nn n 带参数的构造函数带参数的构造函数上面例子中的构造函数不带参数,上面例子中的构造函数不带参数,构造函数也可以带有参数构造函数也可以带有参数.一个类可以有多个具有不同参数的一个类可以有多个具有不同参数的构造函数,根据参数类型和个数的不同构造函数,根据参数类型和个数的不同来完成不同的功能,这种方式称为构造来完成不同的功能,这种方式称为构造函数的重载。函数
40、的重载。请看下面代码:请看下面代码:请看下面代码:请看下面代码:请看下面代码:请看下面代码:classDogclassDogn nn npublicstringname;publicstringname;n npublicintage;publicintage;n npublicDog()publicDog()n nn nname=name=未知未知未知未知;n nage=1;age=1;n nConsole.WriteLine(Dog():DogConsole.WriteLine(Dog():Dog类已经被实例化类已经被实例化类已经被实例化类已经被实例化););n nn npublicDog
41、(stringdogName)publicDog(stringdogName)n nn nname=dogName;name=dogName;n nage=1;age=1;n nConsole.WriteLine(Dog(string):DogConsole.WriteLine(Dog(string):Dog类已经被实例化类已经被实例化类已经被实例化类已经被实例化););n nn n析构函数析构函数析构函数析构函数 析构函数在对象销毁时被调用,常用来释放对象占用析构函数在对象销毁时被调用,常用来释放对象占用析构函数在对象销毁时被调用,常用来释放对象占用析构函数在对象销毁时被调用,常用来释放对象
42、占用的存储空间。的存储空间。的存储空间。的存储空间。class class class class 类名类名类名类名 类名()类名()类名()类名()语句语句语句语句 ;析构函数具有以下特点。析构函数具有以下特点。析构函数具有以下特点。析构函数具有以下特点。(1 1 1 1)析构函数不能带有参数。)析构函数不能带有参数。)析构函数不能带有参数。)析构函数不能带有参数。(2 2 2 2)析构函数不能)析构函数不能)析构函数不能)析构函数不能拥拥拥拥有有有有访问访问访问访问修修修修饰饰饰饰符。符。符。符。(3 3 3 3)不能显式地调用析构函数。)不能显式地调用析构函数。)不能显式地调用析构函数。
43、)不能显式地调用析构函数。(4 4 4 4)析构函数的命名规则是在类名前加上一个)析构函数的命名规则是在类名前加上一个)析构函数的命名规则是在类名前加上一个)析构函数的命名规则是在类名前加上一个 号。号。号。号。(5 5 5 5)析构函数在对象销毁时自动调用。)析构函数在对象销毁时自动调用。)析构函数在对象销毁时自动调用。)析构函数在对象销毁时自动调用。using system;using system;class Examclass Exam static public int a;static public int a;public int b;public int b;public Ex
44、am()public Exam()a=0;a=0;b=0;b=0;public Exam(int m,int n)public Exam(int m,int n)a=m;a=m;b=n;b=n;Exam()Exam()using system;using system;Class First()Class First()public First()public First()console.writeLine(“Firsts constructor is called”);console.writeLine(“Firsts constructor is called”);First()Firs
45、t()console.writeLine(“Firsts destructor is called”);console.writeLine(“Firsts destructor is called”);Class Second()Class Second()public Second()public Second()console.writeLine(“Seconds constructor is called”);console.writeLine(“Seconds constructor is called”);Second()Second()console.writeLine(“Seco
46、nds destructor is called”);console.writeLine(“Seconds destructor is called”);Class Third()Class Third()public Third()public Third()console.writeLine(“Thirds constructor is called”);console.writeLine(“Thirds constructor is called”);Third()Third()console.writeLine(“Thirds destructor is called”);consol
47、e.writeLine(“Thirds destructor is called”);Public class MainClassPublic class MainClass public static void main()public static void main()First myobject1=new First();First myobject1=new First();Second myobject2=new Second();Second myobject2=new Second();Third myobject3=new Third();Third myobject3=ne
48、w Third();索引器可以让我们把对象当成数组一样访问。索引器可以让我们把对象当成数组一样访问。事件用于定义可由类生成的通知或者消息,事件用于定义可由类生成的通知或者消息,事件会导致相关代码的执行。事件会导致相关代码的执行。运算符通过重载,可以扩大运算符的功能。运算符通过重载,可以扩大运算符的功能。访问修饰符访问修饰符访问修饰符访问修饰符类成员访问修饰符的意义类成员访问修饰符的意义类成员访问修饰符的意义类成员访问修饰符的意义访问修饰符访问修饰符意义意义publicpublic访问不受限制,可以在类内和类外的任何代码中访问访问不受限制,可以在类内和类外的任何代码中访问protectedpro
49、tected能够在类的内部和派生类中访问能够在类的内部和派生类中访问internalinternal可以在类所在的程序中访问可以在类所在的程序中访问privateprivate只能在类的内部进行访问只能在类的内部进行访问访问修饰符都可用于类的成员,当访问修饰符都可用于类的成员,当没有定义访问修饰符时,类的成员的默没有定义访问修饰符时,类的成员的默认修饰符为认修饰符为private。下面程序说明了类成员访问修饰符的使下面程序说明了类成员访问修饰符的使用方法用方法 classVehicleclassVehiclepublicstringmodel;publicstringmodel;protect
50、edstringengine;protectedstringengine;privatestringdesigner;privatestringdesigner;internalstringfactory;internalstringfactory;publicvoidDive()publicvoidDive()Console.WriteLine(Console.WriteLine(我喜欢它我喜欢它我喜欢它我喜欢它););classManufactorclassManufactorstaticvoidMain(stringargs)staticvoidMain(stringargs)Vehic