新版第4章-面向对象的编程基础课件.ppt

上传人(卖家):ziliao2023 文档编号:6489750 上传时间:2023-07-16 格式:PPT 页数:71 大小:512.50KB
下载 相关 举报
新版第4章-面向对象的编程基础课件.ppt_第1页
第1页 / 共71页
新版第4章-面向对象的编程基础课件.ppt_第2页
第2页 / 共71页
新版第4章-面向对象的编程基础课件.ppt_第3页
第3页 / 共71页
新版第4章-面向对象的编程基础课件.ppt_第4页
第4页 / 共71页
新版第4章-面向对象的编程基础课件.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、1 1第第4 4章章 面向对象的编程基础面向对象的编程基础 4.1 4.1 类类4.2 4.2 结构结构4.3 4.3 方法方法4.4 4.4 属性与索引器属性与索引器2 2 C#C#是一种强大的、面向对象的程序开发语言,本章将带是一种强大的、面向对象的程序开发语言,本章将带领读者进入领读者进入C#C#面向对象的世界面向对象的世界,学习,学习一些基本概念,包一些基本概念,包括对象、类等,以及如何创建和使用类的对象括对象、类等,以及如何创建和使用类的对象。为什么要学习对象和类?举举个简单的例子:汽车厂造车需要设计图和样板,然后造个简单的例子:汽车厂造车需要设计图和样板,然后造出汽车。编程也是一样

2、的出汽车。编程也是一样的,类,类好比是制造汽车的设计图和好比是制造汽车的设计图和样板,对象好比是汽车,这都是汽车厂不可或缺的东西。样板,对象好比是汽车,这都是汽车厂不可或缺的东西。第第4 4章章 面向对象的编程基础面向对象的编程基础 3 3 在现实世界中,对象就是拥有了这些特性和动作才会在这在现实世界中,对象就是拥有了这些特性和动作才会在这个世界上变得与众不同。因此,构成对象的两个最重要的个世界上变得与众不同。因此,构成对象的两个最重要的因素就是特征和动作。每一个现实世界中的实体都具有不因素就是特征和动作。每一个现实世界中的实体都具有不同的特征和动作。同的特征和动作。在编程领域,编程开发人员需

3、要尽可能地用对象来模拟现在编程领域,编程开发人员需要尽可能地用对象来模拟现实世界的实体,因此,在程序里,对象具有状态和行为。实世界的实体,因此,在程序里,对象具有状态和行为。对象的状态就是现实世界中对应实体的属性特征,对象的对象的状态就是现实世界中对应实体的属性特征,对象的行为就是现实世界中对应实体能够执行的动作。行为就是现实世界中对应实体能够执行的动作。在在 C#C#中,对象的状态被分别存储在一些变量里,而对象的中,对象的状态被分别存储在一些变量里,而对象的行为,则通过定义方法来实施。方法的作用就是要完成一行为,则通过定义方法来实施。方法的作用就是要完成一项特殊的工作。项特殊的工作。第第4

4、4章章 面向对象的编程基础面向对象的编程基础 4 4知识点知识点对象:明白对象的属性和方法,学会使用对象。对象:明白对象的属性和方法,学会使用对象。类:辨别对象和类,明白类的属性和方法,了解类:辨别对象和类,明白类的属性和方法,了解类的成员。类的成员。属性:学会在类中添加属性,保护数据安全,以属性:学会在类中添加属性,保护数据安全,以及封装字段。及封装字段。结构:如何创建结构,结构和类有什么区别?结构:如何创建结构,结构和类有什么区别?索引器:会使用索引器索引器:会使用索引器5 54.1 4.1 类类类与对象类与对象类:一组具有相同数据结构和相同操作的对象的集合。类:一组具有相同数据结构和相同

