第4章面向对象编程.ppt
《第4章面向对象编程.ppt》由会员分享,可在线阅读,更多相关《第4章面向对象编程.ppt(77页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第4章章 C#面向对象编程面向对象编程 面向对象编程是一种功能强大的程序设计方法,它以“数据控制访问代码”为主要原则,围绕数据来组织程序。在进行面向对象编程时需要定义数据和作用于数据上的方法。类是面向对象编程的基础,在类中定义了数据和实现这些数据的代码。2本章学习要点本章学习要点理解类的定义掌握声明类的方法掌握构造函数和析构函数方法理解并掌握访问修饰符的用法掌握类事件的声明以及为类定义事件34.1 基本概念基本概念 类是一个定义对象形式的模版。它指定了数据以及操作数据的代码。C#使用类的规范来构造对象,而对象是类的实例。从定义上来说,类是一个数据结构,包含数据成员(属性、字段)、功能成员(
2、方法、事件、构造函数和析构函数等)和嵌套类型。对象属性颜色价格型号行为起动停车加速属性颜色车轮数量行为行进打铃属性颜色品种行为睡吃 2、类的成员字段:用于保持一个值的成员变量;方法:对数据进行加工的代码,是类中完成一个功能的函数;属性:智能字段,与字段类似,但可以实现只读或只写操作;常量:值不能改变的字段;事件:用于触发一些代码的运行,比如鼠标单击可以触发一些事件;运算:对一些标准的运算符进行重载并添加到类中,可以使代码更直接。4.2 类类是一类对象的抽象,用于在程序中模拟现实生活的事物对象是现实中的事物如何描述现实的事物:特征和动作,对应类中的数据成员和方法4.2.1 定义类访问修饰符 cl
3、ass /类的主体示例:class Employee /类的主体/成员变量/成员方法类修饰符修修饰饰符符说说明明abstract 指定类为其他类的基类sealed指定类不能被继承public所属类的成员以及非所属类的成员都可以访问internal当前程序集可以访问(默默认认)private只有所属类的成员才能访问protected所属类或派生自所属类的类型可以访问语法:语法:成员变量访问修饰符访问修饰符数据类型数据类型成员变量成员变量;privateprotectedinternalpublic_colormodel.priceintchar.bool class Car/汽车的数据成员 pu
4、blic string Color;/颜色public string Model;/型号public float price;/价格 访问成员变量步骤 1:创建一个类的对象Car c=new Car();步骤 2:使用点号访问成员变量c.Color=黑色;/设置汽车c的颜色c.price=1000000;/设置汽车c的价格访问修饰符Car 类private 成员protected 成员public 成员internal 成员Class 类只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员不可访问不可访问可以访问static 成员readonly 成员访
5、问修饰符修修饰饰符符说说明明public所属类的成员以及非所属类的成员都可以访问:internal当前程序集可以访问private只有所属类的成员才能访问:protected所属类或派生自所属类的类型可以访问:见static表示属于类型本身而不是属于特定对象readonly只能赋值为该声明的一部分或在同一类的构造函数中注意C#:静态字段在类的装载时初始化;非静态字段在类的实例创建时进行初始化。字段访问class Employeeprivate static string name;private static string id;static void Main(string args)nam
6、e=Console.ReadLine();id=Console.ReadLine();直接访问字段 不经验证 用方法访问字段class Employee private static string name;private static string id;public void SetId(value)/验证输入长度小于 2if(value.Length 2)id=value;public string GetId()returnid;方法 SetId(Value)和 GetId()分别读取和写入职员 ID Employee emp;emp.SetId(A1);string Departme
7、nt=emp.Get()每次都调用 GetId()和 SetId()方法会很繁琐用属性解决!属性class Employee private static string name;private static string id;public string Id get return id;set/验证输入长度小于 2if(id.Length 2)id=value;读取 ID 时调用 将值赋给 ID 时调用 访问修饰符 数据类型 属性名 get;set;读/写属性可以赋值和检索值属性访问修饰符 数据类型 属性名get;只读属性只能检索值属性访问修饰符 数据类型 属性名set;只写属性只能赋值属
8、性访问修饰符static 数据类型 属性名get;set;静态属性应用于整个类而不是类的实例只能访问类的静态成员class SavingsAccount/类字段用于存储类字段用于存储帐号、余额和已获利息帐号、余额和已获利息private int _accountNumber;private double _balance;private double _interestEarned;/利率是静态的,因为所有帐户获得的利息相同利率是静态的,因为所有帐户获得的利息相同private static double _interestRate;/构造函数初始化类成员构造函数初始化类成员public Sa
9、vingsAccount(int accountNumber,double balance)this._accountNumber=accountNumber;this._balance =balance;/只读只读 AccountNumber 属性属性public int AccountNumbergetreturn _accountNumber;定义和调用属性只读属性 static void Main(string args)/创建 SavingsAccount 的对象SavingsAccount objSavingsAccount=new SavingsAccount(12345,500
10、0);Console.WriteLine(输入到现在为止已获得的利息和利率);objSavingsAccount.InterestEarned=Int64.Parse(Console.ReadLine();SavingsAccount.InterestRate=Int64.Parse(Console.ReadLine();objSavingsAccount.InterestEarned+=objSavingsAccount.Balance*SavingsAccount.InterestRate;Console.WriteLine(获得的总利息为:0,objSavingsAccount.Inte
11、restEarned);public double InterestEarnedgetreturn _interestEarned;set/验证数据if(value 0.0)Console.WriteLine(“利息 不能为负数);return;_interestEarned=value;static void Main(string args)/创建 SavingsAccount 的对象SavingsAccount objSavingsAccount=new SavingsAccount(12345,5000);Console.WriteLine(输入到现在为止已获得的利息和利率);objS
12、avingsAccount.InterestEarned=Int64.Parse(Console.ReadLine();SavingsAccount.InterestRate=Int64.Parse(Console.ReadLine();objSavingsAccount.InterestEarned+=objSavingsAccount.Balance*SavingsAccount.InterestRate;Console.WriteLine(获得的总利息为:0,objSavingsAccount.InterestEarned);将设置 InterestRate 属性public stati
13、c double InterestRategetreturn _interestRate;set/验证数据if(value 0.0)Console.WriteLine(“利率不能为负数);return;else_interestRate=value/100;static void Main(string args)/创建 SavingsAccount 的对象SavingsAccount objSavingsAccount=new SavingsAccount(12345,5000);Console.WriteLine(“输入到现在为止已获得的利息和利率);objSavingsAccount.I
14、nterestEarned=Int64.Parse(Console.ReadLine();SavingsAccount.InterestRate=Int64.Parse(Console.ReadLine();objSavingsAccount.InterestEarned+=objSavingsAccount.Balance*SavingsAccount.InterestRate;Console.WriteLine(获得的总利息为:0,objSavingsAccount.InterestEarned);将检索 Balance 和 InterestRate 属性public double Bal
15、ancegetif(_balance 0)Console.WriteLine(没有可用余额);return _balance;4.2.2 方法对象的行为接听响铃挂断PickUp()./接电话Ring()./响铃Hang()./挂断声明方法语法访问修饰符(可选),默认情况下为 private访问修饰符 返回类型(参数列表)/方法主体如果不需要返回任何值,方法可能返回 void 数据类型演示:示例 3调用方法 5private void Accept()Console.WriteLine(请输入复数的实部);_r=int.Parse(Console.ReadLine();Console.Write
16、Line(请输入复数的虚部);_i=int.Parse(Console.ReadLine();/显示复数值void showResult()Console.WriteLine(相加之和);Console.WriteLine(_r+_i+i);/将两个复数相加Complex Add(Complex c)c._r+=this._r;c._i+=this._i;return c;接收实部和虚部的值显示实部和虚部的值请参阅对象的实例变量b与 c 相关联STAThreadstatic void Main(string args)Complex a=new Complex();Complex b=new
17、Complex();a.Accept();b.Accept();Complex e=a.Add(b);e.showResult();Console.ReadLine();4.2.3 方法重载p重载:指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)p 作用:对不同数据执行相似的功能p例如:求最大值p注意:p参数表不同:是指参数个数不同或参数类型不同p不能根据返回值不同进行重载在编程中常常需要使用两个或多个函数完成相同的任务,但其参数的数据类型不同。例如,需要使用larger()函数的不同版本,查找出任何基本数据类型的两个变量中的较大者。在理想情
18、况下,所有这些函数都使用相同的名称larger(),另一种方法是为int类型的变量定义函数largerInt()为double类型的变量定义函数largerDouble(),这两个函数的作用是相同的,但却使用不同的名字,看上去很笨拙,不如前一种方法方便。28方法重载2/基于参数不同的方法重载public int greatest(int x,int y)if(xy)return x;else return y;public int greatest(int x,int y,int z)if(xy&xz)return x;else if(yx&yz)return y;else return z;
19、具有不同数量的参数的方法重载方法重载/基于参数类型的方法重载public int greatest(int x,int y)if(xy)return x;else return y;public double greatest(double x,double y)if(xy)return x;else return y;具有不同类型的参数的方法重载4.2.4 构造函数和析构函数构造函数是类的一种特殊方法,一般用于对类的数据成员进行初始化。每次创建类的实例都会调用它。访问修饰符访问修饰符()/构造函数的主体语法:语法:/默认构造函数Car()color=“black;示例:参数化构造函数访问修饰
20、符访问修饰符 ()/构造函数的主体构造函数的主体语法:(参数列表参数列表)/参数化构造函数Car(string str)color=str;示例:构造函数举例(一)using System;class MyClass Myclass()Console.WriteLine(“我的构造函数。”);public static void Main()MyClass cM=new MyClass();new运算符创建类的一个实例。如果没有MyClass方法,则系统产生一个默认构造函数如下:MyClass()构造函数举例(二)using System;class userName string uname
21、;public userName(string name)uname=name;public void ShowName()Console.WriteLine(name);public static void Main()userName un1=new userName(“tony”);un1.ShowName();new运算符创建类的一个实例,并给出参数tony。定义构造方法,将参数赋值给域变量uname。析构函数是用于执行清除操作的特殊方法一个类只能有一个析构函数析构函数不能被继承析构函数不能被显示或手动调用,只能由系统的垃圾回收器自动调用()/析构函数的主体 语法:Car()示例:2、
22、析构函数创建实例时,系统会为实例分配空间,当实例用完以后,就要回收这些分配出去的空间,所以释放对象时要用析构函数。析构方法是用符号“”开始的并与类同名的方法,该方法不带参数,没有返回类型也不带修饰符。一个类的析构方法最多只有一个,如果没有提供析构方法,系统会自动生成一个。析构方法不能由程序显式调用,而由系统自动进行。在.net中,不必太关注内存管理,因为.net框架垃圾回收器会自动地管理对象的内存分配和释放。析构函数举例using System;class First First()Console.WriteLine(“constructor of First”);First()Console
23、.WriteLine(“destructor of First”);public static void Main()First ob=new First();程序运行结果为:constructor of Firstdestructor of First4.3 对象的创建与使用对象首先要进行声明:类名 变量名;创建对象的一般格式如下:变量名=new 构造方法(参数);声明和创建可以合写成一句:类名 变量名=new 构造方法(参数);如:Person p1=new Person(“Jenny”);new是新建对象的运算符,开辟空间并执行相应的构造方法,返回该对象的一个引用(对象实体所在的内存地址
24、)。nameage.p1对象创建举例定义一个Student类,该类由三个域年龄、姓名和性别;为该类编写构造函数,参数为三个:int、string 、string;在主方法中创建一个实例s1,对域进行初始化并输出三个域的值。using System;class Student internal int age;internal string name;internal string sex;public Student(int a,string na,string s)age=a;name=na;sex=s;class App public staitc void Main()Student s
25、1=new Student(23,”zhanghua”,”female”);Console.WriteLine(“0,1,2”,s1.age,s1.name,s1.sex);4.4 类的静态成员类可以有两类成员:静态成员和实例成员。实例成员会被类的每个实例复制;而静态成员只会被复制一次并在整个应用程序的生命周期内都存在。默认情况下,成员被定义为实例成员,如加上staticstatic关键字则被定义为静态成员。*Main()主方法一定是静态的。using System;class Myclass public Myclass()number+;static public int number=1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程
限制150内