第4章 面向对象基础_第1页
第4章 面向对象基础_第2页
第4章 面向对象基础_第3页
第4章 面向对象基础_第4页
第4章 面向对象基础_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4 4章章 面向对象基础面向对象基础目标目标什么是面向对象编程什么是面向对象编程OOPOOP的特征:接口、封装、继承和多态的特征:接口、封装、继承和多态类声明、以及类中的字段、属性和方法类声明、以及类中的字段、属性和方法构造函数和析构函数构造函数和析构函数索引器索引器C# 中类的定义方法中类的定义方法在在 C# C# 中,类的定义方法同结构体类似,但中,类的定义方法同结构体类似,但类使用类使用 class class 关键字关键字进行定义:进行定义:类修饰符类修饰符 class 类型名类型名 成员名成员名1; 类型名类型名 成员名成员名2; . 返回值类型返回值类型 成员函数名成员函数名(

2、参数列表参数列表) / . 类的访问级别类的访问级别访问修饰符访问修饰符含义含义public表明不限制对类的访问。表明不限制对类的访问。protected表明这个类只能被这个类的成员或派生类成员访问表明这个类只能被这个类的成员或派生类成员访问internal表明只能从当前程序集中访问该类,但其他程序集表明只能从当前程序集中访问该类,但其他程序集不可访问。不可访问。private表明这个类只能被本身的成员所访问。表明这个类只能被本身的成员所访问。abstract抽象类,该类含有抽象成员,不能被实例化,只能抽象类,该类含有抽象成员,不能被实例化,只能用作基类,即继承。用作基类,即继承。sealed

3、密封类,不能从这个类再派生出其他的类,不允许密封类,不能从这个类再派生出其他的类,不允许被继承,密封类不能同时为抽象类。被继承,密封类不能同时为抽象类。创建创建C# 中类的对象中类的对象类的使用类的使用对象遵循先创建后使用的原则。对象遵循先创建后使用的原则。在在 C# C# 中,我们使用中,我们使用 new new 运算符运算符来创建类的对象,然来创建类的对象,然后使用后使用”.”.”来访问对象中的成员。来访问对象中的成员。类名类名 对象名对象名 = new 类名类名();对象名对象名.数据成员数据成员对象名对象名.成员函数成员函数构造函数和析构函数构造函数和析构函数构造函数:构造函数:构造函

4、数是指在创建类的对象时自动执行的函构造函数是指在创建类的对象时自动执行的函数,由它负责对类的对象进行初始化。数,由它负责对类的对象进行初始化。析构函数:析构函数:析构函数是指在类的对象销毁时自动执行的函析构函数是指在类的对象销毁时自动执行的函数,由它负责对类的对象进行销毁。数,由它负责对类的对象进行销毁。构造函数构造函数语法格式:语法格式:构造函数的调用:构造函数的调用:类的构造函数是在创建类的对象时自动被调用的类的构造函数是在创建类的对象时自动被调用的访问修饰符访问修饰符 类名(形参列表)类名(形参列表) 函数体;函数体;构造函数构造函数注意:注意: 构造函数的名字必须构造函数的名字必须与类

5、名相同与类名相同;构造函数可以带参数,但构造函数可以带参数,但没有返回值没有返回值;构造函数通常是公有的(使用构造函数通常是公有的(使用publicpublic访问限制符声明)访问限制符声明)构造函数构造函数在对象定义时被自动调用在对象定义时被自动调用;如果没有给类定义构造函数,则编译系统会自动生成一个如果没有给类定义构造函数,则编译系统会自动生成一个缺省的构造函数缺省的构造函数构造函数构造函数可以被重载,但不可以被继承可以被重载,但不可以被继承。/A simple constructorusing System;class ConstructorDemopublic int x;public

6、 ConstructorDemo()x = 10;class Test public static void Main() ConstructorDemo cd = new ConstructorDemo(); Console.WriteLine(cd.x); 调用构造函数,此时调用构造函数,此时cd.x的值的值为为10。创建对象时,由。创建对象时,由new调调用此构造函数用此构造函数构造函数构造函数带参数构造函数带参数构造函数只要在构造函数名之后的圆括号中声明参数即可只要在构造函数名之后的圆括号中声明参数即可 public class Student private string Class

7、Name; private string Name; public Student(string name , string className) Name = name; ClassName = className; 静态构造函数静态构造函数 静态构造函数主要用于初始化一些静态的变量。静态构造函数主要用于初始化一些静态的变量。静态构静态构造函数只会执行一次造函数只会执行一次,而且是在创建此类的第一个实,而且是在创建此类的第一个实例或引用任何静态成员之前,由例或引用任何静态成员之前,由.NET.NET自动调用。自动调用。 例4.10 class Program static void Main

