《第4章:面向对象编程基础》由会员分享,可在线阅读,更多相关《第4章:面向对象编程基础(77页珍藏版)》请在金锄头文库上搜索。
1、第4章 面向对象编程基础,4.1类与对象 类(Class)是一组具有相同属性和行为的对象的抽象,而对象则是类的实例。 对象(Object)是面向对象程序设计的核心。世界上的一切人、事、物都是对象。因此可以说面向对象的程序设计,实质上是用计算机的语言描绘世界。,汽车设计图,第一辆汽车,第二辆汽车,第三辆汽车,4.1类与对象 对象具有静态的属性和动态的行为。 静态的属性用来描述对象的特征,如汽车可以用型号、价格、颜色等属性来描述。 动态的行为则表示对象可执行的动作,如汽车的行为可以有加速、转弯、后退等。在计算机中,属性用数据描述,而行为则用方法表示。,4.1.1 类的定义格式:类的访问修饰符cla
2、ss 类名:基类类名 类的成员; 说明: 类名要遵循标识符命名规则,一般而言,组成类名的单词的首字母要大写。,internal:内部类意味着只有当前项目中的代码才能访问该类。默认情况下,类声明为内部的。 public类称为公共类,不仅当前项目中的代码可以访问该类,其他项目中的代码也可以访问该类。 abstract(抽象类,不能实例化,只能继承) sealed(密封类,不能继承)。,类的访问修饰符:,类成员的定义格式如下: 访问修饰符数据成员; 访问修饰符成员方法; 数据成员用来描述每个对象所拥有的属性,成员方法则用来描述每个对象的行为。类成员的访问修饰符可以用以下关键字之一来定义, 1.pub
3、lic:该类成员可以由任何代码访问。 2.private:该类成员只能由类中的代码访问,如果不加以指明,则默认取值为private。 3.internal:该类成员只能由定义它的项目内部的代码访问。 4.protected:该类成员只能由该类或派生类中的代码访问。类成员的访问修饰符的详细介绍参见4.5.1节。,public class Car /数据成员,即对象的静态特征或状态 public string color; public string size; public string brand; /方法成员,即对象的动态特征或行为 public void beep() ,例4-1 创建一个
4、汽车类,4.1.2 对象的创建 类是一个静态概念,要想使用类,需要对类进行实例化,即创建对象。格式:类名对象名new 构造函数;说明: 1. new关键字用来创建对象,为对象在内存中分配空间,创建对象的实体。 2. 构造函数名与类名相同,关于构造函数的介绍将在后续章节进行,现在我们只需用类名后加上圆括号来代替。如:Car car1=new Car();,4.1.3 对象成员的访问创建对象后,就可以访问对象成员和运行对象中的方法。格式:对象名.成员名比如:car1.color=”yellow”;car1.size=”1.4”;car1.brand=”NISSAN”;car1.beep();,cl
5、ass Employee string mstrEmpID; /员工代号 string mstrEmpName;/员工姓名 /设置员工代号 public void SetEmpID(string EmpID) mstrEmpID=EmpID; /取得员工代号 public string GetEmpID() return mstrEmpID; /设置员工名称 public void SetEmpName(string EmpName) mstrEmpName=EmpName; /取得员工名称public string GetEmpName()return mstrEmpName; ,例4-2
6、创建一个Employee类,创建该类的一个对象e1,访问e1的成员,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 构造函数与析构函数 构造函数用来初始化对象,因此当类实例化时首先执行的函数就是构造函数。构造函数根据有无参数的
7、特点,可以分为默认构造函数和带参数的构造函数。析构函数是销毁对象时执行的函数。这两个函数的执行不需要人工干预,系统会自动地根据情况来调用相应的函数。,class Person public Person() Console.WriteLine(构造函数); Person() Console.WriteLine(析构函数); ,4.2.1 默认构造函数 不带参数的构造函数称为默认构造函数。默认构造函数可以是由编译系统提供的,也可以是程序员手工添加的。不论是哪种情况,默认构造函数都具有以下共同的特点: 1.函数名与类名相同; 2.不能有返回值,void类型也不可以; 3.没有任何参数; 例4-3
8、默认构造函数的使用,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所示。,
9、图4-2 程序运行结果,在初始化对象t时,调用自定义的默认构造函数,t.Hour=12,t.Minute=30,t.Second=25。,4.2.2 带参数的构造函数 带参数的构造函数具有以下特点:1.函数名与类名相同;2.不能有返回值,void类型也不可以;3.具有一个或多个参数; 同一个类中可以有一个或多个带参数的构造函数,在初始化对象时可以根据需要选择不同参数的构造函数来实例化类。 例4-4 带参数构造函数的使用,namespace ConsoleApplication1public class Employee string ID; /员工代号 string empName;/员工姓名
10、 double empSalary; /员工工资 public Employee()/默认构造函数 ID = 9999; empName = 李红; empSalary=5000; /带两个参数的构造函数 public Employee(string EmpID, double Salary) ID = EmpID; empSalary = Salary; ,public Employee(string EmpID, string EmpName,double Salary) /带三个参数的构造函数 ID = EmpID; empName=EmpName; empSalary = Salary
11、; 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.G
12、etEmpID(), 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#中析构函数是在适当的时候被资源回收器调用的,不能保证一定会被调用,也不能保证其调用顺序,析构函数也不能被外部程序显式调用。 虽然在析构函数中一般可以释放对象实例占用的重要资源,如数据库连接等,但由于析构函数的调用是随机的,没有任何保证,所以这些释放重要资源的工作最好是存放在一个独立的成员函数中,由程序显式调用。,