您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第3章(1) 面向对象的编程基础
第3章面向对象的编程基础3.1面向对象的程序设计在面向对象的概念中,类是封装数据的基本单位。类是一组具有相同数据结构和相同操作的对象的集合,用来定义对象可执行的操作(如方法、事件和属性等)。类的实例是对象,可以通过调用对象的属性、方法和事件,来访问对象的功能。类和对象的区别可以用现实生活中的例子来说明。如果把汽车看成是一个类的话,则生活中的每一辆汽车都是一个对象,也可以说是类的一个实例。第3章面向对象的编程基础3.1面向对象的程序设计3.1.1类的组织与类有关的一些基本概念有:类的声明、对象的生存周期、字段和局部变量、静态成员与实例成员以及访问修饰符等。1、类的声明在C#语言中使用class定义类,声明类的形式为[附加声明][访问修饰符]class类名称[:[基类][,接口序列]]{[字段声明][构造函数][方法][事件]}其中,[]中的内容为可选项,冒号(:)后面表示被继承的类或者接口。第3章面向对象的编程基础3.1面向对象的程序设计3.1.1类的组织1、类的声明当一个类从另一个类继承时,被继承的类叫做基类。注意:在C#语言中,基类只能有一个。但是一个类可以继承自多个接口,当接口序列多于一项时,各项之间用逗号分开。如果既有基类又有接口,则把基类放在冒号后面的第一项,然后才是接口名。[例3-1]声明类、字段、构造函数和方法。usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceStatementExample{publicclassChild{privateintage;privatestringname;//不带参数的构造函数publicChild(){name=none;}//带参数的构造函数publicChild(stringname,intage){this.name=name;this.age=age;}//输出方法publicvoidPrintChild(){Console.WriteLine({0},{1}yearsold.,name,age);}}publicclassProgram{publicstaticvoidMain(){//使用new关键字创建对象,new后是调用的构造函数Childchild1=newChild(ZhangSan,11);Childchild2=newChild(LiSi,10);Childchild3=newChild();//显示结果Console.Write(Child#1:);child1.PrintChild();Console.Write(Child#2:);child2.PrintChild();Console.Write(Child#3:);child3.PrintChild();Console.ReadLine();}}}输出结果:Child#1:ZhangSan,11yearsold.Child#2:LiSi,10yearsold.Child#3:none,0yearsold.第3章面向对象的编程基础3.1面向对象的程序设计3.1.1类的组织2、对象的生存周期对象的生存周期并不是其所在的区域决定的,它包含以下特性。(1)对象在被创建时分配内存,创建对象实际上做了两个方面的工作:使用new保留字要求系统分配内存使用构造函数初始化数据(2)和Java语言相似,C#语言也是采用垃圾回收机制自动销毁对象,即在适当的时候自动启动回收机制,然后检测没有被引用的对象并将其销毁。实际上,销毁对象也是做了两个方面的工作:释放占用的内存;将分配给对象的内存归还给堆(Heap)。第3章面向对象的编程基础3.1面向对象的程序设计3.1.1类的组织3、字段和局部变量为了区分作用域不同的对象或值类型的变量,C#语言对其进行了更细的划分:把类一级的对象或值类型的变量叫做字段变量(又称类变量);把在方法、事件以及构造函数内声明的变量叫做局部变量。声明变量的位置不同,其作用域也不同。[例3-2]定义字段和局部变量。usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDefinitionExample{publicclassProgram{publicstaticintj=20;//定义字段jpublicstaticvoidMain(){intj=30;//定义局部变量jConsole.WriteLine(j);//输出结果:30Console.WriteLine(Program.j);//输出结果:20Console.ReadLine();}}}当字段和局部变量名相同时,如果要引用静态字段,可以使用下面的形式:类名.字段名如果是实例字段,则使用下面的形式:this.字段名这里的this指当前实例如果没有出现字段和局部变量名重名的情况,引用字段的形式和引用局部变量的形式相同。4、静态成员与实例成员在类中定义的数据称为类的数据成员,数据成员包含字段、常量和事件等。而函数成员则提供操作类中数据的某些功能,函数成员包括方法、属性和构造函数等。静态(static)成员:当该类被装入内存时,系统就会在内存中专门开辟一部分区域保存这些静态成员,这样一来,其他类不必建立该类的实例就可以直接使用该类的静态成员。实例成员:只有创建了类的实例才能够使用的成员。需要注意的是,静态成员在内存中只有一份,不像实例成员可以有多个。而且静态成员要等到应用程序结束时才会消失,所以使用时要根据具体情况决定是否使用静态成员。在C#语言中通过指定类名来调用静态成员,通过指定实例名来调用实例成员。5、访问修饰符将数据和方法封装在类中是为了便于对数据和方法进行控制和修改,访问修饰符用于控制类中的数据和方法的访问权限,C#语言中有以下几种成员访问修饰符。•public:指任何外部的类都可以不受限制地存取这个类的方法和数据成员。•private:指类中的所有方法和数据成员只能在此类中使用,外部无法存取。•protected:除了本身的类可以使用之外,任何继承自此类的子类都可以存取。•internal:在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其他代码无法访问。•protectedinternal:只限于当前项目,或者从该项目的类继承的类才可以存取。•partial:局部类型,类的定义和实现可以分布在多个文件中,但都要使用partial标注。注意:基类只需要声明一次,若多次声明则必须完全一致。3.1.2构造函数构造函数是一个特殊的方法,用于在建立对象时进行初始化的动作。C#中每当创建一个对象时,都会先调用类中定义的构造函数。构造函数还具有以下特点。(1)每个类至少有一个构造函数。如果程序代码中没有构造函数,则系统会自动提供一个默认的构造函数。(2)一个构造函数总是和它的类名相同。(3)构造函数不包含任何返回值。(4)构造函数一般使用访问修饰符public,以便在其他函数中可以创建该类的实例。也可以使用访问修饰符private创建私有构造函数。私有构造函数是一种特殊的实例构造函数,通常用在只包含静态成员的类中,用来阻止该类被实例化。注意:如果不对构造函数使用访问修饰符,则在默认情况下它是私有构造函数,但是,一般都显式地使用private修饰符来清楚地表明该类不能被实例化。1、默认构造函数如果在类中不定义构造函数,系统会自动提供一个默认的构造函数,默认构造函数没有参数。提供默认构造函数的目的是为了保证能够在使用对象前先对未初始化的非静态类成员进行初始化工作,即将非静态成员初始化为下面的值。(1)对数值型,如int、double等,初始化为0。(2)对bool类型,初始化为false。(3)对引用类型,初始化为null。如果在程序代码中定义了类的构造函数,则所有初始化工作由编程者自己完成。2、重载构造函数有时候可能会遇到这样的情况:在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。这时,无参数的构造函数就不能胜任了,解决这个问题的最好办法就是:重载(Overloading)构造函数。usingSystem;namespaceOverloadingExample{classProgram{publicProgram(){Console.WriteLine(null);}publicProgram(stringstr){Console.WriteLine(str);}staticvoidMain(){Programaa=newProgram();Programbb=newProgram(Howareyou!);Console.ReadLine();}}}输出结果:nullHowareyou!3.1.3方法方法(Method)是一组程序代码的集合,每个方法都有一个方法名,便于识别和让其他方法调用。1、方法的定义与使用C#程序中定义的方法都必须放在某个类中。定义方法的一般形式为访问修饰符返回值类型方法名称(参数序列){语句序列}在定义方法时,需要注意以下几点。(1)方法名称后面的小括号可以有参数序列,也可以没有参数,但是不论是否有参数,小括号都是必须的。如果参数序列中的参数有多个,则以逗号分隔开。(2)如果要结束某个方法的执行,可以使用return语句。程序遇到return语句后,会将执行流程交还给调用此方法的程序代码段。此外,还可以利用return语句返回一个值,注意,return语句只能返回一个值。(3)如果声明一个void类型的方法,return语句可以省略不写;如果声明一个非void类型的方法,则方法中必须至少有一个return语句。[例3-4]定义和调用方法。usingSystem;namespaceMethodExample{classProgram{publicintMyMethod(){Console.WriteLine(thisisMyMethod.);inti=10;returni;}staticvoidMain(){Programmethod=newProgram();intj=5;j=method.MyMethod();Console.WriteLine(thevalueis{0}.,j);Console.ReadLine();}}}输出结果:thisisMyMethod.thevalueis10.2、方法中的参数传递定义方法时可以将参数传入方法中进行处理,也可以将方法中处理过的信息返回给调用者。说到参数传递,必须先得弄清值类型和引用类型:值类型存放在栈中,直接访问。如果有:inta=0;intb=a;就产生了两个栈中对象。引用类型需要在堆中显式分配,且不能直接访问!!需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象。如果:StringBuilderstrb=newStringBuilder();StringBuilderstrb2=strb;则在堆中只有一个堆中对象,而栈中则有两个栈中对象指向该堆中对象。可以看出:每个变量都是一个栈中对象。不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。参数传递分值传递和引用传递两种:通常,在没有显式指出ref和out时都是值传递。值传递:传的是对象的值拷贝。即函数内参数对象(形参)是调用时传递对象的栈中对象(实参)的拷贝!值传递参数的格式为:参数类型参数名定义值传递参数的方式很简单,只要注明参数类型和参数名即可。当该方法被调用时,便会为每个值传递参数分配一个新的栈内存空间,然后将对应实参值复制到该内存空间。在方法中更改参数的值不会影响到这个方法之外的变量。引用传递:传的是栈中对象的地址。即函数内参数对象(形参)与调用时传递对象(实参)完全是同一栈中对象!引用传递参数的格式为:ref参数类型参数名与值传递参数不同,引用传递参数并没有再分配栈
本文标题:第3章(1) 面向对象的编程基础
链接地址:https://www.777doc.com/doc-3974392 .html