面向对象编程基础.ppt
《面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《面向对象编程基础.ppt(75页珍藏版)》请在三一办公上搜索。
1、1,第3章 面向对象编程基础,1.理解基本概念2.理解类3.使用构造函数4.学习方法5.学习属性,掌握,2,姓名、性别、年龄等:属性学习课程、参加社会活动:方法,3.1 面向对象编程概念,1.对象具有属性和操作(方法)的实体。属性:对象所处的状态 方法:用于改变对象状态以达到特定的功能 对象有一个唯一的标识名 2.类在对象之上的抽象,一种抽象的数据类型 3.类是对象的模板,对象是类的具体化或类的实例示例:学生类各位同学对象,3,对象 与 类,属性,型号,价格,里程,行为,起动,停车,行驶,属性,车轮数量,档的数量,行为,加速,换档,刹车,属性,名称,颜色,品种,行为,摇尾巴,吃东西,犬 吠,4
2、,面向对象程序设计在处理对象时,必须遵循的三个原则:,1封装用一个框架把数据和代码组合在一起,形成一个对象。类是支持对象封装的工具,对象则是封装的基本单元。2继承利用继承可以创建分等级层次的类,继承是父类和子类之间共享数据和方法的机制,通常把父类称为基类,子类称为派生类。单继承:一个基类可以有任意数目的派生类,即 一父多子多继承:一个类若有两个或两个以上的直接基类,即一子多父,称为多重继承,C#通过接口来实现3多态性同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。分为静态多态和动态多态,根据参数的差别 直接调用对象方法,根据基类 间接调用对象方法,5,3.2 类,属性集信息是
3、C#语言为程序中定义的各种实体附加一些说明信息,是C#语言的一个重要特征。属于高级编程内容,一般涉及不到。类名:唯一标识名类基:直接基类或接口。默认基类是object类,多个接口之间用逗号相隔类修饰符访问权限、类的类型等,注意同一修饰符不允许出现多次,见表3.1,6,表3.1 类修饰符,示例:class Student/类主体,7,3.2.2 类的成员,类体(类主体)用于定义该类的成员 用一对花括号 括起来,由两部分组成:1.类体中以类成员声明形式引入的类成员包括:常数声明、字段声明、方法声明、属性声明、事件声明、索引器声明、运算符声明、构造函数声明、析构函数声明、静态构造函数、类型声明等 2
4、.直接从基类继承而来的成员,8,一、成员类型:(1)静态成员 在字段、方法、属性、事件、运算符和构造函数声明中含有public static修饰符(2)实例成员 在字段、方法、属性、事件、运算符和构造函数声明中不含有public static修饰符二、默认成员访问修饰符private,类成员注意点:,9,class Program class AClass public static int x=1;public int y=2;static void Main(string args)AClass ab=new AClass();Console.WriteLine(y=0,x=1,ab.y,
5、AClass.x);,10,1常数声明,常数修饰符 new、public、protected、private、internal public:访问不受限制 protected:访问仅限于包含类或从包含类派生的类型 internal:访问仅限于当前程序集。private:访问仅限于包含类。类型sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚举类型或引用类型。常数表达式的值类型应与目标类型一致,或者通过隐式转换规则转换成目标类型。,11,例如:class A_const publi
6、c const int X=10;const double PI=3.14159;/默认访问修饰符private const double Y=0.618+3.14;注意1.常数表达式的值是一个可以在编译时计算的值注意2.常数声明不允许使用static修饰符,只能通过类访问。class 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);,12,2字段声明,语法形式:属性集信息 字段修饰符 类型 变量声明列表;
7、变量声明列表标识符或用逗号“,”分隔的多个标识符,并且变量标识符还可用赋值号“=”设定初始值。字段修饰符new、public、protected、private、internal、static、readonly、volatilestatic:静态变量。利用类直接访问静态变量,利用类的实例(对象)访问非静态变量readonly:只读变量,声明时或在构造函数中赋值,一旦赋值不可改变。与const常量不同,const常量编译时赋值计算。volatile:表示字段可能被多个并发执行的进程修改。,13,【例3.1】通过构造函数给只读字段赋值,using System;public class Area
8、public readonly double Radius;/Radius是只读字段 private double x,y;public double Size;public static double Sum=0.0;public Area()Radius=1.0;/通过构造函数对radius赋值 class Test public static void Main()Area s1=new Area();/s1.Radius=2;Console.WriteLine(Radius=0,Size=1,Sum=2,s1.Radius,s1.Size,Area.Sum);/静态字段通过类访问Are
9、a.Sum,实例字段通过对象访问s1.Size Console.Read();,出错了!无法修改只读字段,14,3.2.3 构造函数和析构函数,1)实例构造函数的声明语法形式:属性集信息 构造函数修饰符 标识符(参数列表):base(参数列表):this(参数列表)构造函数语句块,public,与类名相同没有返回值,构造函数重载:参数个数或类型不同,调用基类同参数列表的构造函数,调用本类同参数列表的构造函数,15,构造函数修饰符public、protected、internal、private、extern一般地,构造函数总是public类型的。如果是private类型的,表明类不能被外部类实
10、例化。标识符(参数列表 opt)构造函数名必须与这个类同名,无返回类型和返回值 构造函数可以有0n个参数构造函数重载 3.用new运算符创建一个类的对象时,类名后的一对圆括号提供初始化列表,系统根据这个初始化列表的参数个数、参数类型和参数顺序调用不同的构造函数。,实例构造函数注意点:,16,【例3.2】Time类的构造函数及其重载,using System;public class Time private int hour,minute,second;public Time()hour=minute=second=0;public Time(int h)hour=h;minute=secon
11、d=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;,public string getTime()return hour.ToString()+:+minute.ToString()+:+second.ToString();,Console.WriteLine(t1=0,t1.getTime();,17,【例3.3】构造函数初始化,using System;class Point public double x,y;public
12、Point()x=0;y=0;public Point(double x,double y)this.x=x;/当this在实例构造函数中使用时,this.y=y;/它的值就是对该构造的对象的引用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);Console.Read();,a.x=0,a.y=0,b.x=3
13、,b.y=4,18,构造函数注意点:,若类中没有提供构造函数,则CLR会自动提供一个默认的构造函数一旦类中提供了自定义的构造函数,系统则不提供默认的构造函数不必显示调用构造函数实例构造函数不能被继承,19,派生类构造函数的调用,调用时机:创建派生类的对象时,即 new构造函数不被继承派生类构造函数在执行前,首先显式或隐式地调用基类构造函数默认调用基类的无参数构造函数除非显式地指定调用有参数构造函数this关键字引用类的当前实例base关键字用于从派生类中访问基类的成员调用基类上已被其他方法重写的方法指定创建派生类实例时应调用的基类构造函数,20,【例3.4】派生类构造函数及其调用,using
14、System;class Point private 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:Point private double radius;public Circle()/默认约定调用基类的无参构造函数Point()Console.WriteLine(Circle()co
15、nstructor: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);,class Test static void Main()Point a=new Point();C
16、ircle b=new Circle(3.5);Circle c=new Circle(1,1,4.8);Console.Read();,1,3,2,5,4,21,2)静态构造函数的声明语法形式:属性集信息 静态构造函数修饰符 标识符()静态构造函数体 静态构造函数修饰符 extern static 或者static extern。如有extern修饰,则是一个外部静态构造函数,不提供任何实际的实现,静态构造函数体仅仅是一个分号 标识符 是静态构造函数名,必须与类同名且不能有参数 静态构造函数体只能对静态数据成员进行初始化,22,静态构造函数不可继承,不能直接调用调用时机:创建类的实例 引用类
17、的任何静态成员至多被执行一次若类没有声明静态构造函数,而又包含带有初始设定的静态字段时,编译器会自动生成一个默认的静态构造函数,静态构造函数注意点:,23,2析构函数,语法形式:属性集信息 extern 标识符()析构函数体 标识符必须与类名相同,前面需加“”析构函数不能写返回类型,也不能带参数,一个类最多只能有一个析构函数,24,析构函数注意点,析构函数不能由程序显式地调用,而是由系统在释放对象时自动调用派生类对象的析构函数调用链:1)执行派生类的析构函数2)执行基类的析构函数,直到调用object类的析构函数为止,与执行构造函数的顺序相反,25,第3章 面向对象编程基础,1.理解基本概念2
18、.理解类3.使用构造函数4.学习方法5.学习属性,掌握,26,回顾,对象 具有属性和操作(方法)的实体类 对象的抽象,抽象的数据类型类是对象的模板对象是类的具体化 或 类的实例,27,类的成员,1.类体中以类成员声明形式引入的类成员包括:常数声明、字段声明、构造函数声明、析构函数声明、静态构造函数、方法声明、属性声明等2.直接从基类继承而来的成员,28,访问修饰符,public访问不受限制protected只能被本身或派生类的实例访问private只能被本身访问static静态,非实例,29,构造函数,构造函数实例构造函数与类名同名在类进行new运算(即类实例化时)this:引用当前类的实例b
19、ase:用于从派生类中访问基类的成员调用基类上已被其他方法重写的方法指定创建派生类实例时应该调用的基类构造函数调用顺序先基类后派生类,30,3.3 方法,1.C#中所有的变量、方法都必须封装在类中2.对象间、类间只能通过类所提供的方法进行互操作3.从方法的声明、方法的参数、静态方法与实例方法、方法的重载与覆盖等方面理解,31,表3.2 方法修饰符,32,表3.3 修饰符的无效组合,33,【例3.6】下面程序中的StackTp类定义了几个方法以模拟实现一个压栈操作。,using System;class StackTp int MaxSize;int Top;int StkList;public
20、 StackTp()/构造函数 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;else return false;public bool isFullStack()if(Top=MaxSize)return true;else return false;public void push(int x)StkList
21、Top=x;Top+;,class Test public static void Main()StackTp ST=new StackTp(20);string s1;if(ST.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()/调用方法 s1=Full;else s1=not Full;Console.WriteLine(Stack is+s1);Console.Read();,34
22、,3.3.2 方法的参数,形参(形式参数):声明方法时包含的方法参数说明实参(实际参数):调用方法时给出的实际参数在C#中实参与形参有4种传递方式:值参数引用参数ref输出参数out参数数组params,1值参数 在方法声明时不加修饰的形参就是值参数,它表明实参与形参之间按值传递 在方法中对形参的修改不影响外部的实参 属于输入参数,35,【例3.7】演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。,36,是值参数传递方式,形参另外分配一块内存,接受实参的引用值副本1.对引用值的修改不会影响实参2.如果改变的是所引用的对象,则将会影响实参所引用的对象,值参数传递引用对象,内存首地
23、址,37,【例3.8】程序演示的是当方法传递的是一个引用对象(如数组)时,对形参的修改会影响到实参,改变了引用的对象,查询最小值,38,2.引用参数,引用参数形参的改变影响实参例3.7中 实际变量a、b、c是不随形参x、y、z的,但如果想改变实际变量a、b、c的值,则用引用参数,39,【例3.7】演示了当方法Sort传递的是值参数时,对形参的修改不影响其实参。,40,2.引用参数,引用参数形参的改变影响实参例3.7中 实际变量a、b、c是不随形参x、y、z的,但如果想改变实际变量a、b、c的值,则用引用参数C#用ref修饰符 声明 引用参数引用参数不创建新的存储单元,与方法调用中的实际参数变量
24、同处一个存储单元传递内存地址属于输入参数,41,【例3.9】将例3.7程序中Sort方法的值参数传递方式改成引用参数传递,这样在方法Sort中对参数x、y、z按从小到大的排序影响了调用它的实参a、b、c。,using System;class Myclass public void Sort(ref int x,ref int y,ref int z)int tmp;/tmp是方法Sort的局部变量/将x,y,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
25、 void Main()Myclass m=new Myclass();int a,b,c;a=30;b=20;c=10;m.Sort(ref a,ref b,ref c);Console.WriteLine(a=0,b=1,c=2,a,b,c);Console.Read();,42,使用ref声明引用参数的注意:(1)方法的参数声明中ref关键字仅对紧跟在它后面的参数有效,而不能应用于整个参数表。例如,Sort方法中x、y、z都要加ref修饰(2)在方法的调用中也要用ref修饰实参,且实参必须为变量,实参和形参的数据类型必须完全匹配(3)在方法外(方法调用前),ref参数必须明确赋值(4)r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程 基础

链接地址:https://www.31ppt.com/p-4950151.html