8、(string args) Console.WriteLine(a=0, Test.a); Console.ReadLine(); class Test public static int a = 9; static Test() a = 1; 静态构造函数没有修饰符。静态构造函数没有修饰符。静态构造函数没有参数。静态构造函数没有参数。一个类中只能有一个静态构造函数一个类中只能有一个静态构造函数。静态构造函数静态构造函数只能运行一次只能运行一次。静态构造函数静态构造函数不能被继承不能被继承。若没有写静态构造函数,而类中包含带有初始值设定的静态成员若没有写静态构造函数,而类中包含带有初始值设定的

9、静态成员,则编译器会生成默认的静态构造函数。,则编译器会生成默认的静态构造函数。静态构造函数与实例构造函数不冲突,可同时出现。静态构造函数与实例构造函数不冲突,可同时出现。无用单元收集和析构函数无用单元收集和析构函数析构函数析构函数虽然有垃圾回收机制的存在,但是虽然有垃圾回收机制的存在,但是在释放对象使用的非托管在释放对象使用的非托管资源时,必须使用析构函数资源时,必须使用析构函数(destructor)(destructor) 。它可以用来确保。它可以用来确保对象完全结束。对象完全结束。基本形式基本形式 class-name() /destructor code “析构函数是在无用单元收集的

10、紧前面调用析构函数是在无用单元收集的紧前面调用”析构函数的名称与类名相同但在名称前面加了一个析构函数的名称与类名相同但在名称前面加了一个符号符号“”析构函数析构函数不能接受任何参数不能接受任何参数,也,也不返回任何值不返回任何值析构函数析构函数不能使用任何访问限制修饰符不能使用任何访问限制修饰符析构函数的代码中通常只进行销毁对象的工作,而不应该执行其析构函数的代码中通常只进行销毁对象的工作,而不应该执行其他的操作他的操作析构函数不能被继承,也不能被显示地调用析构函数不能被继承,也不能被显示地调用析构函数特征析构函数特征类的成员类的成员在类中,成员定义包括字段、方法和属性的定义。在类中,成员定义

11、包括字段、方法和属性的定义。所有的成员都有自己的访问级别,详见下表:所有的成员都有自己的访问级别,详见下表: 成员访问修饰符成员访问修饰符修饰符修饰符说明说明public公共成员。所属类的成员以及非所属类的成员都可以访公共成员。所属类的成员以及非所属类的成员都可以访问问internal内部成员,只能从当前程序集中访问内部成员,只能从当前程序集中访问private私有成员,只有私有成员,只有所属类的成员所属类的成员才能访问(默认)才能访问(默认)protected保护成员,成员可以从定义它的类内部,以及派生类访保护成员,成员可以从定义它的类内部,以及派生类访问问p r o t e c t e d

12、 internal内部保护成员,成员在当前程序集、定义它的类内部和内部保护成员,成员在当前程序集、定义它的类内部和派生类访问派生类访问 字段、方法和属性都可以使用关键字字段、方法和属性都可以使用关键字staticstatic来声明,来声明,表明它们是类的静态成员表明它们是类的静态成员, ,而不是对象实例的成员。而不是对象实例的成员。字段定义字段定义字段字段表示与对象或类相关联的变量,即表示与对象或类相关联的变量,即在定义时声明在定义时声明的变量。的变量。 字段可以是值类型,也可以引用类型。字段可以是值类型,也可以引用类型。语法:语法: 字段修饰符字段修饰符 类型类型 变量声明列表变量声明列表

13、public class Employee private string name; /字段字段 private uint age; /字段字段 属性的声明属性的声明语法:语法: 访问修饰符访问修饰符 (static) (static) 数据类型数据类型 属性名属性名 set get 当对变量进行赋值运算时自动调用当对变量进行赋值运算时自动调用setset访问器,其他时候调访问器,其他时候调用用getget以读取数据。以读取数据。 例4.12属性特征属性特征属性可以只有一个访问器,只有属性可以只有一个访问器,只有setset访问器的属性被视为只写属性,访问器的属性被视为只写属性,只有只有get

14、get访问器的属性被视为只读属性,同时具有这两个访问器的访问器的属性被视为只读属性,同时具有这两个访问器的属性是读写属性。属性是读写属性。 。getget属性访问器用于返回属性值,而属性访问器用于返回属性值,而setset访问器用于分配新值。访问器用于分配新值。访问器可以使有的访问级别取决于属性的可访问性,访问器的可访问器可以使有的访问级别取决于属性的可访问性,访问器的可访问性不能高于它所属的属性。访问性不能高于它所属的属性。属性的属性的getget访问器通过访问器通过returnreturn来读取属性的值来读取属性的值,即必须有一个属性,即必须有一个属性类型的返回值,类型的返回值,setse

