C面向对象基础.ppt
《C面向对象基础.ppt》由会员分享,可在线阅读,更多相关《C面向对象基础.ppt(80页珍藏版)》请在三一办公上搜索。
1、第3章 面向对象编程基础,3.1 面向对象编程概念在面向对象程序设计技术中,对象是具有属性和操作(方法)的实体。对象的属性表示了它所处的状态;对象的操作则用来改变对象的状态达到特定的功能。对象有固定的对外接口,它是对象与外界通信的通道。类是在对象之上的抽象,它为属于该类的全部对象提供了统一的抽象描述。所以类是一种抽象的数据类型,它是对象的模板,对象则是类的具体化,是类的实例。,面向对象的三个特征:,1封装所谓“封装”,就是用一个框架把数据和代码组合在一起,形成一个对象。在C#中,类是支持对象封装的工具,对象则是封装的基本单元。2继承继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,
2、子类称为派生类。如果一个类有两个或两个以上的直接基类,这样的继承结构被称为多重继承或多继承。C#通过接口来实现多重继承。接口可以从多个基接口继承。3多态性在面向对象编程中,多态是指同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态性有两种,一种是静态多态,一种是动态多态。,3.2 类,类就是一种数据结构,它定义数据和操作这些数据的代码。,3.2.1 类的声明语法形式:属性集信息 类修饰符 class 类名:类基 类主体 其中:属性集信息是C#语言提供给程序员的,为程序中定义的各种实体附加一些说明信息,这是C#语言的一个重要特征。类修饰符可以是表3.1所列的几种之一或是它们的
3、有效组合,但在类声明中,同一修饰符不允许出现多次。,表3.1 类修饰符,3.2.2 类的成员,类的定义包括类头和类体两部分,其中类体用一对大花括号 括起来,类体用于定义该类的成员。语法形式:类成员声明 类成员由两部分组成,一个是类体中以类成员声明形式引入的类成员,另一个则是直接从它的基类继承而来的成员。类成员声明主要包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等。,1常数声明,语法形式:属性集信息 常数修饰符 const 类型 标识符=常数表达式,其中:常数修饰符new、public、protected、in
4、ternal、private。类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型一致,或者通过隐式转换规则转换成目标类型。例如:class A_const public const int X=10;const double PI=3.14159;/默认访问修饰符,即约定为private const double Y=0.618+3.14;,常数声明不允许使用static修饰符,但它和静态成员一样只能通过类访问。例如:class
5、 Test public static void Main()A_const m=new A_const();Console.WriteLine(X=0,PI=1,Y=2,A_const.X,A_const.PI A_const.Y);,2字段声明语法形式:属性集信息 字段修饰符 类型 变量声明列表;其中:变量声明列表标识符或用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。例如:class A int x=100,y=200;float sum=1.0f;字段修饰符new、public、protected、internal、private、static、readonl
6、y、volatile。,【例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()Area s1=new Area();Console.WriteLine(Radius=0,Size=1,S
7、um=2,s1.Radius,s1.Size,Area.Sum);/静态字段通过类访问Area.Sum,实例字段通过对象访问s1.SizeConsole.Read();,无论是静态字段还是实例字段,它们的初始值都被设置成字段类型的默认值。如果字段声明包含变量初始值设定,则在初始化执行期间相当于执行一个赋值语句。对静态字段的初始化发生在第一次使用该类静态字段之前,执行的顺序按静态字段在类声明中出现的文本顺序进行。当实例字段的初始化发生在创建一个类的实例时,同样是按实例字段在类声明中的文本顺序执行的。,常量与ReadOnly字段的区别,都是只读Readonly字段的赋值只能在声明的同时或者构造函数
8、实现。Const成员的值要求在编译时就能计算。Const不允许使用Static修饰,只能通过类访问。,3.2.3 构造函数和析构函数,1构造函数提供了实现对象进行初始化的方法,这就是构造函数。在C#中,类的成员字段可以分为实例字段和静态字段,与此相应的构造函数也分为实例构造函数和静态构造函数。,(1)实例构造函数的声明语法形式:属性集信息 构造函数修饰符 标识符(参数列表):base(参数列表):this(参数列表)构造函数语句块 其中:构造函数修饰符public、protected、internal、private、extern。一般地,构造函数总是public类型的。标识符(参数列表 op
9、t)构造函数名,必须与这个类同名,不声明返回类型,并且没有任何返回值。它与返回值类型为void的函数不同。构造函数重载。用new运算符创建一个类的对象时,类名后的一对圆括号提供初始化列表,这实际上就是提供给构造函数的参数。系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数。,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
10、h,int m)hour=h;minute=m;second=0;,public Time(int h,int 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】Time类的构造函数及其重载。,【例3.3】构造函数初始化。,实例对象创建时,根据不同的参数调用相应的构造函数完成初始化。using
11、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 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);/a.x=0,a.y=0Console.WriteLine
12、(b.x=0,b.y=1,b.x,b.y);/b.x=3,b.y=4Console.Read();,派生类构造函数的调用次序【例3.4】派生类构造函数及其调用。using System;class Pointprivate 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:Pointpri
13、vate double radius;public Circle()/默认约定调用基类的无参构造函数Point()Console.WriteLine(Circle()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(Circ
14、le(x,y,radius)constructor:0,this);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();,程序运行结果如下:,(2)静态构造函数的声明语法形式:属性集信息 静态构造函数修饰符 标识符()静态构造函数体,其中:静态构造函数修饰符 extern static 或者static extern。如果有extern修饰,则说明这是一个外部静态构造函数,不提供任何实际的实现,所以静态构造函数体
15、仅仅是一个分号。标识符()是静态构造函数名,必须与这个类同名,静态构造函数不能有参数。静态构造函数体静态构造函数的目的是对静态字段的初始化,所以它只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。,关于构造函数,还有几点请注意::base(参数列表 opt)表示调用直接基类中的实例构造函数。:this(参数列表 opt)表示调用该类本身所声明的其他构造函数。构造函数语句块既可以对静态字段赋值,也可以对非静态字段进行初始化。但在构造函数体中不要做对类的实例进行初始化以外的事情,也不要尝试显式地调用构造函数。实例构造函数不能被继承。如果一个类没有声明任何实例构造函数,则系统会自动提供
16、一个默认的实例构造函数。,【例3.5】静态构造函数。using System;class Screen static int Height;static int Width;int Cur_X,Cur_Y;static Screen()/静态构造函数,对类的静态字段初始化 Height=768;Width=1024;,关于静态构造函数,请注意:静态构造函数是不可继承的,而且不能被直接调用。只有创建类的实例或者引用类的任何静态成员时,才能激活静态构造函数,所以在给定的应用程序域中静态构造函数至多被执行一次。如果类中没有声明静态构造函数,而又包含带有初始设定的静态字段,那么编译器会自动生成一个默认
17、的静态构造函数。,2析构函数,语法形式:属性集信息 extern 标识符()析构函数体其中:标识符必须与类名相同,但为了区分构造函数,前面需加“”析构函数不能写返回类型,也不能带参数,因此它不可能被重载,当然它也不能被继承,所以一个类最多只能有一个析构函数。,关于析构函数,请注意:析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用。如果对象是一个派生类对象,那么在调用析构函数时也会产生链式反应,首先执行派生类的析构函数,然后执行基类的析构函数,如果这个基类还有自己的基类,这个过程就会不断重复,直到调用Object类的析构函数为止,其执行顺序正好与构造函数相反。,3.3 方法,C#没有
18、全局常数、全局变量和全局方法,任何事物都必须封装在类中。通常,程序的其他部分通过类所提供的方法与它进行互操作。对方法的理解可以从方法的声明、方法的参数、静态方法与实例方法、方法的重载与覆盖等方面切入。3.3.1 方法的声明方法是按照一定格式组织的一段程序代码,在类中用方法声明的方式来定义。语法形式:属性集信息 方法修饰符 返回类型 方法名(形参表)方法体,表3.2 方法修饰符,方法修饰符中public、protected、private、internal、protected internal属于访问修饰符,表示访问的级别,默认情况下,方法的访问级别为public。访问修饰符的组合表3.3所列的
19、组合被视为非法的无效组合。返回类型方法可以返回值也可以不返回值。如果返回值,则需要说明返回值的类型,默认情况下为 void。,表3.3 修饰符的无效组合,方法名每个方法都有一个名称Main()是为开始执行程序的方法预留的,不要使用C#的关键字作为方法名。方法的命名尽可能地顾名思义。形参表由零个或多个用逗号分隔的形式参数组成,形式参数可用属性、参数修饰符、类型等描述。当形参表为空时,外面的圆括号也不能省略。方法体用花括号括起的一个语句块。,using System;class StackTp int MaxSize;int Top;int StkList;public StackTp()/构造函
20、数 MaxSize=100;Top=0;StkList=new int MaxSize;public StackTp(int size)/构造函数 MaxSize=size;Top=0;StkList=new int MaxSize;,public bool isEmptyStack()/方法 if(Top=0)return true;elsereturn false;public bool isFullStack()if(Top=MaxSize)return true;else return false;public void push(int x)StkListTop=x;Top+;,【例
21、3.6】StackTp类定义了几个方法以模拟实现一个压栈操作。,class Test public static void Main()StackTp ST=new StackTp(20);string s1;if(ST.isEmptyStack()/调用方法isEmptyStack()s1=Empty;else s1=not Empty;Console.WriteLine(Stack is+s1);for(int i=0;i20;i+)ST.push(i+1);if(ST.isFullStack()/调用方法isFullStack()s1=Full;else s1=not Full;Cons
22、ole.WriteLine(Stack is+s1);Console.Read();程序运行结果如下:,3.3.2 方法的参数,参数的传入或传出就是在实参与形参之间发生的.在C#中实参与形参有4种传递方式。1值参数在方法声明时不加修饰的形参就是值参数,它表明实参与形参之间按值传递。这种传递方式的好处是,在方法中对形参的修改不影响外部的实参,也就是说,数据只能传入方法而不能从方法传出,所以值参数有时也被称为入参数。,using System;class Myclass public void Sort(int x,int y,int z)int tmp;/tmp是方法Sort的局部变量/将x,y
23、,z按从小到大排序if(xy)tmp=x;x=y;y=tmp;if(xz)tmp=x;x=z;z=tmp;if(yz)tmp=y;y=z;z=tmp;,class Test static void Main()Myclass m=new Myclass();int a,b,c;a=30;b=20;c=10;m.Sort(a,b,c);Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();,【例3.7】下面的程序演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。,a、b、c 变量的值并没有发生改变,因为它们都是按值传给形参x、y、z
24、的,形参x、y、z的变化并不影响外部a、b、c的值。但如果给方法传递的是一个引用对象时,它遵循的仍是值参数传递方式,形参另外分配一块内存,接受实参的引用值副本,同样对引用值的修改不会影响外面的实参。但是,如果改变参数所引用的对象将会影响实参所引用的对象,事实上,它们是同一块内存区域。,程序运行结果如下:,using System;class Myclass public void SortArray(int a)int i,j,pos,tmp;for(i=0;ia j)pos=j;if(pos!=i)tmp=ai;ai=apos;apos=tmp;,class Test static void
25、 Main()Myclass m=new Myclass();int score=87,89,56,90,100,75,64,45,80,84;m.SortArray(score);for(int i=0;iscore.Length;i+)Console.Write(score0=1,i,scorei);if(i=4)Console.WriteLine();Console.Read();,【例3.8】下面程序演示的是当方法传递的是一个引用对象(如数组)时,对形参的修改会影响到实参。,2.引用参数如果调用一个方法,期望能够对传递给它的实际变量进行操作,如下面例3.9中Sort方法对x、y、z 的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 基础
链接地址:https://www.31ppt.com/p-5426582.html