《程序设计1c课件c5类》由会员分享,可在线阅读,更多相关《程序设计1c课件c5类(40页珍藏版)》请在金锄头文库上搜索。
1、1,第五章 类与对象,C#语言程序设计,河北理工大学,2,本章主要内容,理解分类和抽象 类概念和声明 对象 构造函数 理解static方法和数据,3,理解分类,类(class)是分类(classification)的词根。 设计一个类的过程就是对信息进行分类,并将相关信息放到一个有意义的实体中的过程。 分类在人类思考以及交流过程中根深蒂固,面向对象编程语言的宗旨就是写程序可以尝试对一个问题及其解决方案中不同的概念进行分类,然后用一种编程语言对这些类进行建模。,4,抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 数据抽象:描述某类对象的属性或状态(对象相互区别
2、的物理量)。 方法抽象:描述某类对象的共有的行为特征或具有的功能。,5,抽象实例钟表,数据抽象: int Hour, int Minute, int Second 方法抽象: SetTime(), ShowTime(),6,抽象实例人,数据抽象: string name,string gender,int age,int id 方法抽象: 生物属性角度: GetCloth(), Eat(), Step(), 社会属性角度: Work(), Promote() ,7,封装的目的,封装(Encapsulation)是定义一个类的重要原则。 中心思想:使用一个类的程序不应关心类的内部实际如何工作。
3、封装有时也称为信息隐藏。,8,封装的目的,第一,将方法和数据合并到一个类中,换言之为了支持分类。 第二,控制方法和数据的可访问性,换言之为了控制类的使用。,9,类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。,10,C#中类的声明形式,类是一种用户自定义类型,声明形式:,class 类名 类的数据和方法 ,11,class Circle double Area( ) return 3.141592 * radius * radius; double radius; ,下面是一个名为Circle的C#类,其中包含一个方法A
4、rea (用于计算圆的面积)和一个数据radius (圆的半径):,12,实例方法,实例方法(非静态方法)和静态方法的编写方式是一样的,不同的是不需要static关键字。,13,对象,类的对象是该类的某一特定实体,即类类型的变量。 声明形式: 类名 对象名; 例: Circle c;,14,对象,创建对象使用new关键字 例如 c = new Circle( );,可以使用new关键字在一个程序中创建Circle类的许多实例,就像能在一个程序中创建许多int变量一样。,Circle c = new Circle( );,15,class Circle double Area( ) return
5、 3.141592 * radius * radius; double radius; ,控制可访问性,类内定义的字段和方法可以被类内的其他方法看见,但外界是看不到它们的。也就是说它们是“私有”的。,16,可以使用public和private关键字来修改字段或方法的定义,决定它们是否能从外部访问。,控制可访问性,17,一个方法或字段假如只允许从类的内部访问,就说它是私有(private)的。为了声明一个private字段或方法,只需在它的声明之前添加private关键字。 一个方法或字段假如既能从类的内部访问,也能从外部访问,就说它是公共(public)的。为了声明一个public字段或方法,
6、只需在它的声明之前添加public关键字。,控制可访问性,18,class Circle public double Area( ) return 3.141592 * radius * radius; private double radius; ,Circle类可修改如下:,19,可以使用圆点表示法在一个Circle对象上调用Area方法:,class CircleTest static void Main(string args) Circle c = new Circle(); double areaOfCircle = c.Area(); /计算c的面积 double rds = c
7、.radius; /编译错误,不可访问 ,20,构造函数,构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。 在对象创建时由系统自动调用。 如果程序中未声明,则编译器自动产生出一个默认形式的构造函数。 构造函数与类同名,能获取参数,但不能返回任何值(不使用void)。,21,构造函数,class Circle public Circle( ) radius = 0.0 public double Area( ) return 3.141592 * radius * radius; private double radius; ,默认构造函数:不获取任何参数
8、的构造函数。,22,构造函数被标记为public。如果省略该关键字,构造函数将默认为private,而一个函数是private的,它就不能在类的外部使用,造成无法从Circle类外部的方法中创建Circle对象。,23,重载构造函数,构造函数只不过是一种特殊种类的方法,和所有方法一样,它是可以重载的。因此我们可以写一个构造函数的不同版本。,class Circle public Circle( ) /默认构造函数 radius = 0.0; public Circle( double initialRadius) /重载的构造函数 radius = initialRadius; ,24,cla
9、ss Circle public Circle(double initialRadius) radius = initialRadius; public void WriteRadius() Console.WriteLine(“半径为0“,radius); private double radius; ,25,class TestCircle static void Main(string args) Circle c = new Circle(1.5); c.WriteRadius(); ,26,注意:,构造函数在类中的排列顺序是无关紧要的;可以随意采用任何顺序来定义它们; 在C#中一旦为
10、一个类写了任何构造函数,编译器就不会再生成默认构造函数。因此如果写了 一个构造函数,并让它接受一个或多个参数,同时还想要一个默认构造函数,那么必须自己动手来写这个默认构造函数。,27,public class Employee private int salary; public Employee(int annualSalary) salary = annualSalary; public Employee(int weeklySalary, int numberOfWeeks) salary = weeklySalary * numberOfWeeks; ,Employee e1 = ne
11、w Employee(30000); Employee e2 = new Employee(500, 52);,Employee e = new Employee(); /编译错误,28,命名和可访问性,public性质的标识符应该以大写字母开头。由多个单词组成时,每个单词的首字母大写,这是PascalCase命名法。 非public性质的标识符应该以小写字母开头。若由两个或两个以上单词组成,从第二个单词开始首字母大写,这是camelCase命名法。 类名采用PascalCase命名法。,29,理解static方法和数据,在C#中所有方法都必须在一个类的内部声明。 如果使用标识符static来
12、声明一个方法或字段,就可以使用类名来调用方法或访问字段,而不需要先创建类的一个实例。,30,例如Math类中的Sqrt方法,我们是在类本身上调用方法,而不是在Math类型的一个对象上调用。假如Sqrt是Math类的一个实例方法,那么必须先创建一个Math对象然后才能在那个对象上调用Sqrt:,Math m = new Math(); double d = m.Sqrt(42.24),Math对象在平方根计算中根本不发挥任何作用,在这里不需要真正用到类,所以不能强迫Sqrt成为一个实例方法。,理解static方法和数据,31,理解static方法和数据,定义了一个static方法后,它不能访问为
13、类定义的任何实例字段,它只能使用标记为的static字段。 一个static方法只能直接调用类中标记为static的其它方法,非static方法要求先创建一个对象,然后才能在那个对象上调用那些方法。,32,class Min2 public static void Main( ) int j = 78, k = 3 * 30; int m = Min(j, k); Console.WriteLine(“Minimum of 0 and 1 is 2“, j, k,m); public static int Min(int a, int b) if (a b) return a; else re
14、turn b; ,33,class Min2 public static void Main( ) int j = 78, k = 3 * 30; Min2 mc = new Min2( ); int m = mc.Min(j, k); Console.WriteLine(“Minimum of 0 and 1 is 2“, j, k,m); public int Min(int a, int b) if (a b) return a; else return b; ,34,创建static字段,在定义一个字段时使用static关键字,则这个字段能在类的所有对象之间共享(非static字段则局
15、部于一个类的每个实例)。 访问static字段时要用类名最为前缀,而不是使用该类的一个实例作为前缀。,35,创建static字段,class Circle public Circle( ) radius = 0.0; NumCircles+; public Circle( double initialRadius) radius = initialRadius; NumCircles+; private double radius; public static int NumCircles = 0; ,36,创建static字段,所有Circle对象都共享同一个NumCircles字段,所以每次新建一个实例时, NumCircles的值都递增1.,static void Main(string args) Circle c1 = new Circle(); Circle c2 = new Circle(0.5); Circle c3 = new Circle(1.0); Console.WriteLine(“Circle对象共有0个“, Circle.NumCircles); ,37,使用const关键字创建static字段,const是“constant”(常量)的简称,它的值是永远不会改变的。 const字段也是static字段,但在声明时不使用static关键字。 con