第三章 类与对象_Done_第1页
第三章 类与对象_Done_第2页
第三章 类与对象_Done_第3页
第三章 类与对象_Done_第4页
第三章 类与对象_Done_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 类与对象,编程的思想,面向过程编程:是一种以过程为中心的编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象编程:客观世界中的事物都是对象,用对象来处理现实中的问题。,编程的语言,C语言属于面向过程的编程语言。 C+、C#、JAVA等属于面向对象编程的语言。,对象,属性,型号,价格,里程,行为,起动,停车,行驶,属性,车轮数量,档的数量,行为,加速,换档,刹车,属性,名称,颜色,品种,行为,摇尾巴,吃东西,犬 吠,类与对象的关系,类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。

2、而对象是具有类类型的变量。 类是对象的抽象,而对象是类的具体实例。 类是抽象的,不占用内存,而对象是具体的,占用存储空间。,类,类中包括成员变量和成员方法,具体定义如下:,语法:,访问修饰符 class , / 类的主体 ,示例: class Employee / 类的主体 ,/ 成员变量 / 成员方法,类的访问修饰符,对象的创建,Employee my = new Employee(); 对象是类的一个实例。,语法:,成员变量,访问修饰符,数据类型,成员变量;,private,protected,internal,public,_name,status,.,userName,int,char

3、,.,bool,=初始值;,可选,成员变量也称为字段,函数如何调用,如何传递参数,如何带回返回值需要重点强调。,成员变量, class Employee public string name =“tommy”; public char gender; private string qualification; uint salary; ,访问成员变量,步骤 1:创建一个类的对象,Employee objEmployee = new Employee();,步骤 2:使用点号访问成员变量,objE = “张三; objE = M;,访问修饰符 2-

4、1,Teacher 类,private 成员,protected 成员,public 成员,internal 成员,Student 类,只有 Student 类在 Teacher 类都在同一项目中,才可访问internal成员,不可访问,不可访问,可以访问,访问修饰符,声明方法,语法,访问修饰符(可选),默认情况下为 private,访问修饰符 返回类型 (参数列表) / 方法主体 ,如果不需要返回任何值,方法可能返回 void 数据类型 方法也可以称为函数,访问类成员,1. 在本身类的内部调用 直接使用类成员变量和类成员方法。,访问类成员,2. 在类外部调用类中的成员 通过对象名进行调用(具

5、有访问权限时)。,对象名.方法名(参数列表);,对象名.变量;,需结合实例讲解方法的调用、参数传递以及返回值等问题。,类与数据类型,类也是一种数据类型 定义对象同声明一个基本类型的变量是一样,两个特殊的函数,构造函数:创建对象时被调用,用于初始化对象的函数。 析构函数:删除对象时被调用,用于执行一些清理工作:释放内存等。,构造函数,构造函数用于初始化类实例的状态 每个新实例创建的时候执行 如果希望能从类的外部创建类的实例,需要声明构造函数为public 面向对象的思想中就是采用构造函数给对象初始化,构造函数,构造函数的名称和类名相同 构造函数不能有返回值 创建对象时有new来调用,构造函数,访

6、问修饰符 (参数列表) / 构造函数的主体 ,默认的构造函数,如果类中没有显示地提供构造函数,那么编译器提供一个隐式的默认构造函数,该函数特征: 不带参数 方法体为空 如果定义了一个或多个构造函数,那么编译器将不会为该类提供默认的构造函数,默认的构造函数,默认的构造函数可以被重写 class A public A() ,带参数的构造函数,参数的语法与其他方法的语法一样,构造函数可以重载。 class A public A(int x) ,带参数的构造函数,构造函数之间可以相互调用,通过this关键字。,class Circle private double x, y; private doub

7、le r; /* 错误的构造函数写法。变量作用域 public Circle(double x1, double y1, double r1) double x = x1; double y = y1; double r = r1; */ /* 不是很好的构造函数。尽量让形参和类变量不同名 public Circle(double x,double y,double r) */,析构函数,由系统自动调用类的默认析构函数,程序员可以不作任何处理。,属性,类成员变量的外部访问方法,1. 把类成员变量设置为public,外部直接访问 static void Main() Circle cir = n