5、操作的对象的集合。例如例如:汽车汽车对象(实例):类的实例化对象(实例):类的实例化 。例如。例如:卡车卡车注意:注意:要使用对象,必须先定义类,然后再创建对象。要使用对象,必须先定义类,然后再创建对象。对象的生存周期对象的生存周期对象在建立时分配了内存,创建对象实际上作了两个方面的工作:对象在建立时分配了内存,创建对象实际上作了两个方面的工作:(1 1)使用)使用newnew保留字要求系统分配内存;保留字要求系统分配内存;(2 2)使用构造函数初始化数据。)使用构造函数初始化数据。销毁对象也是做了两个方面的工作:销毁对象也是做了两个方面的工作:(1 1)释放占用的内存;)释放占用的内存;(2

6、 2)将分配给对象的内存归还给堆()将分配给对象的内存归还给堆(HeapHeap)。)。6 64.1 4.1 类的组织类的组织1.1.类的声明类的声明用用classclass定义类,声明类的形式为:定义类,声明类的形式为:附加声明附加声明 访问修饰符访问修饰符 class class 类名称类名称:基类基类 ,接口序列,接口序列 字段声明字段声明 构造函数构造函数 方法方法 事件事件 注意注意:中的内容可省或任中的内容可省或任选其一选其一,当两者都有时当两者都有时,先基先基类后接口类后接口7 74.1 4.1 类的组织(续)类的组织(续)publicpublic class Child cla

7、ss Child private int age;private int age;private string name;private string name;/不带参数的构造函数不带参数的构造函数 public Child()public Child()name=none;name=none;/带参数的构造函数带参数的构造函数 public Child(string name,int age)public Child(string name,int age)如果不指明,则如果不指明,则默认为默认为internalinternal8 84.1 4.1 类的组织(续)类的组织(续)this.n

8、ame=name;this.name=name;this.age=age;this.age=age;/输出方法输出方法 public void PrintChild()public void PrintChild()Console.WriteLine(0,1 years old.Console.WriteLine(0,1 years old.,name,age);,name,age);public class Programpublic class Program 9 94.1 4.1 类的组织(续)类的组织(续)public static void Main()public static v

