第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#语言提供给程序员为程
9、序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。 类修饰符:可以是以下表3.1所列的几种之一或者是它们的有效组合,但在类声明中,同一修饰符不允许出现多次。,表3.1 类的修饰符,3.2.1 类的声明,类基:它定义该类的直接基类和由该类实现的接口。当多于一项时,用逗号“,”分隔。如果没有显式地指定直接基类,那么它的基类隐含为object 。 最简单的类声明语法形式: class 类名 类成员 例如: class Point / Point类的访问权限缺省为public int x, y; ,3.2.2 类的成员,类的定义包括类头和类体两部分,其中类体用一对大花括号 括起来,类体用
10、于定义该类的成员。 类体语法形式: 类成员声明 opt 类成员由两部分组成,一个是类体中以类成员声明形式引入的类成员,另一个则是直接从它的基类继承而来的成员。类成员声明主要包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等。当字段、方法、属性、事件、运算符和构造函数声明中含有static修饰符时,则表明它们是静态成员,否则就是实例成员。类成员声明中可以使用以下5种访问修饰符中的一种:public,private,protected,internal,protected internal 。当类成员声明不包含访问修
11、饰符时,缺省约定访问修饰符为private。,3.2.2 类的成员,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字段
12、声明 字段声明的一般语法形式: 属性集信息 opt 字段修饰符 opt 类型 变量声明列表; 其中: 变量声明列表:标识符或者用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。,3.2.2 类的成员,【例3.1】通过构造函数对只读字段赋值。 using System; public class Area public readonly double Radius; / Radius是只读字段 private double x, y ; public double Size ; public static double Sum=0.0 ; public Area ( )
13、Radius=1.0; / 通过构造函数对radius赋值 class Test public static void Main( ) Area s1 = new Area( ); Console.WriteLine (“Radius=0, Size=1,Sum=2“,s1.Radius,s1.Size , Area.Sum); / 静态字段通过类访问Area.Sum,实例字段通过对象访问s1.Size Console.Read (); ,【例3.1】,运行结果如图3.7所示。,图3.7 对只读字段赋值的运行结果,3.2.3 构造函数,当定义了一个类之后,就可以通过new运算符将其实例化,产生
14、一个对象。为了能规范、安全地使用这个对象,C#提供了对对象进行初始化的方法,这就是构造函数。 在C#中,类的成员字段可以分为实例字段和静态字段,与此相应的构造函数也分为实例构造函数和静态构造函数。 1实例构造函数声明 实例构造函数的声明语法形式: 属性集信息 opt 构造函数修饰符 opt 标识符 ( 参数列表 opt ) : base ( 参数列表 opt ) opt : this ( 参数列表 opt ) opt 构造函数语句块 其中: 构造函数修饰符:public、protected、internal、private、extern。 一般地,构造函数总是public类型的。如果是priv
15、ate类型的,表明类不能被外部类实例化。 标识符( 参数列表 opt ):标识符是构造函数名,必须与这个类同名,不声明返回类型,并且没有任何返回值。这与返回值类型为void的函数不同。构造函数参数可以没有,也可以有一个或多个。这表明构造函数在类的声明中可以有函数名相同,但参数个数不同或者参数类型不同的多种形式,这就是所谓的构造函数重载。,3.2.3 构造函数,【例3.2】Time类的构造函数及其重载。 using System; public class Time private int hour, minute, second; public Time ( ) hour=minute=sec
16、ond=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 m, int s) hour=h; minute=m; second=s; class Test static void Main() Time t1, t2, t3, t4 ; / 对t1, t2, t3, t4分别调用不同的构造函数 t1= new Time (); t2 = new Time(8); t3 = new Time(
17、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 Point(double x, double y) this.x = x; / 当this在实例构造函数中使用时, this.y = y; / 它的值就是对该构造的对象的引用。 ,class Test public static void Main( )
18、 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.2.3 构造函数,上例中声明了一个类Point,它提供了两个重载的构造函数。一个是不带参数的Point构造函数和一个是带有两个double参数的Point构造函数。
19、如果类中没有提供这些构造函数,那么CLR会自动提供一个缺省构造函数的。但一旦类中提供了自定义的构造函数,系统则不提供缺省构造函数,这一点需要特别注意,否则系统编译会报出错。如图3.9所示。,图3.9 程序编译出错信息,3.2.3 构造函数,【例3.4】Point类只定义了一个带两个参数的构造函数,在创建Point对象a时,编译会报告出错信息。 using System; class Point public double x, y; public Point(double x, double y) this.x = x; / 当this在实例构造函数中使用时, this.y = y; / 它的
20、值就是对该构造的对象的引用。 class Test public 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 Point private int x, y; public Poi
21、nt() 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 : Point private double radius; public Circle () / 缺省约定调用基类的无参构造函数Point() Console.WriteLine (“Circle ()
22、constructor : 0 “, this ); 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
23、); ,class Test static void Main() Point a = new Point(); Circle b = new Circle (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 exte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程 基础
链接地址:https://www.31doc.com/p-2255085.html