8、ew Circle(); Console.WriteLine(cir.x); cir.x = 100; class Circle public double x; ,类成员变量的外部访问方法,优点: 访问起来非常方便。 缺点: 如果变量只读或只写没法控制 用户可以随意修改变量,内部无法控制 破坏了类的封装性,信息应该对外隐藏,类成员变量的外部访问方法,2. 把类成员变量设置为private,提供访问方法 class Circle private double x; public double GetX() return x; public void SetX(double x1) if (x1

9、 0) x = x1; ,类成员变量的外部访问方法,static void Main() Circle cir = new Circle(); Console.WriteLine(cir.GetX(); cir.SetX(100); ,类成员变量的外部访问方法,优点: 用户修改可控 满足了类的封装性,数据隐藏 可以使变量只读或只写 缺点: 访问起来不是很方便,函数调用,类成员变量的外部访问方法,属性具有前面两种访问方式的优点,弥补他们的缺点。,属性,属性是用来封装类数据的极佳选择,可以限制外部对类中成员变量的存取权限,实现良好的数据封装和数据隐藏。,属性的使用,用属性声明对属性进行定义,通过g

10、et 和 set访问函数将专用数据成员和公共属性关联起来。根据使用情况不同,可以只用get(只读属性)或者只用set(只写属性),也可以同时使用get和set。属性是一个函数。 get:用来读取数据成员的值。 set:用来设置数据成员的值。 快捷方式: propfull + “Tab”,例如: private int number = 0; public int MyNumber get return number; set /value是关键字,其值由编译器自动生成。 number = value; ,属性,注意: 如果想要存取某个属性值,可以采用这样的语法: 类的实例名.属性名称 如果把属

11、性定义为静态的,则用: 类名.属性名称,属性的高级用法,private int number = 0; public int MyNumber get return number; set if (value = 0 对操作进行更多的控制,属性和方法的区别,属性是一种特殊的方法,其不同之处有: 属性不必使用括号(),但方法一定要使用括号。 属性不能指定参数,方法可以指定参数。 属性不能使用void类型,方法则可以使用void类型。 属性不为数据存储分配空间,属性可以使用virtual、override和abstract关键字,但这几个关键字不能用于字段 访问器(get、set)可以有自己的可访

12、问性 public int MyInt get return myInt; protected set myInt = value; 但不能高于属性本身的可访问性。,静态成员与实例成员,所有对象共用的内容也可以定义为静态(static)的。 静态成员和静态方法在系统中只有一份 静态的成员或者方法要等到应用程序结束时才会消失。 我们把只有创建了类的实例才能够使用的成员叫实例成员。,静态成员与实例成员,使用静态成员时,无需实例化对象,而使用实例成员时必须实例化对象。 包括静态成员变量和静态成员函数。 C#不支持方法内的静态变量,静态成员,示例说明静态成员变量是所有对象共用的,而成员变量是属于各自对

13、象的。,静态成员变量,所有对象共享一份静态成员变量,一旦改变所有对象中静态成员变量都改变。访问方法: 在类内部,和访问普通变量一样 在类外部:类名.静态成员变量,静态成员变量,统计一下某程序中类创建了多少个对象? 只允许创建类的一个对象,静态成员函数,不能访问实例成员,可以访问静态成员。 调用方法: 类名.静态成员函数名(参数列表),方法重载,在类中方法名称相同的方法称为方法重载(OverLoad); 例如:加法函数。,方法重载,方法重载的条件: 参数数目不同 参数类型不同 以上两个条件至少满足一个即可构成方法重载。,方法重载,方法返回值也可以不同 形参名称也可以不同 以上两个条件不能构成方法

14、重载。,函数的参数传递,参数的值传递方式,工资计税的方法为:低于等于1600不计税,超出1600的部分按10%缴税,int pay; / 税前工资 float taxRate = 0.1f; / 税率 float afterTax; / 税后工资 Console.WriteLine(请输入税前工资:); pay = int.Parse(Console.ReadLine(); if (pay = 1600) / 低于1600不缴税 afterTax = pay; else / 高于1600 部分按税率缴税 afterTax = pay - (pay - 1600) * taxRate; Cons

15、ole.WriteLine(税前工资0,税后工资1, pay, afterTax);,怎样用方法实现?,演示示例2:自定义方法计算税后工资,示例2代码分析,关键代码回顾:,示例2源代码,/ 此方法根据税前工资计算税后工资 private static float GetPay( int pay, float taxRate ) float afterTax; if (pay = 1600) / 低于1600不缴税 afterTax = pay; else / 高于1600 部分按税率缴税 afterTax = pay - (pay - 1600) * taxRate; return after

16、Tax; ,传入税前工资、税率,返回税后工资,为什么使用 ref,下面代码输出结果是什么?,static void Main(string args) int num1 = 5, num2 = 10; / 两个数字 Console.WriteLine(交换前两个数的值分别为:0和1, num1, num2); Swap(num1, num2); / 交换两个数的值 Console.WriteLine(交换后两个数的值分别为:0和1, num1, num2); / 交换两个数的方法 private static void Swap(int num1, int num2) int temp; /

17、中间变量 temp = num1; num1 = num2; num2 = temp; ,值传递不能保留参数的修改 要按引用传递,使用 ref,通过引用传递参数,ref 修饰参数: 调用方法后,参数值的更改仍然保留,演示示例3:使用 ref 交换两个数,示例 3 分析,static void Main(string args) Console.WriteLine(交换前两个数的值分别为:0和1, a, b); / 交换两个数的值 Swap(ref a, ref b); Console.WriteLine(交换后两个数的值分别为:0和1, a, b); ,/ 交换两个数的方法 private s

18、tatic void Swap(ref int num1, ref int num2) int temp; / 中间变量 temp = num1; num1 = num2; num2 = temp; ,调用时也要使用 ref,两种传参方式的比较,调用方法,方法定义,ModifyValue( num1, ref num2);,ModifyValue( int param1, ref int param2) ;,调用前,num1=3,num2=5,param1=3,param2=5,方法中修改:,调用后,param1=4,param2=6,num1=3,num2=6,调用,值传递,引用传递,数组变

19、量间的赋值 对象变量间的赋值 数组名作为参数传递 对象作为参数传递,class Program private static void f(int array) array0 = 8; array1 = 88; static void Main(string args) int arr = new int5 1, 2, 3, 4, 5 ; f( arr); foreach (int i in arr) Console.WriteLine(i); Console.ReadLine(); ,class Program private static void Swap(A b) b.x = 8; b

20、.y = 88; static void Main(string args) A a = new A(); a.x = 1; a.y = 2; Swap(a); a.x = 1; a.y = 2; Console.WriteLine(0,1,a.x, a.y); Console.ReadLine(); class A public int x; public int y; ,(5)通过值传递传递引用类型 usingSystem; classPassingRefByVal staticvoidChange(intarr) arr0=888; arr=newint5-3,-1,-2,-3,-4;

21、Console.WriteLine(Inside,thefirstis:0,arr0); publicstaticvoidMain() intmyArray=1,4,5; Console.WriteLine(before,thefirstis:0,myArray0); Change(myArray); Console.WriteLine(after,thefirstis:0,myArray0); ,特点: 可以改变引用类型的数据值 但不能为引用类型重新分配内存空间,(6) 通过引用传递引用类型 usingSystem; classPassingRefByRef staticvoidChange

22、(refintarr) arr0=888; arr=newint5-3,-1,-2,-3,-4; Console.WriteLine(Inside,thefirstis:0,arr0); publicstaticvoidMain() intmyArray=1,4,5; Console.WriteLine(beforecalling,thefirstis:0,myArray0); Change(refmyArray); Console.WriteLine(aftercalling,thefirstis:0,myArray0); ,特点: 不仅可以改变引用类型的数据值 也可以为引用类型重新分配内存

23、空间,数据类型,2.1 类型描述,类型分为:值类型、引用类型。 值类型直接存放真正的数据 ,值类型都有固定的长度,比如int占用4个字节,值类型的变量保存在堆栈上。作为值类型的变量,每个都有自己的数据,因此对一个变量的操作不会影响其他变量。,数据类型描述,引用类型存储对数据的内存地址的引用,位于受管制的堆上。堆用于存储可变长度的数据,比如字符串类型。作为引用类型的变量可以引用同一对象;因此对一个变量的操作会影响另一个变量所引用的同一对象。,值类型 引用类型 变量中存放 真正的数据 指向数据的引用指针 内存空间配置 堆栈(Stack) 受管制的堆(Managed Heap) 内存需求 较少 较多 执行效率 较快 较慢 内存释放 执行超过定义 由垃圾回收机制自动处理 时间点 变量的作用域时 可以为null 不可以 可以,值类型和引用类型的区别,2.2 值类型,C#的值类型可以分为三大类: 基本型:包括整型、浮点型、小数型、 布尔型,这些类型与其他语 言的基本数据类型相似。 结构型:适用于创建小型对象。 枚举型:除char类型以外的其它常数组成的 列表类型。,2.3 引用类型,引用类型存储对数据的内存地址的引用,位于受管制的堆上。 堆用于存储可变长度的数据,比如字符串类型。作为引用类型的变量可以引用同一对象;因此对一个变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论