9、oid Main()/使用使用newnew关键字创建对象,关键字创建对象,newnew后是调用的构造后是调用的构造函数函数 Child child1=new Child(Zhang San,1Child child1=new Child(Zhang San,11);1);Child child2=new Child(Li Si,10);Child child2=new Child(Li Si,10);Child child3=new Child();Child child3=new Child();/显示结果显示结果 Console.Write(Child#1:);Console.Write(

10、Child#1:);child1.PrintChild();child1.PrintChild();Console.Write(Child#2:);Console.Write(Child#2:);child2.PrintChild();child2.PrintChild();Console.Write(Child#3:);Console.Write(Child#3:);child3.PrintChild();child3.PrintChild();10104.1 4.1 类的组织(续)类的组织(续)Console.ReadLine();Console.ReadLine();输出结果:输出结果:

11、Child#1:Zhang San,11 years old.Child#1:Zhang San,11 years old.Child#2:Li Si,10 years old.Child#2:Li Si,10 years old.Child#3:none,0 years old.Child#3:none,0 years old.1111c#c#中中thisthis的用法的用法 1 1、表示对象的当前实例。如果实例成员具有与形参相同的名称,则可以、表示对象的当前实例。如果实例成员具有与形参相同的名称,则可以这样使用以示区别。这样使用以示区别。2 2、将当前对象作为形参传递到其他方法中、将当前对

12、象作为形参传递到其他方法中 class Employeeclass Employee private string name;private string name;private string alias;private string alias;private decimal salary=3000.00m;private decimal salary=3000.00m;/Constructor:/Constructor:public Employee(string name,string alias)public Employee(string name,string alias)/Us

13、e this to qualify the fields,name and alias:/Use this to qualify the fields,name and alias:this.name=name;this.name=name;this.alias=alias;this.alias=alias;1212/Printing method:public void printEmployee()Console.WriteLine(Name:0nAlias:1,name,alias);/Passing the object to the CalcTax method by using t

14、his:Console.WriteLine(Taxes:0:C,Tax.CalcTax(this);public decimal Salary get return salary;class Tax public static decimal CalcTax(Employee E)return 0.08m*E.Salary;3 3、声明索引器、声明索引器 。由于静态成员函数存在于类一级,并且不是对象的一部分。由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有,因此没有 this this 指针。在静态方法中引用指针。在静态方法中引用 this this 是错误的。是错误的。c#c#中

15、中thisthis的用法的用法 1313静态类静态类l 类可以声明为类可以声明为 staticstatic 的,以指示它的,以指示它仅包含仅包含静态成员。静态成员。不不能使用能使用 newnew 关键字创建静态类的实例。关键字创建静态类的实例。静态类在加载包含静态类在加载包含该类的程序或命名空间时由该类的程序或命名空间时由 .NET Framework.NET Framework 公共语言运公共语言运行库行库 (CLR)(CLR)自动加载。自动加载。l 使用静态类来包含不与特定对象关联的方法。例如,创建使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象

16、关联的一组不操作实例数据并且不与代码中的特定对象关联的方方法,这种情况下应该法,这种情况下应该使用静态类来包含那些方法。使用静态类来包含那些方法。l 静态类的主要功能如下静态类的主要功能如下:它们仅包含静态成员。它们不能被实例化。它们是密封的。它们不能包含实例构造函数(C#编程指南)。1414 使用静态类的优点在于,编译器能够执行检查以确保不致偶使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实例。然地添加实例成员。编译器将保证不会创建此类的实例。静态类是密封的,因此不可被继承。静态类不能包含构造函静态类是密封的,因此不可被继承。静态类不能包含构

17、造函数,但仍可声明静态构造函数以分配初始值或设置某个静态数,但仍可声明静态构造函数以分配初始值或设置某个静态状态状态。使用静态类作为不与特定对象关联的方法的组织单元。此外使用静态类作为不与特定对象关联的方法的组织单元。此外,静态类能够使实现更简单、迅速,因为不必创建对象就能,静态类能够使实现更简单、迅速,因为不必创建对象就能调用其方法。以一种有意义的方式组织类内部的方法(例如调用其方法。以一种有意义的方式组织类内部的方法(例如 System System 命名空间中的命名空间中的 Math Math 类的方法)是很有用的。类的方法)是很有用的。静态类静态类1515static class Co

18、mpanyInfo static class CompanyInfo public static string GetCompanyName()public static string GetCompanyName()return CompanyName;return CompanyName;public static string GetCompanyAddress()public static string GetCompanyAddress()return CompanyAddress;return CompanyAddress;/./.静态类静态类16164.1.2 4.1.2 构造函

19、数构造函数 作用:作用:构造函数是一个特殊的方法,用于在建立对象时构造函数是一个特殊的方法,用于在建立对象时为对象分配存储空间为对象分配存储空间,对数据成员进行初始化。对数据成员进行初始化。好处:好处:确保每一个对象在被使用之前都适当地进行了初始确保每一个对象在被使用之前都适当地进行了初始化的动作。化的动作。构造函数特点:构造函数特点:1)1)每个类至少有一个构造函数。若程序代码中没有构造函每个类至少有一个构造函数。若程序代码中没有构造函数则系统会自动提供一个默认的构造函数。数则系统会自动提供一个默认的构造函数。2)2)一个构造函数总是和它的类名相同。一个构造函数总是和它的类名相同。3)3)构

20、造函数不包含任何返回值。构造函数不包含任何返回值。4)4)构造函数总是构造函数总是publicpublic的。的。一般在构造函数中作初始化工作,对于执行过程用时比较一般在构造函数中作初始化工作,对于执行过程用时比较长的程序代码,最好不要放在构造函数中。长的程序代码,最好不要放在构造函数中。5 5)必须使用操作符)必须使用操作符 new new 来调用一个构造函数来调用一个构造函数17174.1.2 4.1.2 构造函数(续)构造函数(续)1 1、默认构造函数、默认构造函数(1 1)如果在类中不定义构造函数,系统会提供一个默认的构)如果在类中不定义构造函数,系统会提供一个默认的构造函数。造函数。

21、(2 2)默认构造函数没有参数。)默认构造函数没有参数。(3 3)默认构造函数自动将非静态成员初始化为:)默认构造函数自动将非静态成员初始化为:数值型数值型:如如intint、doubledouble等,初始化为等,初始化为0 0。boolbool类型:初始化为类型:初始化为false.false.引用类型:初始化为引用类型:初始化为nullnull。(4 4)如果自己定义了类的构造函数,则所有初始化工作由编)如果自己定义了类的构造函数,则所有初始化工作由编程者自己完成。程者自己完成。18184.1.2 4.1.2 构造函数(续)构造函数(续)2.2.重载构造函数重载构造函数 有时候可能会遇到