15、t访问器通过访问器通过valuevalue来设置属性的值来设置属性的值。声明方法声明方法语法语法访问修饰符访问修饰符 返回类型返回类型 (参数列表参数列表)/ 方法主体方法主体 方法只能在类或结构中声明。方法只能在类或结构中声明。方法的参数方法的参数 参数的功效就是能使信息在方法中传入或传出,当声明一参数的功效就是能使信息在方法中传入或传出,当声明一个方法时,包含的参数说明是形式参数(形参)。当调用一个方法时,包含的参数说明是形式参数(形参)。当调用一个方法时,给出的对应实际参数是实参,传入或传出就是在个方法时,给出的对应实际参数是实参,传入或传出就是在实参与形参之间发生的,在实参与形参之间发

16、生的,在C#C#中实参与形参的传递方式有:中实参与形参的传递方式有:值参数,不含任何修饰符。值参数,不含任何修饰符。 引用型参数,以引用型参数,以ref ref 修饰符声明。修饰符声明。 输出参数,以输出参数,以out out 修饰符声明。修饰符声明。 数组型参数,以数组型参数,以paramsparams 修饰符声明。修饰符声明。值参数值参数当利用值向方法传递参数时,编译程序给实参的值当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法。被调用做一份拷贝,并且将此拷贝传递给该方法。被调用的方法不会修改内存中实参的值,所以使用值参数的方法不会修改内存中实参的值,所以使

17、用值参数时,可以保证实际值是安全的。时,可以保证实际值是安全的。示例4.2引用型参数引用型参数 (REF)引用型参数和值参不同,引用型参数并不会开辟新的内存区域。引用型参数和值参不同,引用型参数并不会开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。内存中的地址传递给方法。引用型参数分为以下两种情况:引用型参数分为以下两种情况:方法的形参本身就是引用类型。方法的形参本身就是引用类型。 示例示例4.34.3通过声明通过声明refref关键字使参数按引用传递关键字使参数按引用传递 示例示例4.44.

18、4class Program static void Main(string args) Test t = new Test(); StringBuilder builder = new StringBuilder(hello); t.Add(builder); Console.WriteLine(builder); Console.ReadLine(); class Test public void Add(StringBuilder s) s.Append( World); class Program static void Main(string args) Test t = new T

19、est(); int n = 10; t.Add(ref n); Console.WriteLine(n=0, n); Console.ReadLine(); class Test public void Add(ref int num) num += 10; 在值类型参数前加上关键字在值类型参数前加上关键字refref,表明实参与形参的传递方式是引,表明实参与形参的传递方式是引用的,对形参的修改会影响实参的值。用的,对形参的修改会影响实参的值。refref要求变量在作为参数传递之前必须进行初始化。要求变量在作为参数传递之前必须进行初始化。在使用在使用refref时,无论是在定义形参还是在方法

20、调用时,都需要在参时,无论是在定义形参还是在方法调用时,都需要在参数前添加相应的数前添加相应的ref.ref.输出参数输出参数 (OUT)与引用型参数类似,输出型参数也不开辟新的内存与引用型参数类似,输出型参数也不开辟新的内存区域。区域。与引用型参数的差别在于,调用方法前无需对变量与引用型参数的差别在于,调用方法前无需对变量进行初始化。进行初始化。当希望方法返回多个值时,声明当希望方法返回多个值时,声明outout方法很有用。方法很有用。示例4.5 class Program static void Main(string args) int s = 95, 98, 89, 69, 100,

21、78, 60, 68, 49 ; Demo d = new Demo(); int m, n; d.MaxMinScore(s, out m, out n); Console.WriteLine(最高分为最高分为0, m); Console.WriteLine(最低分为最低分为0, n); class Demo public void MaxMinScore(int s, out int max, out int min) max = s0; min = s0; for (int i = 1; i s.Length; i+) if (max si) min = si; 使用使用outout关键

