1第4章面向对象的编程基础4.1类4.2结构4.3方法4.4属性与索引器24.1类类与对象类:一组具有相同数据结构和相同操作的对象的集合。例如:汽车对象(实例):类的实例化。例如:卡车注意:要使用对象,必须先定义类,然后再创建对象。对象的生存周期对象在建立时分配了内存,创建对象实际上作了两个方面的工作:(1)使用new保留字要求系统分配内存;(2)使用构造函数初始化数据。销毁对象也是做了两个方面的工作:(1)释放占用的内存;(2)将分配给对象的内存归还给堆(Heap)。34.1类的组织1.类的声明用class定义类,声明类的形式为:[附加声明][访问修饰符]class类名称[:[基类][,接口序列]]{[字段声明][构造函数][方法][事件]}注意:[]中的内容可省或任选其一,当两者都有时,先基类后接口44.1类的组织(续)publicclassChild{privateintage;privatestringname;//不带参数的构造函数publicChild(){name=none;}//带参数的构造函数publicChild(stringname,intage){如果不指明,则默认为private54.1类的组织(续)this.name=name;this.age=age;}//输出方法publicvoidPrintChild(){Console.WriteLine({0},{1}yearsold.,name,age);}}publicclassProgram{64.1类的组织(续)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();74.1类的组织(续)Console.ReadLine();}}}输出结果:Child#1:ZhangSan,11yearsold.Child#2:LiSi,10yearsold.Child#3:none,0yearsold.84.1.2构造函数作用:构造函数是一个特殊的方法,用于在建立对象时进行初始化的动作。好处:确保每一个对象在被使用之前都适当地进行了初始化的动作。构造函数特点:1)每个类至少有一个构造函数。若程序代码中没有构造函数则系统会自动提供一个默认的构造函数。2)一个构造函数总是和它的类名相同。3)构造函数不包含任何返回值。4)构造函数总是public的。一般在构造函数中作初始化工作,对于执行过程用时比较长的程序代码,最好不要放在构造函数中。94.1.2构造函数(续)1、默认构造函数(1)如果在类中不定义构造函数,系统会提供一个默认的构造函数。(2)默认构造函数没有参数。(3)默认构造函数自动将非静态成员初始化为:数值型:如int、double等,初始化为0。bool类型:初始化为false.引用类型:初始化为null。(4)如果自己定义了类的构造函数,则所有初始化工作由编程者自己完成。104.1.2构造函数(续)2.重载构造函数有时候可能会遇到这样的情况:在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。这时,无参数的构造函数就不能胜任了,解决这个问题最好的办法就是:重载(Overloading)构造函数。114.1.2构造函数(续)usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceOverloadingExample{classProgram{publicProgram(){Console.WriteLine(null);}124.1.2构造函数(续)publicProgram(stringstr){Console.WriteLine(str);}staticvoidMain(){Programaa=newProgram();Programbb=newProgram(Howareyou!);Console.ReadLine();}}}134.1.3字段和局部变量字段:指声明为类一级的对象或值类型的变量。局部变量:指在方法、事件以及构造函数内声明的变量。publicclassProgram{publicstaticintj=20;//字段publicstaticvoidMain(){intj=30;//局部变量Console.WriteLine(j);//输出结果:30Console.WriteLine(Program.j);//输出结果:20Console.ReadLine();}}144.1.3字段和局部变量当字段和局部变量名相同时,如果要引用静态字段,可以使用下面的形式:类名.字段名如果是实例字段,则使用下面的形式:this.字段名这里的this指当前实例。当然,如果没有出现字段和局部变量名重名的情况,引用字段的形式和引用局部变量的形式相同。154.1.4静态成员与实例成员类的成员包括字段、属性、构造函数、方法、事件、索引、嵌套类。类的成员分静态成员和实例成员静态成员在内存中只有一份静态成员要等到应用程序结束时才会退出内存。把只有创建了类的实例才能够使用的成员叫实例成员。164.1.5访问修饰符C#中有以下成员访问修饰符:Public(常用)任何外部的类都可以不受限制的存取这个类的方法和数据成员。private(常用)类中的所有方法和数据成员只能在此类中使用,外部无法存取。(默认)Protected除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。Internal在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访问。Protectedinternal只限于当前项目,或者从该项目的类继承的类才可以存取。Partial局部类型,类的定义和实现可以分布在多个文件中,但都要使用partial标注,基类只需要声明一次,若多次声明则必须完全一致。174.2结构结构(struct)是由一系列相关的、但类型不一定相同的变量组织在一起而构成的数据表示形式,所有结构类型都隐式地从类型object继承。例如:publicstructPoint{publicintx;publicinty;}结构和类的区别与联系:结构类型是值类型,类类型是引用类型。凡是定义为结构的,都可以用类来定义。创建轻量级对象时,可以使用结构。184.3方法方法(Method)是一组程序代码的集合,每个方法都有一个方法名,便于识别和让其他方法调用。1.方法的定义与使用(1)方法必须放在某个类中。(2)定义方法的语法形式为:访问修饰符返回值类型方法名称(参数序列){语句序列}194.3方法(续)定义方法时,需要注意以下几点:方法名不能和变量、常数或者任何声明在类中其它的成员相同。方法可以有参数,也可以没有参数,但是不论是否有参数,小括号都是必需的。如果参数序列中的参数有多个,则以逗号分开。结束某个方法的执行,可以使用return语句,程序遇到return语句后,会将执行流程交还给调用此方法的程序代码段。此外,还可以用return语句返回一个值。如果声明一个非void类型的方法,则方法中必须至少有一个return语句。204.3方法(续)usingSystem;classProgram{publicintMyMethod(){Console.WriteLine(thisisMyMethod.);inti=10;returni;}staticvoidMain(){Programmethod=newProgram();intj=5;j=method.MyMethod();Console.WriteLine(thevalueis{0}.,j);}}214.3方法2.方法中的参数传递1)传递值类型的参数值类型参数的格式为:参数类型参数名classProgram{publicstaticvoidAddOne(inta){a++;}staticvoidMain(){inta=3;Console.WriteLine(调用AddOne之前,a={0},a);AddOne(a);Console.WriteLine(调用AddOne之后,a={0},a);Console.ReadLine();}}224.3方法(续)2)传递引用类型的参数引用类型参数的格式为:ref参数类型参数classProgram{publicstaticvoidAddOne(refinta){a++;}staticvoidMain(){inta=3;Console.WriteLine(调用AddOne之前,a={0},a);AddOne(refa);Console.WriteLine(调用AddOne之后,a={0},a);Console.ReadLine();}}234.3方法(续)3)输出多个引用类型的参数输出引用类型参数的格式为:out参数类型参数名classProgram{publicstaticvoidMyMethod(outinta,outintb){a=5;b=6;}staticvoidMain(){intx,y;MyMethod(outx,outy);Console.WriteLine(调用MyMethod之后,x={0},y={1},x,y);Console.ReadLine();}}244.3方法(续)4)传递个数不确定的参数需要传递的参数个数不确定时,可以采用params关键字,其后一般跟一个数组。classProgram{publicstaticfloatAverage(paramslong[]v){longtotal,i;for(i=0,total=0;iv.Length;++i)total+=v[i];return(float)total/v.Length;}254.3方法(续)staticvoidMain(){floatx=Average(1,2,3,5);Console.WriteLine(1、2、3、5的平均值为{0},x);x=Average(4,5,6,7,8);Console.WriteLine(4、5、6、7、8的平均值为{0},x);Console.ReadLine();}}264.3方法(续)3.方法重载方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。usingSystem;classProgram{publicstaticintAdd(inti,intj){returni+j;}publicstaticstringAdd(strings1,strings2){returns1+s2;}publicstaticlongAdd(longx){returnx+5;}274.3方法(续)staticvoidMain(){Console.WriteLine(Add(1,2));Console.WriteLine(Add(1,2));Console.WriteLine(Add(10));//按回车键结束Console.ReadLine();}}284.4属性与索引器属性的作用:可以限制外部对类中成员变量的存取权限。1.属性的声明和定义get:用来读取数据成员的值。set:用来设置数据成员的值。publicclassMyClass{privateintnumber=0;publicintMyNumber{get{returnnumber;}set{