22、这样的情况:在一个类中的多个方有时候可能会遇到这样的情况:在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。这时,无参数的构造函数就不能胜任了,解中传递过来。这时,无参数的构造函数就不能胜任了,解决这个问题最好的办法就是:重载(决这个问题最好的办法就是:重载(OverloadingOverloading)构造函)构造函数。数。19194.1.2 4.1.2 构造函数(续)构造函数(续)using System;using System;using System.Collections.Generic;using S

23、ystem.Collections.Generic;using System.Text;using System.Text;namespace OverloadingExamplenamespace OverloadingExample class Program class Program public Program()public Program()Console.WriteLine(null);Console.WriteLine(null);20204.1.2 4.1.2 构造函数(续)构造函数(续)public Program(string str)public Program(st

24、ring str)Console.WriteLine(str);Console.WriteLine(str);static void Main()static void Main()Program aa=new Program();Program aa=new Program();Program bb=new Program(How are you!);Program bb=new Program(How are you!);Console.ReadLine();Console.ReadLine();2121 复制构造函数复制构造函数 某些编程语言的类提供了复制构造函数,即从当前类实例某些编程

25、语言的类提供了复制构造函数,即从当前类实例构造一个新的类实例。在构造一个新的类实例。在C#C#编程语言中,没有提供复制构造函编程语言中,没有提供复制构造函数,如果要实现复制构造的功能,就必须自行编写这样的构造数,如果要实现复制构造的功能,就必须自行编写这样的构造函数。函数。C#C#复制构造函数仍然属于构造函数,不同的是以类本身复制构造函数仍然属于构造函数,不同的是以类本身作为参数的数据类型。作为参数的数据类型。调用复制构造函数时,参数必须是已经创建的类实例。调用复制构造函数时,参数必须是已经创建的类实例。Contact c1=new Contact(lisi);Contact c1=new C

26、ontact(lisi);Contact c2=new Contact(c1);Contact c2=new Contact(c1);4.1.2 4.1.2 构造函数(续)构造函数(续)22224.1.3 4.1.3 字段和局部变量字段和局部变量字段字段:指声明为类一级的对象或值类型的变量。指声明为类一级的对象或值类型的变量。局部变量局部变量:指在方法、事件以及构造函数内声明的变量。指在方法、事件以及构造函数内声明的变量。public class Programpublic class Program public static int j=20;/public static int j=20

27、;/字段字段 public static void Main()public static void Main()int j=30;/int j=30;/局部变量局部变量 Console.WriteLine(j);/Console.WriteLine(j);/输出结果:输出结果:3030 Console.WriteLine(Program.j);/Console.WriteLine(Program.j);/输出结果:输出结果:2020 Console.ReadLine();Console.ReadLine();23234.1.3 4.1.3 字段和局部变量字段和局部变量 当字段和局部变量名相同

28、时,如果要引用静态字段,可当字段和局部变量名相同时,如果要引用静态字段,可以使用下面的形式:以使用下面的形式:类名类名.字段名字段名 如果是实例字段,则使用下面的形式:如果是实例字段,则使用下面的形式:this.this.字段名字段名 这里的这里的thisthis指当前实例。指当前实例。当然,如果没有出现字段和局部变量名重名的情况下,当然,如果没有出现字段和局部变量名重名的情况下,引用字段的形式和引用局部变量的形式相同。引用字段的形式和引用局部变量的形式相同。24244.1.4 4.1.4 静态成员与实例成员静态成员与实例成员类的成员包括字段、属性、构造函数、方法、事件、索引、嵌类的成员包括字

29、段、属性、构造函数、方法、事件、索引、嵌套类。套类。类的成员分静态成员和实例成员类的成员分静态成员和实例成员静态成员在内存中只有一份静态成员在内存中只有一份静态成员要等到应用程序结束时才会退出内存。静态成员要等到应用程序结束时才会退出内存。把只有创建了类的实例才能够使用的成员叫实例成员。把只有创建了类的实例才能够使用的成员叫实例成员。静态成员作用:静态成员作用:1 1、需要在一个类的各个对象间交互,即需要一个数据对象为整、需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务。个类而非某个对象服务。2 2、同时又力求不破坏类的封装性、同时又力求不破坏类的封装性,即要求此成员隐

