第3章面向对象编程基础.ppt
《第3章面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《第3章面向对象编程基础.ppt(103页珍藏版)》请在三一办公上搜索。
1、第3章 面向对象编程基础,3.1 面向对象概念对象是面向对象编程的基本成分。什么是对象?可以说任何事物都是对象。对象可以是现实世界中的一个物理对象,也可以是抽象的概念或规则。对象可用它本身的一组属性和操作功能来定义。例如:对于自行车对象,它的颜色、车轮个数等是对象的状态,它能行驶、能变速是对象的功能;对于电视机对象,它的屏幕大小、色彩、频道数等是它的属性,能打开、关闭、更换频道、调整音量等是它的操作。,3.1.1 对象、类、实例化,在面向对象程序设计技术中,对象是具有属性(又称状态)和操作(又称方法、行为方式和消息等)的实体。对象的属性表示了它所处于的状态;对象的操作则用来改变对象的状态达到特
2、定的功能。对象有一个惟一的标识名以区别于其他对象,对象有固定的对外接口,是对象在约定好的运行框架和消息传递机制中与外界通信的通道。对象是面向对象技术的核心,是构成系统的基本单元,所有的面向对象的程序都是由对象来组成的。类是在对象之上的抽象,它为属于该类的全部对象提供了统一的抽象描述。所以类是一种抽象的数据类型,它是对象的模板,对象则是类的具体化,是类的实例。例如:“一台PANDA电视机”等价于“这是电视机类的一个实例”。类与对象的关系如图3.1所示。,3.1.1 对象、类、实例化,图3.1 类与对象关系,3.1.2 面向对象程序设计语言的三大原则,一个面向对象的语言在处理对象时,必须遵循的三个
3、原则是:封装、继承、多态。1.封装所谓“封装”,就是用一个框架把数据和代码组合在一起,形成一个对象。遵循面向对象数据抽象的要求,一般数据都被封装起来,也就是外部不能直接访问对象的数据,外部能见到的只有提供给外面访问的公共操作(也称接口,对象之间联系的渠道)。在C#中,类是支持对象封装的工具,对象则是封装的基本单元。封装的对象之间进行通讯的一种机制叫做消息传递。消息是向对象发出的服务请求,是面向对象系统中对象之间交互的途径。消息包含要求接收对象去执行某些活动的信息,以及完成要求所需的其他信息(参数)。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。接收者接收了消息,它就承担了执行指定动
4、作的责任,作为消息的答复,接收者将执行某个方法,来满足所接收的请求。,3.1.2 面向对象程序设计语言的三大原则,2.继承继承是面向对象编程技术的一块基石,通过它可以创建分等级层次的类。例如,创建一个汽车的通用类,它定义了汽车的一般属性(如:车轮、方向盘、发动机、车门)和操作方法(如:前进、倒退、刹车、转弯等)。从这个已有的类可以通过继承的方法派生出新的子类,卡车、轿车、客车等,它们都是汽车类的更具体的类,每个具体的类还可增加自己一些特有的东西。如图3.2所示,更一般地表示如图3.3所示。,图3.2 汽车类的派生,图3.3 类的继承,2.继承,继承是父类和子类之间共享数据和方法的机制,通常把父
5、类称为基类,子类称为派生类。一个基类可以有任意数目的派生类,从基类派生出的类还可以被派生,一群通过继承相联系的类就构成了类的树型层次结构。如果一个类有两个或两个以上直接基类,这样的继承结构被称为多重继承或多继承。在现实世界中这种模型屡见不鲜,如:一些组合功能的产品像沙发床,它既有沙发的功能,又有床的功能,沙发床应允许同时继承沙发和床的特征。如图3.4所示,更一般地表示如图3.5所示,图3.4多继承示意,图3.5 类的多继承,2.继承,尽管多继承从形式上看比较直观,但在实现上多继承可能引起继承操作或属性的冲突。当今的很多语言已不再支持多继承,C#语言也对多继承的使用进行了限制,它通过接口来实现。
6、接口可以从多个基接口继承。接口可以包含方法、属性、事件和索引器。一个典型的接口就是一个方法声明的列表,接口本身不提供它所定义的成员的实现。所以接口不能被实例化,一个实现接口的类再以适当的方式定义接口中声明的方法。如图3.6所示。,图3.6类的接口,3.1.2 面向对象程序设计语言的三大原则,3.多态性多态性就其字面上的意思是:多种形式或多种形态。在面向对象编程中,多态是指同一个消息或操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在面向对象编程中,多态性有两种,一种是静态多态,一种是动态多态。当在同一个类中,直接调用一个对象的方法时候,系统在编译时,根据传递的参数个数、参数类型以及
7、返回值的类型等信息决定实现何种操作,这就是所谓的静态绑定。当在一个有着继承关系的类层次结构中,间接调用一个对象的方法时候,也就是说,调用经过基类的操作,这种调用只有到系统运行时,才能根据实际情况决定实现何种操作,这就是所谓的动态绑定。C#支持这两种类型的多态,在实现多态上C#可以有几种方式:接口多态性、继承多态性、通过抽象类实现的多态性。,3.2 类,正如前节所述,对象是面向对象语言的核心,数据抽象和对象封装是面向对象技术的基本要求,而实现这一切的主要手段和工具就是类。从编程语言的角度讲,类就是一种数据结构,它定义数据和操作这些数据的代码。把握面向对象编程的重要一步就是区分类与对象,类是对其成
8、员的一种封装,对类进行对象实例化,并在其数据成员上实施操作才是完成现实任务的根本。实例化后的类为对象,其核心特征便是拥有了一份自己特有的数据成员拷贝。这些为对象所持有的数据成员称之为实例成员。不为对象所持有的数据成员称之为静态成员,在类中用static修饰符声明。类的成员包含数据成员(常量、域、事件)和函数成员(方法、属性、索引器、操作符、构造函数、析构函数等)。,3.2.1 类的声明,要定义一个新的类,首先要声明它。语法形式:属性集信息opt 类修饰符opt class 类名:类基 opt 类主体 opt其中:属性集信息:是C#语言提供给程序员为程序中定义的各种实体附加一些说明信息,这是C#
9、语言的一个重要特征。类修饰符:可以是以下表3.1所列的几种之一或者是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。,表3.1 类的修饰符,3.2.1 类的声明,类基:它定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object。最简单的类声明语法形式:class 类名 类成员 例如:class Point/Point类的访问权限缺省为public int x,y;,3.2.2 类的成员,类的定义包括类头和类体两部分,其中类体用一对大花括号 括起来,类体用于定义该类的成员。类体语法形式:类成员声明 opt 类成员由两
10、部分组成,一个是类体中以类成员声明形式引入的类成员,另一个则是直接从它的基类继承而来的成员。类成员声明主要包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等。当字段、方法、属性、事件、运算符和构造函数声明中含有static修饰符时,则表明它们是静态成员,否则就是实例成员。类成员声明中可以使用以下5种访问修饰符中的一种:public,private,protected,internal,protected internal。当类成员声明不包含访问修饰符时,缺省约定访问修饰符为private。,3.2.2 类的成员,
11、1常数声明常数声明一般语法形式:属性集信息 opt 常数修饰符 opt const 类型 标识符=常数表达式,标识符=常数表达式 0+其中:常数修饰符可以是:new、public、protected、internal、private。类型必须是:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型相一致,或者可以通过隐式转换转换成目标类型。2字段声明字段声明的一般语法形式:属性集信息 opt 字段修饰符 opt 类型 变量声明列表;其
12、中:变量声明列表:标识符或者用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。,3.2.2 类的成员,【例3.1】通过构造函数对只读字段赋值。using System;public class Areapublic readonly double Radius;/Radius是只读字段private double x,y;public double Size;public static double Sum=0.0;public Area()Radius=1.0;/通过构造函数对radius赋值class Testpublic static void Main()Are
13、a s1=new Area();Console.WriteLine(Radius=0,Size=1,Sum=2,s1.Radius,s1.Size,Area.Sum);/静态字段通过类访问Area.Sum,实例字段通过对象访问s1.SizeConsole.Read();,【例3.1】,运行结果如图3.7所示。,图3.7 对只读字段赋值的运行结果,3.2.3 构造函数,当定义了一个类之后,就可以通过new运算符将其实例化,产生一个对象。为了能规范、安全地使用这个对象,C#提供了对对象进行初始化的方法,这就是构造函数。在C#中,类的成员字段可以分为实例字段和静态字段,与此相应的构造函数也分为实例构
14、造函数和静态构造函数。1实例构造函数声明实例构造函数的声明语法形式:属性集信息 opt 构造函数修饰符 opt 标识符(参数列表 opt):base(参数列表 opt)opt:this(参数列表 opt)opt 构造函数语句块 其中:构造函数修饰符:public、protected、internal、private、extern。一般地,构造函数总是public类型的。如果是private类型的,表明类不能被外部类实例化。标识符(参数列表 opt):标识符是构造函数名,必须与这个类同名,不声明返回类型,并且没有任何返回值。这与返回值类型为void的函数不同。构造函数参数可以没有,也可以有一个或
15、多个。这表明构造函数在类的声明中可以有函数名相同,但参数个数不同或者参数类型不同的多种形式,这就是所谓的构造函数重载。,3.2.3 构造函数,【例3.2】Time类的构造函数及其重载。using System;public class Timeprivate int hour,minute,second;public Time()hour=minute=second=0;public Time(int h)hour=h;minute=second=0;public Time(int h,int m)hour=h;minute=m;second=0;,public Time(int h,int
16、m,int s)hour=h;minute=m;second=s;class Teststatic void Main()Time t1,t2,t3,t4;/对t1,t2,t3,t4分别调用不同的构造函数t1=new Time();t2=new Time(8);t3=new Time(8,30);t4=new Time(8,30,30);,3.2.3 构造函数,【例3.3】构造函数初始化。实例对象创建时,根据不同的参数调用相应的构造函数完成初始化。using System;class Point public double x,y;public Point()x=0;y=0;public Po
17、int(double x,double y)this.x=x;/当this在实例构造函数中使用时,this.y=y;/它的值就是对该构造的对象的引用。,class Testpublic static void Main()Point a=new Point();Point b=new Point(3,4);/用构造函数初始化对象Console.WriteLine(a.x=0,a.y=1,a.x,a.y);Console.WriteLine(b.x=0,b.y=1,b.x,b.y);Console.Read();运行结果如图3.8所示。,图3.8 用不同的构造函数完成的对象初始化的运行结果,3.
18、2.3 构造函数,上例中声明了一个类Point,它提供了两个重载的构造函数。一个是不带参数的Point构造函数和一个是带有两个double参数的Point构造函数。如果类中没有提供这些构造函数,那么CLR会自动提供一个缺省构造函数的。但一旦类中提供了自定义的构造函数,系统则不提供缺省构造函数,这一点需要特别注意,否则系统编译会报出错。如图3.9所示。,图3.9 程序编译出错信息,3.2.3 构造函数,【例3.4】Point类只定义了一个带两个参数的构造函数,在创建Point对象a时,编译会报告出错信息。using System;class Pointpublic double x,y;publ
19、ic Point(double x,double y)this.x=x;/当this在实例构造函数中使用时,this.y=y;/它的值就是对该构造的对象的引用。class Testpublic static void Main()Point a=new Point();/出错Point b=new Point(3,4);/用构造函数初始化对象Console.WriteLine(a.x=0,a.y=1,a.x,a.y);Console.WriteLine(b.x=0,b.y=1,b.x,b.y);,3.2.3 构造函数,【例3.5】派生类构造函数及其调用。using System;class P
20、ointprivate int x,y;public Point()x=0;y=0;Console.WriteLine(Point()constructor:0,this);public Point(int x,int y)this.x=x;this.y=y;Console.WriteLine(Point(x,y)constructor:0,this);,class Circle:Pointprivate double radius;public Circle()/缺省约定调用基类的无参构造函数Point()Console.WriteLine(Circle()constructor:0,thi
21、s);public Circle(double radius):base()this.radius=radius;Console.WriteLine(Circle(radius)constructor:0,this);public Circle(int x,int y,double radius):base(x,y)this.radius=radius;Console.WriteLine(Circle(x,y,radius)constructor:0,this);,class Test static void Main()Point a=new Point();Circle b=new Cir
22、cle(3.5);Circle c=new Circle(1,1,4.8);Console.Read();运行结果如图3.10所示。,图3.10 派生类对象在初始化时,调用构造函数的次序,3.2.3 构造函数,2.静态构造函数声明静态构造函数的声明语法形式:属性集信息 opt 静态构造函数修饰符 opt 标识符()静态构造函数体 其中:静态构造函数修饰符:extern static 或者 static extern 如果有extern修饰,则说明这是一个外部静态构造函数,不提供任何实际的实现,所以静态构造函数体仅仅是一个分号。标识符():标识符是静态构造函数名,必须与这个类同名,静态构造函数不
23、能有参数。静态构造函数体:静态构造函数的目的是用于对静态字段进行初始化,所以它只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。静态构造函数是不可继承的,而且不能被直接调用。只有创建类的实例或者引用类的任何静态成员时,才能激活静态构造函数,所以在给定的应用程序域中静态构造函数至多被执行一次。如果类中没有声明静态构造函数,而又包含带有初始设定的静态字段,那么编译器会自动生成一个默认的静态构造函数。,3.2.3 构造函数,【例3.6】静态构造函数。using System;class Screen static int Height;static int Width;int Cur_
24、X,Cur_Y;static Screen()/静态构造函数,对类的静态字段初始化 Height=768;Width=1024;,3.2.4 析构函数,一般来说,创建一个对象时需要用构造函数初始化数据,与此相对应释放一个对象时就用析构函数。所以析构函数是用于实现析构类实例所需操作的方法。声明语法形式:属性集信息 opt extern opt 标识符()析构函数体其中:标识符必须与类名相同,但为了区分构造函数,前面需加“”表明它是析构函数。析构函数不能写返回类型,也不能带参数,因此它不可能被重载,当然它也不能被继承,所以一个类最多只能有一个析构函数。一个类如果没有显式地声明析构函数,则编译器将自
25、动产生一个缺省默认的析构函数。析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用。如果这个对象是一个派生类对象,那么在调用析构函数时也会产生链式反应,首先执行派生类的析构函数,然后执行基类的析构函数,如果这个基类还有自己的基类,这个过程就会不断重复,直到调用Object类的析构函数为止,其执行顺序正好与构造函数相反。,3.2.4 析构函数,【例3.7】析构函数的调用次序。using System;public class Point private int x,y;Point()Console.WriteLine(Points destructor);public class Cir
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程 基础
链接地址:https://www.31ppt.com/p-5642127.html