还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第章面向对象编程技术4面向对象的程序设计措施是目前途序设计的大势所趋面向对象的程序设计措施是对构造化程序设计措施的重新认识在程序的设计中,措施总是与特定的数据构造亲密有关的,措施具有对数据构造的访问,特定的措施只合用于特定的数据构造,因此措施与数据构造在编程中应当是一种密不可分区整体,这个整体叫对象c#通过类、对象、继承、多态等机制形成一种完善的面向对象的编程体系类和对象
4.1类是c#程序设计的基本单位类和对象概述现实生活中的类是人们对客观对象不停认识而产生的I抽象日勺概念,而对象则是现实生活中的一种个实体例如,人们在现实生活中接触了大量的汽车、摩托车、自行车等实体,从而产生了交通工具日勺概念,交通工具就是一种类,而现实生活中的详细的汽车、摩托车自行车等则是该类的对象面向对象程序设计的类从本质上和人们现实生活中的这一认识过程是相似的例如在编程实践中,人们常常使用按钮这一控件,每一种详细的J按钮是一种按钮对象,而按钮类则是按钮对象日勺抽象,并且人们把这一抽象用计算机编程语言表达为数据集合与措施集合的统一在类定义外使用点运算符访问“ID”与“Sex”是非法的,而访问“Name”则是合法改J,由于ID与Sex”是private或protected肚J,而“Name”则是public日勺一般,在类定义中,数据组员(字段)被申明为private或protected,从而实现所谓的数据隐藏,以保证不能在类外随意访问类的数据组员;而其他种类的组员则被申明为public,以通过这些组员实现对类的数据组员的访问属性
4.2对私有或保护数据组员常见的访问是读取与设置修改数据值,在类定义外部,这种访问可通过属性组员实现通过属性可以控制对数据的访问方式,甚至设置数据可接受的值域申明属性在类定义中申明属性的格式为访问修饰符类型属性名{}可以将属性申明为读写属性、只读属性或只写属性
1.申明读写属性修改student类定义添加属性申明〃类名为class studentstudent{〃申明字段private stringid;private string name;private bool sex;〃申明属性public stringIDgetreturn id;setid=value;public stringNamegetreturn name;set二namevalue;public boolSexgetreturn sex;setscx=valuc;在属性申明中,get与set叫属性访问器get完毕对数据值的J读取,return用于返回读取时值;set完毕对数据值的设置修改,value是一种关键字,表达要写入数据组员的值属性名应和其要访问的数据组员名有关但不相似,可以采用数据组员名全用小写,而属性名欧I单词首字母大写的J方式,如数据组员名为name,则对应附属性名为Name2,申明只读或只写属性在属性申明中,假如只有get访问器,则该属性为只读属性例如public boolSexgetreturn sex;}只读属性意味着,数据组员的值是不能被修改的在属性申明中假如只有set访问器,则该属性为只写属性只写属性在程序设计中不常使用使用属性属性组员的使用就如同公有数据组员口勺使用同样可认为可写的J属性赋值,可以用可读日勺属性为其他变量赋值以student类为例:student Sl=new student;〃用属性设置修改数据组员值S
1.ID=12345;;SLName+^mSl.Sex=true;〃用属性读取数据组员值为其他变量赋值bool SSex=Sl.Sex;假如属性为只读的,则属性不能出目前赋值运算符的左边在C#程序设计中,窗体与控件日勺属性就是此类组员,其中在属性窗口显示的属性,均为可读写属性,窗体与控件日勺只读属性只能在代码中使用措施
4.3措施是把某些有关的I语句组织在一起,用于处理某一特定问题的语句块措施必须放在类定义中措施同样遵照先申明后使用的规则
4.
3.1申明与调用措施措施的使用分申明与调用两个环节
1.申明措施申明措施最常用的格式访问修饰符返回类型措施名(参数列表){}措施的访问修饰符一般是public,以保证在类定义外部可以调用该措施措施的返回类型用于指定由该措施计算和返回的值的类型,可以是任何值类型或引用类型数据,如,int、string及前面定义日勺student类假如措施不返回一种值,则它的返回类型为voido措施名是一种合法的C#标识符参数列表在一对圆括号中,指定调用该措施时需要使用的参数个数、各个参数的类型,参数之间以逗号分隔参数可以是任何类型的变量假如措施在调用时不需要参数,则不用指定参数,但圆括号不能省实现特定功能的语句块放在一对大括号中,叫措施体,“{”表达措施体的开始,“}”表达措施体的结束假如措施有返回值,则措施体中必须包括一种return语句,以指定返回值,该值可以是变量、常量、体现式,其类型必须和措施的返回类型相似假如措施无返回值,在措施体中可以不包括return语句,或包括一种不指定任何值的I return语句例如下面的措施申明:public int IntMaxint a,int bint c;ifabc=a;elsec=b;return c;该措施的功能是求两个整数中较大的整数,并将该整数返回该措施欧I返回类型是一种整型值,措施,,名称为“IntMax”参数列表中有两个整型变量参数“a”与“b”措施体中有一种return语句,该语句指定日勺返回值是一种整型变量c该措施体中的语句块也可以用条件体现式合并为一句“return aba:b;这时,return指定日勺返回值是一种条件体现式,return语句把该体现式运算欧I成果返回
2.调用措施从措施被调用的位置,可以分为在措施申明的类定义中调用该措施和在措施申明的J类定义外部调用措施在措施申明的类定义中调用该措施的格式为措施名参数列表在措施申明的类定义中调用该措施,实际上是由类定义内部的其他措施组员调用该措施例如在类定义内部调用求较大整数函数class CLASSMAX//其他措施组员public intGetMaxint a,int b〃在类定义内部调用措施return IntMaxa,b;CLASSMAX IntMax〃求较大整数函数public intIntMaxint a,int breturn aba:b;在措施申明的类定义外部调用该措施实际上是通过类申明的对象调用该措施,其格式为:对象名.措施名参数列表]【例4-1创立一种控制台应用程序,并创立一种类,该类仅包括求两个数中较大数的using System;class Classi〃定义一种类class CLASSMAXpublic intIntMaxint a,int breturnaba:b;static void Mainstring[]argsint X=42,Y;Y=100;〃申明一种对象CLASSMAX classmax=new CLASSMAX;〃调用对象措施int C=classmax.IntMaxX,Y;较大的值为”;Console.WriteConsole.WriteLineC;Console.ReadLine;程序运行的成果为较大时值为
104.
3.2参数传递在措施的申明与调用中,常常波及措施参数,在措施申明中使用欧I参数叫形式参数形参,在调用措施中使用的参数叫实际参数实参在调用措施时,参数传递就是将实参传递给形参日勺过程以【例4-1】为例,申明措施时的形参如下public intlntMaxint a,int b{}调用措施时的实参如下classmax.IntMaxX,Y这样就完毕了形参与实参的结合,其传递关系如图4-3所示措施调用classmax.IntMaxX,Y措施申明体,然后再用这个类创立一种个详细的按钮public intIntMaxint a,int b对象可以把类比作一种蓝图,而对象则是根据蓝图所创立的实例,可以把类比作生产模具,而对象则是由这种模具产生的实例(产品)因此人们又把对象叫做类的I实例类是对事物的定义,而对象则是该事物自身在Visual Studio.NET集成环境中的工具箱中的一种个控件,是被图形文字化日勺可视日勺类,而把这些控件添加到窗体设计器中后,窗体设计器中的控件则是对象,即由工具箱中的类创立日勺对象类是一种数据类型,在C#中,类这种数据类型可以分为两种一种是由系统提供的预先定义时,这些类在.NET框架类库中;一种是顾客定义数据类型在创立对象之前必须先定义该对象所属的类然后由类申明对象类本质上是一种数据类型,因此类的使用方法与基本数据类型的使用方法基本相似,实际上,在VisualStudio.NET中像int、float等基本数据类型也是特殊的类那么,用基本数据类型可以申明变量,用类类型也可以申明变量,只不过类类型的I变量叫类的对象或类的实例类定义类定义的格式与构造定义的格式相似,在类定义中需要使用关键字class,其简朴的定义格式为class〈类名〉{类体}“类名”是一种合法的C#标识符,表达数据类型(类类型)名称,“类体”以一对大括图形参与实参4-3措施参数传递按性质可分为按值传递与按引用传递
1.按值传递参数按值的方式传递是指当把实参传递给形参时,是把实参时值复制(拷贝)给形参,实参和形参使用的J是两个不一样内存中时值,因此这种参数传递方式的特点是形参欧I值发生变化时,不会影响实参的值,从而保证了实参数据的安全按值传递如图4-4所示---------,-------------图按值传递示意4-4基本类型的参数在传递时默认为按值传递
2.按引用传递措施只能返回一种值,但实际应用中常常需要措施可以修改或返回多种值,这时只靠return语句显然是无能为力於J假如需要措施返回多种值,使用按引用传递参数的方式可以实现这种效果按引用传递是指实参传递给形参时,不是将实参的值复制给形参,而是将实参的引用传递给形参,实参与形使用的I是一种内存中时值这种参数传递方式的特点是形参时值发生变化时,同步也变化实参的J值按引用传递分基本数据类型与类对象数据类型两种状传况,其传递如图4-5与图4-6所示公.TTZ图类对象按引用传递示意4-6图基本类型按引用传递示意4-5基本类型参数按引用传递时,形参实际上是实参的别名基本类型参数按引用传递时,实参与形参前均须使用关键字refo]【例4-2编写一种控制台应用程序,在程序中添加一种互换两个整型变量值的措施调用该措施将两个整型变量H勺值进行互换并输出互换前后的成果using System;数值互换namespaceclass Classi〃形参、为引用类型public void Swapref inta,ref intb a b{〃数值互换intc=a;二ab;b=c;static void Mainstringf]argsint A=60,B=80;Console.WriteLine互换前A、B的|值{},{1}n,A,B;Classi c=new Class1;〃以引用方式传递实参、c.Swapref A,ref B;A BConsole.WriteLine互换后A、B的值{0},{1}n,A,B;Console.ReadLine;程序运行成果、互换前A的值B60,
80、互换后A的值B80,60由于在Swap措施中,对引用形参a、b的值的修改,就是对实参A、B日勺值的J修改,因此措施Swap成功地完毕了对A、B数据的互换功能,相称于返回了两个值,这在按值传递日勺方式下是无法实现的类对象参数总是按引用传递的,因此类对象参数传递不需要使用ref关键字类对象参数的传递,实际上是将实参对数据的引用复制给了形参,因此形参与实参共同指向同一种内存区域【例4-3】编写一种控制台应用程序,该程序项目名称为“类对象参数”,程序中有两个类定义,一种是创立程序时系统自动创立的J类class1,一种是顾客自定义的I student类在class1类中申明一种措施,该措施以student类对象为参数在classl类中及I Main措施中调用该措施using System;类对象参数namespace〃类名为class studentstudent〃申明字段private stringid;private string name;private bool sex;〃申明属性public stringIDgetreturn id;setid=value;public stringNamegetreturn name;setname=value;public boolSexgetreturn sex;setsex=value;class Classi〃以对象为形参public voidStudentFlstudent STISTI{〃修改形参数据组员时值二;ST
1.ID”56789”张三”;STLName=STl.Sex=true;static void Mainstring[]argsstring SSex;〃申明一种学生类对象studentSl;SI〃为分派内存空间S1=new student;S1二;SLID”12345”李平”;SLName=Sl.Sex=false;=二if Sl.Sex true男”;SSex=else女”;SSex=学生学号:姓名Console.WriteLine+S
1.ID+”+S l.Name+性别:”〃输出对象的值+SSex;SI J〃申明对象以调用措施Classi c=new Class1;c StudentFl//以对象为实参调用措施c.StudentFlSl;SIif Sl.Sex==true二男”;SSexelse二女”;SSex学生学号:姓名:”Console.WriteLine+S
1.ID+”+S l.Name+性别:〃输出对象的值+SSex;S1Console.ReadLine;程序运行成果学生学号姓名李平性别女12345学生学号姓名张三性别男56789成果的第一行为调用措施前对象S1日勺值,成果的第二行为调用措施后对象S1的J值虽然在Main措施中并未对对象S1进行修改,但由于调用措施StudentFl时,将S1传递给了ST1,而类对象参数是按引用传递时,因此在措施StudentFl中对ST1日勺修改,就是对S1的修改,因此,成果日勺第二行,S1的值发生了变化重载措施有时候措施实现欧I功能需要针对多种类型的数据,虽然C#有隐式转换功能,但这种转换在有些状况下会导致运算成果的错误,而有时数据类型无法实现隐式转换甚至主线无法转换例如using System;class Classipublic voidSwapref inta,ref intbint c=a;a=b;b=c;static voidMainstring[]argsint A=60,B-80;Console.WriteLine互换前A、B时值:{0},{l}n,A,B;Classi c=new Class1;〃调用互换值措施c.Swapref A,ref B;Console.WriteLine互换后A、B的值{},{1}U,A,B;Console.ReadLine;上例中的互换措施只能实现两个整型变量的值互换,无法通过隐式或显式转换来实现其他类型变量的值互换例如在上例的主措施中添加如下代码float fA=
5.2f,fB=
6.0f;c.Swapref fA,ref fB;运行程序时,将出现“无法从reffloatJ转换为一efint”的编译错误为了能使同一功能合用于多种类型日勺数据,C#提供了措施重载机制措施重载是申明两个以上的同名措施,实现对不一样数据类型的相似处理措施重载有两点规定1重载的I措施名称必须相似;2重载的措施,其形参个数或类型必须不一样,否则将出现“已经定义了一种具有相号开始和结束,在一对大括号背面可以跟一种分号例如〃类名为class studentstudent{public stringID;public stringName;public boolSex;)()()上例中,定义了一种名为“student(学生)的类,类体中包括学生的学号“ID、姓名“Name”()与性别“Sex”在上例的“类体”中申明的数据都使用“public”修饰,“public”(公共的)表达这些数据可以直接进行访问假如仅从student”类的定义形式看,其与构造类型除了关键字外几乎没有任何差异当然这只是为了阐明问题以便,这种定义方式并不符合面向对象程序设计的原则,由于类中缺乏了对数据的操作“类体”包括类中的所有数据及对数据的操作,面向对象程序设计将数据与对数据的操作作为一种整体,以类的I形式进行定义,这种机制叫“封装”在“类体”中,所有的数据及对数据日勺操作的集合叫类组员,类组员日勺种类诸多,本章似类型参数的措施组员”的编译错误假如要使上例中的互换措施能同步处理整型与浮点型数据,重载日勺措施申明如下public voidSwapref inta,refintb{}public voidSwapref floata,ref floatb{}申明了重载措施后,当调用品有重载的措施时,系统会根据参数的类型或个数寻求最匹配的措施予以调用根据前述的例子,当执行“c.SwaprefA,refB;调用时,系统会调用“public voidSwapref inta,ref intb{}措施,当执行“c.Swapref fA,ref fB;”调用时,系统会调用“publicvoidSwapref floata,ref floatb{}措施,从而实现对不一样的J数据类型进行相似处理【例4-4】创立一种控制台应用程序,在该程序中实现对两个整型、浮点型、双精度型、十进制型与字符型数据比较大小的功能using System;措施重载—比较值欧大小namespace Iclass Classi〃比较值大小勺措施申明Hpublic int Maxint a,int breturnaba:b;public float Maxfloat a,float breturnaba:b;public double Maxdouble a,double breturnaba:b;public decimal Maxdecimal a,decimal breturnaba:b;public char Maxchar a,char breturnaba:b;static voidMainstring[]argsint iA=60,iB=80;float fA=
5.2f,fB=
8.8f;double dA=
6.2,dB=
7.2;decimal mA=
8.2m,mB=
9.8m;char cA-a^cB-b*;Classi c=new Class1;Console.WriteLineniA与iB较大日勺值为{0}n,c.MaxiA,iB;Console.WriteLinenfA与fB较大日勺值为{0}n,c.MaxfA,fB;Console.WriteLineHdA与dB较大於J值为{0}”,c.MaxdA,dB;Console.WriteLineHmA与mB较大口勺值为{0}”,c.MaxmA,mB;Console.WriteLineHcA与cB较大欧J值为{0}”,c.MaxcA,cB;Console.ReadLine;}程序运行成果为:与较大时值为与较大时值为iA iB8fA fB
8.8与较大时值为dA dB
7.2与较大时值为mA mB
9.8与较大时值为cA cBb在上面的程序例题中,由于float类型可以隐式转换为double类型,因此比较float类型时值大小的措施可以省略int类型可以实现隐式转换,但由于int类型既可以隐式转换为double类型,也可以隐式转换为decimal类型,因此,比较int类型值大小的措施不能省略,以免产生调用的二义性构造函数
4.4构造函数是一种特殊的措施组员,构造函数的重要作用是在创立对象申明对象时初始化对象一种类定义必须有至少一种构造函数,假如定义类时,没有申明构造函数,系统会提供一种默认的构造函数,假如申明了构造函数,系统将不再提供构默认造函数假如只有默认构造函数,在创立对象时,系统将不一样类型的数据组员初始化为对应欧I默认值,如,数值类型被初始化为0,字符类型被初始化为空格,字符串类型被初始化为null空值,逻辑bool类型被初始化为false等例如下面的程序using System;〃类名为class studentstudent〃申明字段public stringid;public string name;public bool sex;public int age;class Classistatic voidMainstring[J argschar SSex;student Sl=new student;if Sl.sex==true士男;SSexelse二女;SSex学号姓名Console.WriteLine”+Sl.id+””+S
1.name+性别+SSex+”年龄{0}n,Sl.age;Console.ReadLine;程序运行的成果为学号姓名性别女年龄0这是由于系统将student类欧I数据组员id与name初始化为null,将sex初始为false,将age初始为日勺缘故假如想在创立对象时,将对象日勺数据组员初始为指定时值,则需要专门申明构造函数
4.
4.1申明构造函数申明构造函数与申明一般措施相比,有两个尤其规定,一是构造函数不容许有返回类型包括void类型,二是构造函数的名称必须与类名相似由于一般申明构造函数是为了在创立对象时,对数据组员初始化,因此构造函数往往需要使用形参,例类如参照前面的学生student,创立一种学生类对象时,需要给出学生时学号、姓名、性别及年龄等,因此学生类构造函数可以申明如下public studentstringID,string NAME,bool SEX,int AGEid=ID;name=NAME;sex=SEX;age=AGE;由于申明了上述带参数的构造函数,因此系统不再提供默认构造函数,这样在创立对象时,必须按照申明的构造函数的参数规定给出实际参数,否则将产生编译错误,例如张三”,student S2=new student12345”,”true,21;由上述创立对象的语句可知,new关键字背面实际是对构造函数的调用假如申明构造函数时使用的参数名称与类数据组员名称相似,则构造函数中使用的类数据组员名称需要用关键字this引导,以免系统分不清形参与数据组员而产生二义性将上例中日勺形参名称改为与数据组员同名的构造函数申明如下public studentstringid,stringname,boolsex,int agethis,id=id;this.namc=namc;this.sex=sex;this.age=age;关键字this指所创立的对象,是申明对象时,由系统自动传递给构造函数的对象欧I引用形参实际上在调用类的非静态措施组员时,系统均会自动传递该引用形参,不过最佳的I措施是使形参的I名称与数据组员的I名称有所区别
4.
4.2重载构造函数构造函数与措施同样可以重载,重载构造函数的重要目的是为了给创立对象提供更大的灵活性,以满足创立对象时的不一样需要例如,在创立一种学生student对象时,有时也许需要只初始化姓名,而不初始化其他值,那么可以在前述申明构造函数的基础上再重载一种只初始化姓名日勺构造函数,代码如下public studentstringNAMEname=NAME;由于该构造函数与前述构造函数日勺参数个数不一样,因此是一种合法的构造函数重载有了这个构造函数后,就可以申明只有一种实参的对象,例如李平student S3=new student假如在申明了带参数的I构造函数后,还想保留默认构造函数,则必须显式申明一种默认构造函数,显式申明时默认构造函数实际上是一种不实现任何功能日勺空函数以student类为例,申明默认构造函数如下〃显式申明默认构造函数public student{}【例4-5】根据本节简介内容,在控制台应用程序中创立student类,并申明构造函数及构造函数欧I重载using System;构造函数namespace〃类名为class studentstudent〃申明字段public stringid;public stringname;public charsexx;public boolsex;public int age;〃申明构造函数〃显式申明默认构造函数public student{}public studentstringid,stringname,boolsex,intage//重载初始化学号、姓名、性别与年龄的构造函数this,id=id;this.name=name;this.sex=sex;二this,age age;〃重载只初始化姓名日勺构造函数public studentstringNAMEname=NAME;class Classistatic voidMainstring[]argschar SScx;〃申明无参对象调用默认构造函数仅简介“字段”、“属性”、“措施”与“构造函数”student Sl=new student;“字段”是类定义中的数据,也叫类的变量在上例中定义的“ID”、“Name”与“Sex”等均为类中的字段“属性”用于读取和写入“字段”值,“属性”是字段的自然扩展,对顾客而言,“属性”等同于“字段”自身,对程序员而言,属性是一种读写“字段”的特殊措施“措施”实质上就是函数,用于对字段进行计算和操作,即对类中的数据进行操作,以实现特定日勺功能申明与使用对象定义类之后,可以用定义的I类申明对象,申明对象后可以访问对象组员每一种类对象均具有该类定义中的所有组员,正如每一种整型变量均可以表达同样的数值范围同样
1.申明对象申明对象的格式与申明基本数据类型的格式相似类名对象名;例如〃申明一种学生类对象student S1;S1不过,对象申明后,需用“new”关键字进行初始化,这样才能为对象在内存中分派保留数据日勺空间初始化的格式对象名=new类名();if Sl.sex==true男;SSex=else二女;SSexConsole.WriteLine(学号+SLid+,姓名n+Sl.name+”,性别+SSex+”,年龄{0}n,Sl.age);〃申明带学号、姓名、性别及年龄初始值的对象(调用四参数构造函数)student S2=new张三)student12345,”:true,21;()if S
2.sex==true男;SSex=else二女;SSexConsole.WriteLine(学号+S
2.id+”,姓名H+S
2.name+“,性别+SSex+”,年龄{0}H,S
2.age);〃申明带姓名初始值的对象(调用一参数构造函数)(李平)student S3=new student()if S
3.sex=true男SSex=else二女;SSex学号,姓名Console.WriteLine+S
3.id+”+S
3.name,性别,年龄+“+SSex+”{0}”,S
3.age;Console.ReadLine;程序运行成果学号,姓名,性别女,年龄0学号姓名:张三,性别男,年龄12345,21学号,姓名李平,性别女,年龄0由于构造函数的重载,程序中可以用不一样的初始化方式申明对象,为创立对象提供了灵活性静态组员
4.5类可以具有静态组员,例如静态字段、静态措施等
4.
5.1静态数据组员与措施组员静态组员与非静态组员的不一样在于,静态组员属于类,而非静态组员则总是与特定的实例(对象)相联络申明静态组员需要使用static修饰符
1.静态数据组员()非静态的字段(数据)总是属于某个特定的对象,其值总是表达某个对象的值例如,当说到学号ID时,总是指某个学生的学号,而不也许是全体学生的学号,对应时,在前面定义的student类的id组员就是一种非静态的数据组员有时也许会需要类中有一种数据组员来表达全体对象的共同特性,例如在student类用一种数据组员来记录学生的人数,那么这个数据组员表达时就不是某个学生对象的特性,而是全体学生对象的特性,这时就需要使用静态数据组员例如〃类名为class studentstudent(〃申明静态数据组员public staticint studentnumber;public stringid;public stringname;public charsexx;public boolsex;public intage;)静态数据组员studentnumber不属于任何一种特定的J对象,而是属于类,或者说属于全体对象,是被全体对象共享的数据
2.静态措施非静态的措施包括非静态欧I构造函数总是对某个对象进行数据操作,例如,比较值的大小措施,总是某个对象的比较值大小日勺措施,对应时,在前述的例子中类Classi中Max措施组员就是一种非静态的措施组员假如某个措施使用时并不需要与详细的对象相联络,例如措施操作的数据并不是某个详细对象的数据而是表达全体对象特性的数据,甚至措施操作的数据与对象数据主线无关,这时可以将该措施申明为静态措施例如要操作前述student类例子中的静态数据组员studentnumber,则应当申明一种静态措施静态措施同样使用修饰符static申明,静态措施属于类,只能使用类调用,不能使用对象调用【例4-61创立一种控制台应用程序,在该程序中定义一种学生类,该类除包括非静态组员外,还包括一种静态数据组员用以记录学生人数(对象个数),一种静态措施用以返回学生人数using System;静态组员namespace〃类名为class studentstudent〃申明字段〃申明静态数据组员public staticint studentnumber;public stringid;public stringname;public charsexx;public boolsex;publicintage;〃申明构造函数public studentstringid,stringname,boolsex,intage〃每创立一种对象,静态数据组员增studentnumber++;1this,id=id;this.namc=namc;this.sex=sex;二this.age age;〃申明静态措施public staticint GetNumber{return studentnumber;class ClassistaticvoidMainstring[]argscharSSex;”张三〃申明对象student Sl=new student12345,,true,21;SIif Sl.sex==true男;SSex=else二女;SSexConsole.WriteLine学号+Sl.id+”,姓名H+Sl.name,性别,年龄+”+SSex+”{0}”,SLage;李四〃申明对象student S2=new student”23456J\false,20;S2if S
2.sex==true二男;SSexelse二女;SSexConsole.WriteLine学号M+S
2.id+n,姓名n+S
2.name+”,性别+SSex+”,年龄{0}n,S
2.age;王五”,注,〃申明对象student S3=new$1111111”34567,“1119;S3if S
3.sex==true男;SSex=else二女;SSexConsole.WriteLine“学号+S
3.id+”,姓名H+S
3.name+”,性别”+SSex+”,年龄{0}n,S
3.age;学生人数为//调用静态措施Console.WriteLine{0}”,student.GetNumber;Console.RcadLinc;程序运行成果:学号12345,姓名张三,性别:男,年龄:21学号23456,姓名李四,性别:女,年龄:20学号34567,姓名王五,性别:男,年龄:19学生人数为3该程序在构造函数被调用时,使静态数据组员studentnumber自动增1,从而起到自动记录学生人数的作用,程序中日勺静态措施在调用时,是由类student直接调用时,假如用对象调用则是非法时静态措施与非静态措施同样可以重载【例4-7】修改【例4-4】,将比较值大小的措施重载申明为静态措施并在Main措施中调用这些措施using System;静态措施重载namespaceclass Classi〃比较值大小日勺重载静态措施申明public staticintMaxinta,int breturnaba:b;public staticfloatMaxfloata,float breturnaba:b;public staticdoubleMaxdoublea,double breturnaba:b;public staticdecimalMaxdecimala,decimal b{returnaba:b;public staticcharMaxchara,char breturnaba:b;staticvoidMainstringf]argsint iA=60,iB=80;float fA=
5.2f,fB=
8.8f;double dA=
6.2,dB=
7.2;decimal mA=
8.2m,mB=
9.8m;char cA-a^cB-b*;〃调用重载静态措施Console.WriteLineHiA与iB较大日勺值为{0}n,MaxiA,iB;Console.WriteLineHfA与fB较大日勺值为{0}”,MaxfA,fB;Console.WriteLinendA与dB较大欧J值为{0}”,MaxdA,dB;Console.WriteLineHmA与mB较大H勺值为{0}”,MaxmA,mB;Console.WriteLineucA与cB较大於J值为{}n,MaxcA,cB;Console.RcadLinc;例如:〃为分派内存空间Sl=new student;S1可以将申明与初始化对象合二为一,例如〃申明对象并初始化student Sl=new student;
2.访问对象访问对象实质是访问对象组员,对对象变量组员的访问与构造变量相似,使用运算符例如S
1.ID=U12345;张三”;SLName=Sl.Sex=true;上面的代码为对象S1数据组员赋值可以使用对象变量为另一对象变量整体赋值,例如,“student S2;S2=S1;或a studentS2=SI;这时,不需要使用new关键字对“S2”初始化可以使用对象中的某一组员例如//将对象日勺组员值赋给字符串变量string sName=Sl.Name;S1Name sName
4.
1.4值类型与引用类型类定义的类型与构造定义日勺类型虽然相似,但这两种类型却有很大的差异,这波及到C#程序运行成果同【例4-4】在Classi类定义中,比较值大小的措施并不是对类的数据组员进行操作,因此申明为静态措施更便于使用由于静态措施的申明与调用均在Classi类定义中,因此对静态措施的调用不需要使用类名引导
4.
5.2C#中的实用静态措施在C#日勺Windows应用程序设计中,常常需要处理多种类型日勺数据,例如在程序运行时对文本框中输入的数值进行数学计算,但问题是,文本框中输入的数据是文本框的text属性,该属性是字符串类型,而字符串类型无法隐式或显式转换为数值型数据,因而也无法对其实现数学计算在C#时System命名空间中,有一种Convert(转换)类,该类提供了由字符串类型转换为对应其他基本数据类型的一系列静态措施,当然在由字符串类型转换为对应的基本数据类型时,字符串的字符序列必须符合对应数据类型的规定类型转换措施最常用的调用格式之一是Convert.静态措施名(字符串类型数据)下面简介其中几种类型转换措施
1.Convert.Tol nt32措施该措施可以将字符串类型转换为int类型转换时,字符串必须符合整型数值的规定例如:intA=Convert.ToInt32(H123u);〃符合规定二()〃不符合规定,具有小数点,将引起转换异常intB Convert.Tolnt32“
123.6intC=Convert.ToInt32(1,H)〃不符合规定,超过int型日勺表达数值范围类型将字符串转换为整数类型的措施尚有Tolntl6措施,将字符串转换为short(短整型);Tolnt64措施,将字符串转换为long(长整型)类型;ToUInt32措施,将字符串转换为uint(无符号整型)类型等等
2.Convert.ToSingle措施该措施可以将字符串类型转换为float(单精度浮点型)类型例如floatA=Convert.ToSingle(n
123.5);能将字符串类型转换为小数类型的措施尚有ToDouble措施,将字符串转换为double(双精度浮点型)类型;ToDecimal措施,将字符串转换为decimal(十进制型)类型
3.Convert.ToChar措施该措施将字符串转换为char(字符)类型例如();〃将字符串常量转换为字符类型char cD=Convert.ToChar a”a”对应的,其他类型的数据也可以使用ToString措施被转换为字符串类型,例如()将整型常量转换为字符串string sA=Convert.ToString1234;更简便的措施是直接在变量名后使用.ToStringO措施,例如:int A=1234;//将整型变量的值读取出来后转换为字符串string sA=A.ToString;需要注意的I是这个ToString措施与Convert.ToString措施的I不一样不仅在调用格式上,还在于这个ToString措施是在类object中申明的J虚措施有关虚措施将在《第5章》中简介,它可以将所有类型的数据转换为字符串类型
4.ToBooIean该措施可以将字符串转换为bool布尔型类型使用ToBoolean措施时,字符串必须是true或false,例如string sA=ntrueH;bool bA=Convert.ToBooleansA;掌握多种数据类型之间的转换措施,才能在C#程序设计中获得一定的自由,不过要获得更大的自由还要学会在程序设计中进行异常处理,有关异常处理的内容将中《第13章异常处理与跟踪调试》中简介【例4-8】创立一种简朴的Windows应用程序,该程序完毕在文本框中输入两个数值,单击对应的的按钮,输出两个数的和、差、积、商的运算,并在第三个文本框中输出计算成果,并通过标签对计算成果目勺性质作必要的阐明习题
4.6中变量存储方式的问题从变量的存储方式看,C#中的变量可以分为值类型变量与引用类型变量
1.值类型值类型变量直接包括其自身的数据,因此每个值类型变量自身就包具有赋给它的值在C#中,内置数据类型除了字符串string类型与对象object类型外其他均为值类型枚举类型与构,造类型也是值类型例如“intX=42;整型变量X就是值类型2,引用类型与值类型不一样,引用类型变量不包括自身的数据,只是存储对数据日勺引用,数据保留在内存区J其他位置例如using System;class ClassiclassTestpublic intA;staticvoidMainstring[]argsint X=42,Y=X;Test Tl=new Test;T1,A=42;Test T2=T1;Y=100;T
2.A=100;引用类型与值类型在内存中日勺存储形式如图4-1所示值类型变量可以使用变量来赋值,引用类型变量也可以使用变量来赋值例如上例中口勺代码int X=42,Y=X;Test Tl=new Test;T
1.A=42;〃使用对象变量赋值Test T2=T1;不过,值类型与引用类型用变量赋值口勺性质却不一样,如图4-2所示int X=42;int Y=X;4242TLA=42;42时引用--------------------------------------►42Test T2=T1;时引用|42图值类型与引用类型用变量赋值4-2;从图中可以看到,用变量X”为变量“Y”赋值,是将“X”所在内存中的值复制给了“Y”而用变量“T1”为,“T2”赋值,则是将“T1”对数据的I引用复制给了“T2”即两个对象变量使用的是同一内存中的数据,也就是说,用“T1”为“T2”赋值不需要使用new关键字对对象初始化,也就没有为对象“T2”分派存储数据的内存空间这样,在变化变量值时,将发生本质差异例如上例中的代码时值为的值仍是Y=100;//Y100,X I42//不仅时值为时值也为T
2.A=100;T2100,T1100访问控制在上面类定义的例子中,申明类的数据组员(字段)时,均使用public进行修饰,public叫访问修饰符申明类中的组员时,使用不一样欧I访问修饰符,表达对类组员时访问权限不一样,或者说访问修饰符确定了在什么范围可以访问类组员C#中最常用的访问修饰符及其意义,如表4-1所示表访问修饰符4-1访问修饰符意义public(公有)访问不受限制,可以被任何其他类访问private(私有)访问只限于含该组员的类,即只有该类的其他组员能访问protected(保护)访问只限于含该组员的类、及该类的1派生类在类定义中,假如申明组员没有使用任何访问修饰符,则该组员被认为是私有private日勺假如不波及继承,private与protected没有什么区别在类定义中,假如组员被申明为private或protected,则不容许在类定义外使用点运算符访问,即在类定义外,点运算符只能访问public组员例如在下面的I类定义中〃类名为class studentstudent〃私有private stringID;〃公有public stringName;〃保护protected boolSex;student Sl=new student;〃非法,为S
1.ID=12345;ID private二张三;//合法,为SI.Name Namepublic〃非法,为Sl.Sex=true;Sex protected。
个人认证
优秀文档
获得点赞 0