30、藏在类的内即要求此成员隐藏在类的内部,对外不可见。部,对外不可见。类类的的staticstatic成员具有成员具有如下特征:有独立的存储区,属于整个类如下特征:有独立的存储区,属于整个类。2525注意:注意:1 1、对于静态的数据成员,连接器会保证它拥有一个单一、对于静态的数据成员,连接器会保证它拥有一个单一的外部定义。静态数据成员按定义出现的先后顺序依次初始化的外部定义。静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。消除时的顺序是初始化的反顺序。2 2、类的静

31、态成员函数是属于整个类而非类的对象,所以、类的静态成员函数是属于整个类而非类的对象,所以它没有它没有thisthis指针,这就导致了它仅能访问类的静态数据和静态指针,这就导致了它仅能访问类的静态数据和静态成员函数。成员函数。4.1.4 4.1.4 静态成员与实例成员静态成员与实例成员26264.1.5 4.1.5 访问修饰符访问修饰符C#C#中有以下成员访问修饰符:中有以下成员访问修饰符:Public Public (常用)(常用)任何外部的类都可以不受限制的存取这个类的方法和任何外部的类都可以不受限制的存取这个类的方法和数据成员。数据成员。private private(常用)(常用)类中的

32、所有方法和数据成员只能在此类中使用,外部类中的所有方法和数据成员只能在此类中使用,外部无法存取。无法存取。(默认默认)ProtectedProtected 除了让本身的类可以使用之外,任何继承自此类的子类都可除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。以存取。Internal Internal 在当前项目中都可以存取。该访问权限一般用于基于组件的开在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访问。类的访问修饰符默认为问。类的访问修饰符默认为Inte

33、rnalInternal Protected internalProtected internal 只限于当前项目,或者从该项目的类继承的类才只限于当前项目,或者从该项目的类继承的类才可以存取。可以存取。PartialPartial 局部类型,类的定义和实现可以分布在多个文件中,但都要使局部类型,类的定义和实现可以分布在多个文件中,但都要使用用partialpartial标注,基类只需要声明一次,若多次声明则必须完全一致。标注,基类只需要声明一次,若多次声明则必须完全一致。2727 命名空间隐式地具有命名空间隐式地具有 public public 已声明可访问性。在命名空间声已声明可访问性。在

34、命名空间声明中不允许使用访问修饰符。明中不允许使用访问修饰符。编译单元或命名空间中声明的类型可以具有编译单元或命名空间中声明的类型可以具有 public public 或或 interinternal nal 已声明可访问性,默认的已声明可访问性为已声明可访问性,默认的已声明可访问性为 internalinternal。类成员可具有五种已声明可访问性中的任何一种,默认为类成员可具有五种已声明可访问性中的任何一种,默认为 priprivate vate 已声明可访问性。(请注意,声明为类成员的类型可具已声明可访问性。(请注意,声明为类成员的类型可具有五种已声明可访问性中的任何一种,而声明为命名空

35、间成员有五种已声明可访问性中的任何一种,而声明为命名空间成员的类型只能具有的类型只能具有 public public 或或 internal internal 已声明可访问性。)已声明可访问性。)枚举成员隐式地具有枚举成员隐式地具有 public public 已声明可访问性。在枚举成员声已声明可访问性。在枚举成员声明中不允许使用访问修饰符。明中不允许使用访问修饰符。4.1.5 4.1.5 访问修饰符访问修饰符2828 结构成员可以具有结构成员可以具有 publicpublic、internal internal 或或 private private 已声明可访已声明可访问性并默认为问性并默认

36、为 private private 已声明可访问性,这是因为结构是隐式已声明可访问性,这是因为结构是隐式地密封的。结构的成员若是在此结构中声明的(也就是说,不是地密封的。结构的成员若是在此结构中声明的(也就是说,不是由该结构从它的基类中继承的)不能具有由该结构从它的基类中继承的)不能具有 protected protected 或或 protecprotected internal ted internal 已声明可访问性。(请注意,声明为结构成员的已声明可访问性。(请注意,声明为结构成员的类型可具有类型可具有 publicpublic、internal internal 或或 private

37、 private 已声明可访问性,已声明可访问性,而声明为命名空间成员的类型只能具有而声明为命名空间成员的类型只能具有 public public 或或 internal internal 已已声明可访问性。)声明可访问性。)接口成员隐式地具有接口成员隐式地具有 public public 已声明可访问性。在接口成员声明已声明可访问性。在接口成员声明中不允许使用访问修饰符。中不允许使用访问修饰符。4.1.5 4.1.5 访问修饰符访问修饰符2929局部类型局部类型partialpartial C#2.0C#2.0 引入了局部类型的概念。局部类型允许我们将一个引入了局部类型的概念。局部类型允许我

