欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C#中的类与对象课件.ppt

    • 资源ID:1802997       资源大小:679KB        全文页数:70页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C#中的类与对象课件.ppt

    第4章 类与对象,4.1类与对象 对象(Object)是面向对象程序设计的核心。世界上的一切人、事、物都是对象。因此可以说面向对象的程序设计,实质上是用计算机的语言描绘世界。对象具有静态的属性和动态的行为。静态的属性用来描述对象的特征,如汽车可以用型号、价格、颜色等属性来描述。动态的行为则表示对象可执行的动作,如汽车的行为可以有加速、转弯、后退等。在计算机中,属性用数据描述,而行为则用方法表示。 类(Class)是一组具有相同属性和行为的对象的抽象,而对象则是类的实例。在C# 中类实际上是用户自定义的一种数据类型,它定义了该数据类型的数据和行为。,4.1.1 类的定义格式:类的访问修饰符class 类名:基类类名 类的成员; 说明: 类名要遵循标识符命名规则,一般而言,组成类名的单词的首字母要大写。,默认情况下,类声明为内部的。内部类意味着只有当前项目中的代码才能访问该类。我们可以使用internal这一访问修饰符关键字来显式指定。 类的访问修饰符除了internal外,还可以为public。public类称为公共类,不仅当前项目中的代码可以访问该类,其他项目中的代码也可以访问该类。 除了internal和public这两个访问修饰符关键字外,还可以为abstract(抽象类,不能实例化,只能继承)和sealed(密封类,不能继承)。关于这两种类型的类我们在后续章节中介绍。,类成员的定义格式如下: 访问修饰符数据成员; 访问修饰符成员方法; 数据成员用来描述每个对象所拥有的属性,成员方法则用来描述每个对象的行为。类成员的访问修饰符可以用以下关键字之一来定义, 1.public:该类成员可以由任何代码访问。 2.private:该类成员只能由类中的代码访问,如果不加以指明,则默认取值为private。 3.internal:该类成员只能由定义它的项目内部的代码访问。 4.protected:该类成员只能由该类或派生类中的代码访问。类成员的访问修饰符的详细介绍参见4.5.1节。 例4-1 创建一个汽车类,ublic class Car /数据成员,即对象的静态特征或状态public string color; public string size; public string brand; /方法成员,即对象的动态特征或行为 public void beep() ,4.1.2 对象的创建 类是一个静态概念,要想使用类,需要对类进行实例化,即创建对象。格式:类名对象名new 构造函数;/new关键字用来创建对象。 说明: 1. new关键字用来创建对象,为对象在内存中分配空间,创建对象的实体。 2. 构造函数名与类名相同,关于构造函数的介绍将在后续章节进行,现在我们只需用类名后加上圆括号来代替。如:Car car1=new Car();,4.1.3 对象成员的访问创建对象后,就可以访问对象成员和运行对象中的方法。格式:对象名.成员名比如:car1.color=”yellow”;car1.size=”1.4”;car1.brand=”NISSAN”;car1.beep(); 例4-2 创建一个Employee类,创建该类的一个对象e1,访问e1的成员,using System;using System.Collections.Generic;using System.Text;namespace LearnCsharp class Employee string mstrEmpID; /员工代号 string mstrEmpName;/员工姓名 public void SetEmpID(string EmpID) /设置员工代号 mstrEmpID=EmpID; public string GetEmpID() /取得员工代号 return mstrEmpID; public void SetEmpName(string EmpName) /设置员工名称 mstrEmpName=EmpName; ,ublic string GetEmpName() /取得员工名称 return mstrEmpName; static void Main() Employeee1=new Employee(); e1.SetEmpID(001); e1.SetEmpName(王江); Console .WriteLine(员工:代号0,姓名1“); e1.GetEmpID(),e1.GetEmpName(); ,程序的运行结果如图4-1。,图4-1 程序运行结果,Main()函数虽然作为该类的方法成员,但它仍然是C#程序的入口点。,4.2 构造函数与析构函数 构造函数和析构函数是两个特殊的函数。构造函数用来初始化对象,因此当类实例化时首先执行的函数就是构造函数。构造函数根据有无参数的特点,可以分为默认构造函数和带参数的构造函数。析构函数是销毁对象时执行的函数。这两个函数的执行不需要人工干预,系统会自动地根据情况来调用相应的函数。,4.2.1 默认构造函数 不带参数的构造函数称为默认构造函数。默认构造函数可以是由编译系统提供的,也可以是程序员手工添加的。不论是哪种情况,默认构造函数都具有以下共同的特点: 1.函数名与类名相同; 2.不能有返回值,void类型也不可以; 3.没有任何参数; 实例化类时,如果在类中没有显式定义构造函数,则会调用编译系统自动提供的默认构造函数。该构造函数会初始化类成员,数值类型的成员初始化为0,bool类型的成员初始化为false,引用类型的成员初始化为null。通常而言,默认构造函数由编译系统提供。但我们可以根据需要自定义默认构造函数,初始化类成员。 例4-3 默认构造函数的使用,using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1 class Time public int Hour; public int Minute; public int Second; public void DisplayTime() Console.WriteLine( now time is 0:1:2,Hour,Minute,Second); /默认构造函数 public Time() Hour=12; Minute=30; Second=25; class Test public static void Main() Time t=new Time(); t.DisplayTime(); ,程序运行结果如图4-2所示。,图4-2 程序运行结果,在上述程序中,自定义了一个默认构造函数Time(),该构造函数将Time类的Hour成员初始化为12,将Minute成员初始化为30,将Second成员初始化为25。这样,在初始化对象t时,调用自定义的默认构造函数,t.Hour=12,t.Minute=30,t.Second=25。,4.2.2 带参数的构造函数 带参数的构造函数具有以下特点:1.函数名与类名相同;2.不能有返回值,void类型也不可以;3.具有一个或多个参数; 同一个类中可以有一个或多个带参数的构造函数,在初始化对象时可以根据需要选择不同参数的构造函数来实例化类。 例4-4 带参数构造函数的使用,using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1public class Employee string ID; /员工代号 string empName;/员工姓名 double empSalary; /员工工资 public Employee()/默认构造函数 ID = 9999; empName = 李红; empSalary=5000; public Employee(string EmpID, double Salary) /带两个参数的构造函数 ID = EmpID; empSalary = Salary; ,ublic Employee(string EmpID, string EmpName,double Salary) /带三个参数的构造函数 ID = EmpID; empName=EmpName; empSalary = Salary; public string GetEmpID() return ID; public double GetSalary() return empSalary; ,class Program static void Main() Employee e1 = new Employee(001, 5000);/调用带两个参数的构造函数 Employee e2 = new Employee(001, 王华 ,5000);/调用带三个参数的构造函数 Employee e3 = new Employee(); /调用默认构造函数 Console.WriteLine(员工:代号0,工资1, e1.GetEmpID(), e1.GetSalary(); Console.WriteLine(员工:代号0,工资1, e2.GetEmpID(), e2.GetSalary(); Console.WriteLine(员工:代号0,工资1, e3.GetEmpID(), e3.GetSalary(); ,程序运行结果如图4-3所示。,图4-3 程序运行结果,以上程序包含两个带参数的构造函数和一个自定义的默认构造函数。生成对象时,编译器会根据传入的参数个数、类型,自动调用合适构造函数。注意:构造函数的访问修饰符一般为public。,4.2.3 析构函数 与构造函数相对应,析构函数用于清理对象。析构函数具有以下特点:1.析构函数名是由类名和波浪号组成,即类名;2.不能由任何返回值,void类型也不可以;3.不能有任何的访问修饰符;4.最多只能有一个析构函数;,C#中析构函数是在适当的时候被资源回收器调用的,不能保证一定会被调用,也不能保证其调用顺序,析构函数也不能被外部程序显式调用。虽然在析构函数中一般可以释放对象实例占用的重要资源,如数据库连接等,但由于析构函数的调用是随机的,没有任何保证,所以这些释放重要资源的工作最好是存放在一个独立的成员函数中,由程序显式调用。,4.3 this关键字 this关键字用来代表对象自身。this关键字可以用来解决名称相同的问题。 为4.2.2节中的类Employee添加一个带参数的构造函数,如下所示。public Employee(string empName, string ID)this.empName=empName; this. ID=ID; 该构造函数在初始化类的成员变量empName和ID时,参数的名与数据成员的名正好相同,通过使用this关键字来区分哪个是参数,哪个是数据成员。此时this关键字指向当前的对象,所以带this的是类的数据成员,而不带this 的是参数。 例4-5使用this关键字调用类的其它构造函数,using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1 class Employee string ID; /员工代号 double empSalary; /员工工资 public Employee():this(001,4500.5)/默认构造函数 public Employee(string ID, double empSalary) /带两个参数的构造函数 this.ID = ID; this.empSalary = empSalary; ,ublic string GetEmpID() return ID; public double GetSalary() return empSalary; class Test static void Main() Employeee1=new Employee( ); Console.WriteLine(员工:代号0,工资1,e1.GetEmpID(),e1.GetSalary(); ,程序运行结果如图4-4所示。,图4-4 程序运行结果,在上述程序中,用户自定义的默认构造函数中没有编写额外的代码,直接用this关键字来调用带参数的构造函数。如果有多个带参数的构造函数时,编译器如何判断要调用哪一个构造函数呢?此时编译器就根据传入参数的个数和类型来确定。由于this后传入两个参数,一个为字符串,另一个为double类型,编译器会依此找到符合此条件的构造函数。,如果有多个带参数的构造函数时,编译器如何判断要调用哪一个构造函数呢?此时编译器就根据传入参数的个数和类型来确定。由于this后传入两个参数,一个为字符串,另一个为double类型,编译器会依此找到符合此条件的构造函数。 例4-6 使用this关键字来返回当前对象的引用,using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1 class Employee string ID; /员工代号 string empName; /员工姓名 public Employee SetEmpName(string name) this.empName = name; return this; ,ublic Employee SetEmpID(string id) this. ID = id; return this; /此时,你可以使用下面的语法设置员工的代号与名称:class Teststatic void Main() Employeee1=new Employee( ); e1.SetEmpID(001).SetEmpName(张木); ,4.4 属性 为了访问类的私有数据成员,通常需要提供一些公共的访问数据成员的方法,其他类要访问该类的私有数据成员,必须通过调用该类的公共访问数据成员的方法来访问。语法:访问修饰符数据类型属性名 get /获取属性值set /设置属性值 ,说明: 1.属性拥有两个类似于函数的块,get块用于获取属性的值,set块用于设置属性的值。这两个块也称为访问器,分别用get和set关键字来定义。可以忽略其中的一个块来创建只读或只写属性,忽略get块创建只写属性,忽略set块创建只读属性。 2.访问器可包含访问修饰符,一般应该将属性定义成public的。 3.属性至少要包含一个块才是有效的。 4.属性名称一般要求单词首字母大写。,4.4.1 Get块 Get块必须有一个与属性类型相同的返回值,简单的属性一般与一个私有数据成员相关联,以控制对这个数据成员的访问,此时get块可以直接返回该数据成员的值。private int x; public int Xgetreturn x;属性X只定义get块,所以该属性为只读属性。,4.4.2 Set块 Set块把一个值赋给数据成员,该值(即用户提供的值)使用关键字value引用。private int x; public int Xsetx=value;属性X只定义set块,所以该属性为只写属性。在属性X的set块中,把数据成员的初始值通过关键字value传递给私有的数据成员x。,例4-7 属性的简单应用using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1class TimePeriod private double seconds; public double Hours get return seconds / 3600; set seconds = value * 3600; ,class Program static void Main() TimePeriod t = new TimePeriod(); t.Hours = 24; System.Console.WriteLine(Time in hours: + t.Hours);程序运行结果如图4-5所示。,图4-5 程序运行结果,这段程序定义了一个TimePeriod类,该类具有一个属性Hours, 使用get访问器获取数据成员seconds转换成的小时数,而使用set访问器通过value关键字将小时转换成秒赋值给数据成员seconds。在Main函数中,语句t.Hours=24对属性Hours进行赋值操作,此时将调用Hours属性的set访问器,关键字 value代表的值就是用户提供的值24,所以私有数据成员seconds的值为24*3600;语句System.Console.WriteLine(“Time in Hours:”+t.Hours);访问属性Hours,此时将调用Hours属性的get访问器,返回结果是私有数据成员seconds的值所对应的小时数。,使用属性还可以防止外部非法数据的入侵。比如月份的取值应该在112之间,为了防止不合法数据的入侵,可以定义Month属性来实现,4.5方法 在面向对象的程序设计中,方法用于执行对象的各种操作,即对象的行为特征,方法是类的一个重要成员。格式:访问修饰符方法名(参数列表) /方法体,4.5.1 访问修饰符 你的家人进入你的卧室,但是不能查看你的日记本,你的邻居可以进入你的客厅,但是不能进入你的卧室,陌生人没有经过你的同意甚至不能进入你的客厅。访问修饰符的概念与此非常相似,用来确定对类或成员的访问权限。,1.public public成员称为公共成员,公共成员访问级别最高,对公共成员的访问没有任何限制。 例4-8 public成员的使用在类MainClass中可以访问类Point中的公共成员x和y。因为x和y是公共成员,所以访问它们不受任何限制。,class Point public int x; public int y;class MainClass static void Main() Point p = new Point(); p.x = 10; p.y = 15; Console.WriteLine(x = 0, y = 1, p.x, p.y); ,2.private private成员称为私有成员,私有成员的访问级别最低,只能在自身所属的类中才能被访问。例4-9 private成员的使用,class Employee private string name = FirstName, LastName; private double salary = 100.0; public string GetName() return name; public double Salary get return salary; ,class MainClass static void Main() Employee e = new Employee(); string n = e.name;/错误的语句,name是私有成员 double s = e.salary;/错误的语句,salary是私有成员 string n = e.GetName();/正确语句,GetName是公共成员 double s = e.Salary;/正确语句,Salary是公共成员 ,3.protected protected成员称为受保护成员,受保护成员只能被自身所在的类或自身所在类的派生类中的代码访问。 例4-10 protected成员的使用关于基类和派生类的概念在“继承”一节中做详细介绍。,class Point protected int x; protected int y;class DerivedPoint: Point /DerivedPoint类是Point的派生类 static void Main() DerivedPoint dp = new DerivedPoint(); dp.x = 10; /正确,DerivedPoint是类Point的派生类,可以直接访问基类的受保护成员dp.y = 15; /正确,DerivedPoint是类Point的派生类,可以直接访问基类的受保护成员 Console.WriteLine(x = 0, y = 1, dp.x, dp.y); ,4.internal internal成员称为内部成员,内部成员只有在同一程序集的文件中才是可访问的。例4-11 internal成员的使用,/ Assembly1.cs/ compile with: /target:libraryinternal class BaseClass public static int intM = 0;/ Assembly2.cs/ compile with: /reference:Assembly1.dllclass TestAccess static void Main() BaseClass myBase = new BaseClass(); / Error CS0122 ,该示例包含两个文件:Assembly1.cs 和 Assembly2.cs。第一个文件包含内部基类 BaseClass。在第二个文件中,实例化 BaseClass 的尝试将产生错误。,4.5.2 参数的分类 C#中方法的参数有四种类型:值参数、引用参数、输出参数和数组型参数。1.值参数 值参数不含任何的修饰符。形参是实参的一份拷贝,方法中对形参的值的修改不会影响到实参的值。例4-12 值参数的运用,using System.Text;using System;using System.Collections.Generic;namespace ConsoleApplication1class Testpublic static void MyMethod(int a)a +;public static void Main()int p=5; Console.WriteLine(这是p=0,p); MyMethod(p);Console.WriteLine(这是调用方法后的p=0,p);,程序运行结果如图4-6所示。,图4-6 程序运行结果,通过程序的运行结果可以看出,变量p的值调用方法前和调用方法后没有发生变化。因为方法MyMethod的形参a是值参数,a是p的一个副本,所以对a的值的修改不会影响到p的值。,2.引用参数 引用参数用关键字ref声明。传递的参数实质上是实参的一个指针,即地址。所以方法中对形参的操作就是对实参的操作。使用引用参数时,必须在方法定义和方法调用时都明确的指明ref关键字,且要求实参变量在传递给方法前必须初始化。 例4-13 引用参数的运用,using System.Text;using System;using System.Collections.Generic;namespace example class Test public static void RefParam( ref int a) a +; public static void Main() int x=0; Console.WriteLine(这是RefParam之前的x=0, x); RefParam(ref x); Console.WriteLine(这是调用RefParam方法后的x=0, x); ,程序运行结果如图4-7所示。,图4-7 程序运行结果,变量x在调用方法RefParam()之前,初始化值为0。从程序的运行结果可以看出,变量x的值在调用方法RefParam()后发生改变了。这是因为a是引用参数,在调用方法RefParam()时,实参x将其自身在内存中的地址传递给了形参a,所以形参a与实参x在内存中共用同一内存单元,对形参a的操作实际上就是对实参x的操作,所以方法RefParam()对a值的修改会直接影响到x的值。,3.输出参数 输出参数用关键字out声明。与引用参数类似,输出参数也是直接对实参进行操作的,在方法声明和方法调用时都必须明确指明out关键字。输出参数不要求变量在传递给方法之前进行初始化,但是在方法返回前必须对输出参数进行赋值。 例4-14 输出参数的运用,using System.Text;using System;using System.Collections.Generic;namespace ConsoleApplication1class Testpublic static void OutParam( out int a)a=100; public static void Main()int x ; OutParam(out x); Console.WriteLine(这是调用OutParam方法后的x=0, x); ,程序运行结果如图4-8所示。,图4-8 程序运行结果,4.数组型参数 数组型参数用关键字params声明,该关键字用来声明具有可变长度的参数列表,方法声明中最多只能包含一个params参数,并且该参数必须是参数列表中最后一个参数。 例4-15 数组型参数的运用,using System.Text;using System;using System.Collections.Generic;namespace ConsoleApplication1class Testpublic static double VarLenParam( params int v) double sum=0; foreach (int i in v) sum += i; double average = sum / v.Length; return average; public static void Main() double x =VarLenParam(1,3,5,7,9); Console.WriteLine(这是1+3+5+7+9的平均值=0, x); x = VarLenParam(2, 4, 6, 8); Console.WriteLine(这是2+4+6+8的平均值=0, x); ,程序运行结果如图4-9所示。,图4-9 程序运行结果,在上述例子中,将变动长度的参数声明为一维数组,调用方法时,根据实参的个数确定一维数组的长度。,4.5.3 方法重载 在C#中,为了给功能相似的方法提供同一名称,实现编译时的多态性,引入了方法重载这一概念。方法重载 (overloaded methods)是面向对象程序设计的一个重要概念,它具有以下特点: 1.方法名相同; 2.参数列表不完全相同,即参数的个数或参数的类型不同。 当一个重载方法被调用时,C#会根据参数的个数及其类型自动匹配调用具体的方法。,1.参数个数不同的方法重载例4-16 参数个数不同的方法重载 using System;using System.Collections.Generic;using System.Text;namespace example class OverLoadMethod void Max(int num1, int num2) int max; Console.WriteLine(0和1中较大的数字是:2,num1,num2,max=(num1num2 ? num1:num2); ,void Max(int num1, int num2, int num3) int max = num1 num2 ? num1 : num2; max = max num3 ? max : num3; Console.WriteLine(0、1和2中最大的数字是:3,num1, num2, num3, max); static void Main(string args) OverLoadMethod p1 = new OverLoadMethod(); p1.Max(23, 52);/调用具有两个参数的Max方法 p1.Max(13, 25, 64);/调用具有三个参数的Max方法 ,程序运行结果如图4-10所示。,图4-10程序运行结果,以上程序中定义了两个Max方法,第一个Max方法接受两个int型参数,第二个Max方法接受三个int型参数。所以在Main函数中,p1.Max(23,52)会自动根据参数的个数(两个)和参数的类型(int)进行匹配调用第一个max方法,而p1.Max(13,25,64)则根据参数个数(三个)和参数类型(int)进行匹配调用第二个max方法。,2.参数类型不同的方法重载例4-17 参数类型不同的方法重载using System;using System.Collections.Generic;using System.Text;namespace exampleclass OverLoadMethodint Maxinum(int numbers) int temp = numbers0; foreach (int i in numbers) if (temp i) temp = i;, return temp; double Maxinum(double numbers) double temp = numbers0; foreach (double i in numbers) if (temp i) temp = i; return temp; static void Main(string args) OverLoadMethod p = new OverLoadMethod(); int num = 100, 0, 23, 45, -50, 300 ; double mdbNum=0.5,8.3,12.8,45.9,21.7; Console.WriteLine(最大的整数是:0, p.Maxinum(num); Console.WriteLine(最大的小数是:0, p.Maxinum(mdbNum); ,程序运行结果如图4-11所示。,图411程序运行结果,Main()方法中对象p调用Maxinum方法会自动根据参数的类型是int还是double决定调用哪个重载方法。参数num是一个int型数组,所以调用第一个Maxinum方法;参数mdbNum是一个double型数组,所以调用第二个Maxinum方法。,4.6 静态和实例类成员 属性、方法和数据成员可以分为两大类:静态成员和实例成员。静态成员(包括静态方法、静态属性和静态字段)在类的实例之间是共享的,所以调用静态成员时,不需要实例化类,直接用类名调用。而实例成员属于类的对象所有,直接由对象调用。 如果一个成员要声明为静态成员,只需要在该成员的访问修饰符的后面加上static关键字即可。例4-18 静态和实例成员,class MyClass public int a; public static int b; void fun1() a = 10; b = 20; static void fun2() a = 10; b = 20; class Program static void Main(string args) MyClass A = new MyClass(); A.a = 10;/正确,a是实例成员 A.b = 10;/错误,b是静态成员 MyClass.a = 20;/错误,a是实例成员 MyClass.b = 20;/正确,b是静态成员 ,此课件下载可自行编辑修改,供参考!感谢您的支持,我们努力做得更好!,

    注意事项

    本文(C#中的类与对象课件.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开