22、字的实参变量不必进行初始化关键字的实参变量不必进行初始化, refref的实参变的实参变量必须初始化。量必须初始化。outout只能用于从方法中传出值,而只能用于从方法中传出值,而不能从方法调用处接受实参不能从方法调用处接受实参数据数据。在方法内在方法内outout参数被认为是未赋过值的,所以在方法结束之前应该参数被认为是未赋过值的,所以在方法结束之前应该对对outout参数赋值。参数赋值。和使用和使用refref一样,一样,无论是在定义形参还是在方法调用时无论是在定义形参还是在方法调用时,都,都需要在参数前添加相应的需要在参数前添加相应的out.out. 数组型参数(数组型参数(PARAMS

23、)参数数组可以使用个数不定的参数调用函数,使用参数数组可以使用个数不定的参数调用函数,使用paramsparams关键字关键字来定义。来定义。参数数组可以简化代码,因为它不必从调用代码中传递数组,而参数数组可以简化代码,因为它不必从调用代码中传递数组,而是传递可在函数中使用的一个数组中相同类型的几个参数。是传递可在函数中使用的一个数组中相同类型的几个参数。例4.6class Program static void Main(string args) Demo d = new Demo(); int a = 1, 3, 4, 5, 6, 7 ; int sum = d.Params(a); Co

24、nsole.WriteLine(sum=0, sum); sum = d.Params(1, 3, 5); Console.WriteLine(sum=0, sum); sum = d.Params(); Console.WriteLine(sum=0, sum); class Demo public int Params(params int p) int sum = 0; foreach (int s in p) sum += s; return sum; 一个方法中只能声明一个一个方法中只能声明一个 paramsparams 参数。参数。ParamsParams参数必须放在所有参数的后面

25、,即参数必须放在所有参数的后面,即paramsparams关键关键字之后不允许有任何其他参数。字之后不允许有任何其他参数。ParamsParams参数所定义的数组必须是一维数组。参数所定义的数组必须是一维数组。ParamsParams参数不能同时与参数不能同时与refref或或outout使用。使用。方法重载方法重载方法签名是由方法名称和一个参数列表(方法的参数顺序和类方法签名是由方法名称和一个参数列表(方法的参数顺序和类型)组成。型)组成。同一类中的方法可以有相同的方法名,同名方法的参数不能完同一类中的方法可以有相同的方法名,同名方法的参数不能完全相同,即全相同,即参数类型不同,或者参数个数

26、不同参数类型不同,或者参数个数不同,这被称为方法,这被称为方法的重载。的重载。重载方法有两种方式重载方法有两种方式指定不同个数的参数指定不同个数的参数指定不同类型的参数指定不同类型的参数 例4.7MAIN函数函数MainMain函数是函数是C#C#应用程序的入口点,在执行过程开始时,会执行应用程序的入口点,在执行过程开始时,会执行MainMain函数,在函数,在MainMain函数执行完毕时,执行过程就结束了。函数执行完毕时,执行过程就结束了。MainMain函数必须是类或结构的静态方法,且返回值必须是函数必须是类或结构的静态方法,且返回值必须是intint或或voidvoid。Main()M

27、ain()的可选参数的可选参数argsargs是从应用程序的外部接受信息的方法,这是从应用程序的外部接受信息的方法,这些信息在运行期间指定,其形式是命令行参数。些信息在运行期间指定,其形式是命令行参数。 例 4.8静态成员静态成员静态类只能包含静态成员,不能包含实例成员,但可静态类只能包含静态成员,不能包含实例成员,但可以有常量成员。以有常量成员。静态类不能有实例构造函数,系统也不会为它提供默静态类不能有实例构造函数,系统也不会为它提供默认构造函数,但它可以包含静态构造函数。认构造函数,但它可以包含静态构造函数。静态类既不能实例化,也不能被继承。静态类既不能实例化,也不能被继承。THIS关键字

28、关键字this this 关键字用于引用类的当前实例。关键字用于引用类的当前实例。由于静态成员函数存在于类中,并且不是对象的一部分,因此静由于静态成员函数存在于类中,并且不是对象的一部分,因此静态成员函数没有态成员函数没有 this this 指针。指针。this this 关键字可用于从构造函数、实例方法和实例访问器中访问成关键字可用于从构造函数、实例方法和实例访问器中访问成员。员。 THIS关键字关键字在成员函数内部引用被具有相似名称的局部变量隐藏的成员,在成员函数内部引用被具有相似名称的局部变量隐藏的成员,如:如: public Circle( int x ,int y) this.x

29、= x; this.y =y; /此时若不使用此时若不使用thisthis,则不能访问同名的数据成员,则不能访问同名的数据成员x,yx,y. .把对象作为参数传递到其它方法。如:把对象作为参数传递到其它方法。如: CalcTax(this);声明索引器。声明索引器。索引器索引器索引器是索引器是 C#C# 的简单组件。的简单组件。它可以像访问数组一样访问类中的数组型对象,通过对对象元素它可以像访问数组一样访问类中的数组型对象,通过对对象元素的下标进行索引,就可以访问指定的对象。的下标进行索引,就可以访问指定的对象。语法:语法: public public 数据类型数据类型 thisthis参数类型参数类型 参数名参数名, set set get get class StudentN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论