38、们将一个类、结构或接口分成几个部分,分别实现在几个不同的类、结构或接口分成几个部分,分别实现在几个不同的.cs.cs文件中。文件中。局部类型适用于以下情况:局部类型适用于以下情况:(1)(1)类型特别大,不宜放在一个文件中实现。类型特别大,不宜放在一个文件中实现。(2)(2)一个类型中的一部分代码为自动化工具生成的代码,一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。不宜与我们自己编写的代码混合在一起。(3)(3)需要多人合作编写一个类。需要多人合作编写一个类。局部类型是一个纯语言层的编译处理,不影响任何执行机局部类型是一个纯语言层的编译处理,不影响任何执行机

39、制制事实上事实上C#C#编译器在编译的时候仍会将各个部分的局编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。部类型合并成一个完整的类。30302.2.局部类型的限制局部类型的限制(1)(1)局部类型只适用于类、接口、结构,不支持委托和枚举。局部类型只适用于类、接口、结构,不支持委托和枚举。(2)(2)同一个类型的各个部分必须都有修饰符同一个类型的各个部分必须都有修饰符 partialpartial。(3)(3)使用局部类型时,一个类型的各个部分必须位于相同的命使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。名空间中。(4)(4)一个类型的各个部分必须被同时编译。一个类

40、型的各个部分必须被同时编译。局部类型局部类型partialpartial3131partialpartial3.3.局部类型的注意点局部类型的注意点(1)(1)关键字关键字partialpartial是一个上下文关键字,只有和是一个上下文关键字,只有和 classclass、ststructruct、interface interface 放在一起时才有关键字的含义。因此放在一起时才有关键字的含义。因此parpartialtial的引入不会影响现有代码中名称为的引入不会影响现有代码中名称为partialpartial的变量。的变量。(2)(2)局部类型的各个部分一般是分开放在几个不同的局部类型

41、的各个部分一般是分开放在几个不同的.cs.cs文件文件中,但中,但C#C#编译器允许我们将他们放在同一文件中。编译器允许我们将他们放在同一文件中。32324.2 4.2 结构结构 结构(结构(structstruct)是由一系列相关的、但类型不一定相同的变是由一系列相关的、但类型不一定相同的变量组织在一起而构成的数据表示形式,所有结构类型都隐式量组织在一起而构成的数据表示形式,所有结构类型都隐式地从类型地从类型objectobject继承。继承。通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。例如:例如:public struct Pointpublic struct Point

42、 public int x;public int x;public int y;public int y;public string s;public string s;C#C#中的结构:中的结构:DateTime/TimeSpan/Point/Int32/DoubleDateTime/TimeSpan/Point/Int32/Double等等3333 在结构声明中,除非字段被声明为在结构声明中,除非字段被声明为 const const 或或 staticstatic,否,否则无法初始化。则无法初始化。结构不能声明默认构造函数(没有参数的构造函数)或析结构不能声明默认构造函数(没有参数的构造函

43、数)或析构函数。构函数。结构在赋值时进行复制。结构在赋值时进行复制。将结构赋值给新变量时,将复制将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。本的数据。凡是定义为结构的,都可以用类来定义。凡是定义为结构的,都可以用类来定义。创建轻量级对象时,可以使用结构。创建轻量级对象时,可以使用结构。4.2 4.2 结构结构3434 结构是值类型,而类是引用类型。结构是值类型,而类是引用类型。与类不同,结构的实例化可以不使用与类不同,结构的实例化可以不使用 newnew 运算符。运算符。结构可以声明带参数的构造函数。

44、结构可以声明带参数的构造函数。一个结构不能从另一个结构或类继承,而且不能作为一个类一个结构不能从另一个结构或类继承,而且不能作为一个类的基。的基。结构可以实现接口。结构可以实现接口。结构可用作可以为结构可用作可以为 null null 的类型,因而可向其赋的类型,因而可向其赋 null null 值。值。结构不能包含显式的无参数构造函数。结构不能包含显式的无参数构造函数。ClassClass的构造函数不需要初始化全部字段,的构造函数不需要初始化全部字段,StructStruct的构造函数的构造函数必须初始化所有字段必须初始化所有字段4.2 4.2 结构结构3535结构结构结构结构类类没有默认的

45、(无参数)构造函数,但是可没有默认的(无参数)构造函数,但是可以添加构造函数,结构可以声明构造函数,以添加构造函数,结构可以声明构造函数,但是他们必须是带参数的。但是他们必须是带参数的。有默认的构造函数有默认的构造函数没有析构函数没有析构函数有析构函数有析构函数没有没有abstract和和sealed(因为不能继承)因为不能继承)可以使用可以使用abstract和和sealed不能有不能有protected修饰符,不可以声明修饰符,不可以声明protected,virtual,sealed和和override成员成员可以声明可以声明protected,virtual,sealed,overri

46、de成员成员3636结构结构结构类可以不使用new初始化,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null必须使用new初始化在结构中初始化实例字段是错误的Struct变量使用完之后就自动解除内存分配Class实例有垃圾回收机制来保证内存的回收处理Struct创建的对象复制简单,直接以等号连接即可Class对象复制分为浅复制和深复制,必须经过特别的方法来完成复制3737结构结构使用场合:使用场合:(1 1)实现一个主要用于)实现一个主要用于底层底层存储数据类型的结构时,可以考虑存储数据类型的结构时,可以考虑结构。结构。将用于定义应用程序行为的类型设计为将用于定义应用程

47、序行为的类型设计为Class。(2 2)StructStruct变量占用堆栈的空间,因此适用于数据量相对小的变量占用堆栈的空间,因此适用于数据量相对小的场合,堆栈的空间有限,对于大量的逻辑的对象,创建类要比创场合,堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。建结构好一些。(3 3)结构数组具有更高的效率)结构数组具有更高的效率(4 4)结构表示如点,矩形和颜色这样轻量的对象,例如,如果)结构表示如点,矩形和颜色这样轻量的对象,例如,如果声明一个含有声明一个含有10001000个点的对象数组,则将为引用每个对象分配附个点的对象数组,则将为引用每个对象分配附加的内存,在此情况下

48、,结构的成本较低。加的内存,在此情况下,结构的成本较低。(5 5)在表现抽象和多级别的对象层次时,类是最好的选择在表现抽象和多级别的对象层次时,类是最好的选择38384.3 4.3 方法方法 方法(方法(MethodMethod)是一组程序代码的集合,每个方法都有一个)是一组程序代码的集合,每个方法都有一个方法名,便于识别和让其他方法调用。方法名,便于识别和让其他方法调用。1.1.方法的定义与使用方法的定义与使用 (1 1)方法必须放在某个类中。)方法必须放在某个类中。(2 2)定义方法的语法形式为:)定义方法的语法形式为:访问修饰符访问修饰符 返回值类型返回值类型 方法名称(参数序列)方法名

49、称(参数序列)语句序列语句序列 39394.3 4.3 方法(续)方法(续)定义方法时,需要注意以下几点:定义方法时,需要注意以下几点:方法名不能和变量、常数或者任何声明在类中其它的成员相同。方法名不能和变量、常数或者任何声明在类中其它的成员相同。方法可以有参数,也可以没有参数,但是不论是否有参数,小方法可以有参数,也可以没有参数,但是不论是否有参数,小括号都是必需的。如果参数序列中的参数有多个,则以逗号分括号都是必需的。如果参数序列中的参数有多个,则以逗号分开。开。结束某个方法的执行,可以使用结束某个方法的执行,可以使用returnreturn语句,程序遇到语句,程序遇到returnretu

50、rn语句后,会将执行流程交还给调用此方法的程序代码段。此外,语句后,会将执行流程交还给调用此方法的程序代码段。此外,还可以用还可以用returnreturn语句返回一个值。语句返回一个值。如果声明一个非如果声明一个非voidvoid类型的方法,则方法中必须至少有一个类型的方法,则方法中必须至少有一个rereturnturn语句。语句。40404.3 4.3 方法(续)方法(续)using System;using System;class Programclass Program public int MyMethod()public int MyMethod()Console.WriteLi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(新版第4章-面向对象的编程基础课件.ppt)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|