第6章面向对象程序设计_第1页
第6章面向对象程序设计_第2页
第6章面向对象程序设计_第3页
第6章面向对象程序设计_第4页
第6章面向对象程序设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

计算机应用与基础(2)C#程序设计

C#ProgrammingLanguage梅松青:2017-2广州医科大学信息技术教研室

面向对象程序设计第

章6.4方法6.5属性6.8常用基础类[类的修饰符]class

类名{

//类的成员;}1、类的声明例如,以下声明了一个Person类:

publicclassPerson

{ publicintpno; //编号

publicstringpname; //姓名

publicvoidsetdata(intno,stringname) {

pno=no;pname=name; } publicvoiddispdata() {

Console.WriteLine("{0}{1}",pno,pname); }

}1、类的声明你希望别人知道你的年龄、身高、体重等私人信息吗?例如,以下声明了一个Person类:

publicclassPerson

{ privateintpno; //编号

privatestringpname; //姓名

publicvoidsetdata(intno,stringname) {

pno=no;pname=name; } publicvoiddispdata() {

Console.WriteLine("{0}{1}",pno,pname); }

}1、类的声明以上两步也可以合并成一步。其语法格式如下:类名对象名=new类名();例如:Personp=newPerson();两个对象引用可以引用同一个对象,例如:Personp1=newPerson();Personp2=p1;2、定义类的对象访问对象字段的语法格式如下:

对象名.字段名其中,“.”是一个运算符,该运算符的功能是表示对象的成员。例如,前面定义的p对象的成员变量表示为:

p.pno,p.pname3、访问对象的字段调用对象的方法的语法格式如下:对象名.方法名(参数表)例如,调用前面定义的p对象的成员方法setdata为:

p.setdata(101,"Mary");3、调用对象的方法构造函数是在用类创建对象时执行的方法。构造函数是一个特殊的方法。构造函数具有如下性质:构造函数的名称与类的名称相同。构造函数总是public的。构造函数尽管是一个函数,但没有任何类型,即它既不属于返回值函数也不属于void函数。4、构造函数(constructor)调用带参数的构造函数假设一个类中包含有带参数的构造函数,调用这种带参数的构造函数的语法如下:类名对象名=new类名(参数表);4、构造函数(constructor)【例】设计一个控制台应用程序,说明调用构造函数的过程。完善point类,定义构造函数publicclassTPoint1 //声明类TPoint1{ intx,y;

//类的私有变量

publicTPoint1(){}

//默认的构造函数

publicTPoint1(intx1,inty1) //带参数的构造函数

{x=x1;y=y1;} publicvoiddispoint() {Console.WriteLine("({0},{1})",x,y);}}

析构函数的名称是“~”加上类的名称(中间没有空格)。与构造函数一样,析构函数也没有返回类型。不能具有可访问性修饰符,也不能被显式地调用。垃圾回收期间会自动调用所涉及实例的析构函数。5、析构函数(destructor)【例】设计一个控制台应用程序,说明调用析构函数的过程。publicclassTPoint2//声明类TPoint2{ intx,y; publicTPoint2(intx1,inty1) //带参数的构造函数

{x=x1;y=y1;}

~TPoint2() {Console.WriteLine("点=>({0},{1})",x,y);}}程序输出什么?staticvoidMain(string[]args){ TPoint2p1=newTPoint2(2,6);TPoint2p2=newTPoint2(8,3);}6.4方法

方法是一种用于实现可以由对象或类执行的计算或操作的成员。方法包含一系列的代码块。从本质上来讲,方法就是和类相关联的动作,是类的外部界面。用户可以通过外部界面来操作类的私有字段。1、什么是方法定义方法的基本格式如下:

修饰符返回类型方法名([参数列表]){ //方法体:方法的具体实现;}2、方法的定义如省略修饰符,默认为private。如不需要返回值,则返回类型必须为void。声明方法时的参数,称为形式参数,简称“形参”调用方法时的参数,称为实际参数,简称“实参”定义方法的基本格式如下:

修饰符返回类型方法名([参数列表])

{ //方法体:方法的具体实现;}2、方法的定义在声明方法的类中,方法的“方法头”(也称为方法签名)必须是惟一的,否则会出现错误。方法的“方法头”由它的名称、参数的数目、每个参数的修饰符和类型组成。返回类型不是方法签名的组成部分。

方法可以向调用方返回某一个特定的值。如果返回类型不是void,则该方法可以用return关键字来返回值,return还可以用来停止方法的执行。3、方法的返回值 publicintaddnum(intnum1,intnum2) {num=num1+num2;

returnnum; }3、方法的返回值方法中的参数是保证不同的方法间互动的重要桥梁,方便用户对数据的操作。C#中方法的参数有3种类型。1.值参数2.引用型参数3.输出参数4、方法的参数在调用一个有参数的方法时,首先进行“形实结合”,实现调用程序和被调用的方法之间的数据传递。(1)

值参数不含任何修饰符,当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改内存中实参的值,所以使用值参数时可以保证实际值的安全性。4、方法的参数“传值”:默认方式(1)

值参数在调用方法时,如果形参的类型是值参数的话,调用的实参的表达式必须保证是正确的值表达式。例前面MyClass3类中addnum方法中的参数就是值参数。4、方法的参数a=addnum(intm,5)(1)

值参数例题6-18交换两个数的值4、方法的参数(2)

引用型参数

以ref修饰符声明的参数属引用型参数。引用型参数本身并不创建新的存储空间,而是将实参的存储地址传递给形参,即形参和实参共用同一内存块。所以对形参的修改会影响原来实参的值。在调用方法前,引用型实参必须被初始化,同时在调用方法时,对应引用型参数的实参也必须使用ref修饰。4、方法的参数“传址”publicclassMyClass4{ intnum=0; publicvoidaddnum(intnum1,refintnum2) {num2=num+num1;}}classProgram{ staticvoidMain(string[]args) {intx=10; MyClass4s=newMyClass4(); s.addnum(5,refx); Console.WriteLine(x);

//输出:? }}4、方法的参数

例:(2)

引用参数例题6-19交换两个数的值4、方法的参数(3)输出参数以out修饰符声明的参数属输出参数。与引用型参数类似,输出型参数也不开辟新的内存区域。与引用型参数的差别:调用方法前无需对变量进行初始化。输出型参数用于传递方法返回的数据,out修饰符后应跟随与形参的类型相同的类型,用来声明在方法返回后传递的变量经过了初始化。4、方法的参数out参数(输出型参数)publicclassMyClass5{intnum=10;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;}}classProgram{staticvoidMain(string[]args){ intx=20;MyClass5s=newMyClass5();s.addnum(5,outx);Console.WriteLine(x);

//输出:?}}4、方法的参数

例:虽然ref和out都提供了修改参数值的方法,但两者之间还是有一些小的区别。主要的区别有:(1)ref在作为参数调用函数之前,变量一定要赋值,否则会得到一个常规编译错误:使用了未赋值的变量。(2)在被调用函数内,以ref引入的参数在返回前不必为它赋值。(3)out在作为参数调用函数之前,变量可以不被赋值。(4)在被调用函数内,以out引入的参数在返回前一定要至少赋值一次。4、方法的参数ref参数与out参数的区别从本质上讲,ref更适合理解为给被调用函数传递了一个与原参考相同内存地址的变量。而out则可以理解为在调用函数前,先给变量找个地方(内存区域),让被调用函数给指定的内存区域放置一个值。4、方法的参数ref参数与out参数的区别方法重载是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中。调用时可用同一方法名,但是使用不同的数据类型参数或者次序不一致的参数。只要一个类中有两个以上的同名方法,且使用的参数类型或者个数不同,编译器就可以判断在哪种情况下调用哪种方法了。5、方法的重载为此,C#中引入了成员签名的概念。成员签名包含成员的名称和参数列表,每个成员签名在类型中必须是唯一的,只要成员的参数列表不同,成员的名称可以相同。如果同一个类有两个或多个这样的成员(方法、属性、构造函数等),它们具有相同的名称和不同的参数列表,则称该同类成员进行了重载,但它们的成员签名是不同的。5、方法的重载classProgram{publicstaticintAdd(inti,intj)//重载方法1{returni+j;}publicstaticstringAdd(strings1,strings2)

//重载方法2{returns1+s2;}publicstaticdouble

Add(doublex,doubley)//重载方法3{returnx+y;}staticvoidMain(){Console.WriteLine(Add(1,2));Console.WriteLine(Add("1","2"));Console.WriteLine(Add(5.4,105.33));}}5、方法的重载6、静态成员有些特性,操作是属于整个类共同所有的,在定义类的时候可以定义为静态成员。静态成员需要使用static关键字来声明。static方法说明GetLength

非静态方法。获取一个32位整数,该整数表示Array的指定维中的元素数。Max非静态方法。获取最大值。Min非静态方法。获取最小值。Average非静态方法。获取平均值。Resize静态方法。将数组的大小更改为指定的新大小。Reverse静态方法。反转一维Array或部分Array中元素的顺序。Sort静态方法。对一维Array对象中的元素进行排序。Array类常用方法Array类常用方法6、静态成员静态字段是类中所有对象共享的成员,而不是某个对象的成员,即静态字段的存储空间不是放在每个对象中,而是和方法一样放在类公共区中。对静态字段的操作和一般字段一样,定义为私有的静态字段不能被外界访问。(1)静态字段static6静态成员静态字段的使用方法如下:(1)静态字段的定义与一般字段相似,但前面要加上static关键词。默认都是非静态的。(2)在访问静态字段时采用如下格式:类名.静态字段名(1)静态字段static6、静态成员当一个字段声明中含有static修饰符时,由该声明引入的字段为静态字段(staticfield)。它只标识了一个存储位置。不管创建了多少个类的实例(即对象),静态字段都只会有一个副本。即静态字段为类的所有实例所共享。当一个字段声明中不含有static修饰符时,由该声明引入的字段为实例字段(instancefield)。类的每个实例(对象)都包含了该类的所有实例字段的一个单独副本。(1)静态字段static静态方法与静态字段类似,也是从属于类,都是类的静态成员。只要类存在,静态方法就可以使用。静态方法只能通过类来访问,而实例方法则要通过类的实例访问。静态方法的定义是在一般方法定义前加上static关键字。调用静态方法的格式如下:类名.静态方法名(参数表);(2)静态方法类名.静态方法名(参数表);注意:静态方法只能访问静态字段、其他静态方法和类以外的函数及数据,不能访问类中的非静态成员(因为非静态成员只有对象存在时才有意义)。但静态字段和静态方法可由任意访问权限许可的成员访问。(2)静态方法classPerson{

private

intage;

private

stringname;

staticprivate

int

tatol;/用于记录总认数………//其它字段staticintgetTatol(){returntatol;}}

7、方法的嵌套与递归调用在一个方法中调用另外一个方法,称为方法的嵌套调用;方法直接或间接地调用其本身,则称为方法的递归调用。(1)方法的嵌套在C#中,不可以在定义的一个方法的代码中定义另外一个方法,但在一个方法中调用另外一个方法是允许的,这种调用方式称为方法的嵌套调用。7、方法的嵌套与递归调用(2)方法的递归调用方法的递归调用是指一个方法直接或间接调用自己本身的情况。很多的数学模型和算法设计方法本来就是递归的,所以用递归方法描述它们比用非递归方法简洁易读,可理解性好,算法的正确性证明也比较容易。一般来说,在方法的递归调用中,一个方法执行的某一步都要用到它自身的前面一步或前若干步的结果。1当n=0时n!=

n*(n-1)!当n≥1时7、方法的嵌套与递归调用(2)

方法的递归调用1当n=0时n!=

n*(n-1)!当n≥1时publiclongFactorial(intn){if(n==0||n==1)return1;elsereturnn*Factorial(n-1);}

7、方法的嵌套与递归调用(2)

方法的递归调用

例题6-27求Fibonacci序列的值6.5属性对字段最常用的操作是什么?1、

什么是属性通过调用“方法”实现对字段的读写操作太麻烦了,也不符合人的使用习惯。6.5属性

属性描述了对象的具体特性,它提供了对类或对象成员的访问。属性是字段的自然扩展,两者都是具有关联类型的命名成员,而且访问字段和属性的语法是相同的。1

什么是属性6.5属性但属性与字段不同,属性不表示存储位置。相反,属性有访问器(accessor),这些访问器指定在它们的值被读取或写入时需执行的语句。C#属性成员一般具有get和set两种访问器。C#中的属性更充分地体现了对象的封装性,属性不直接操作类的字段,而是通过访问器进行访问。1

什么是属性

属性在类模块里是采用下面的方式进行声明的,即指定变量的访问级别、属性的类型、属性的名称,然后是get访问器或者set访问器代码块。其语法格式如下:

修饰符数据类型属性名称

{get访问器

set访问器

}2属性声明修饰符有new、public、protected、internal、private、static、virtual、override和abstract。2属性声明属性的声明类似于字段,不同之处在于属性的声明以定界符“{}”之间的get访问器和set访问器结束,而不是分号。同时包含get访问器和set访问器的属性称为可读写属性(read-writeproperty)。只具有get访问器的属性称为只读属性(read-onlyproperty)。只具有set访问器的属性称为只写属性(write-onlyproperty)。2属性声明get访问器相当于一个具有属性类型返回值的无参数方法。除了作为赋值的目标外,当在表达式中引用属性时,会调用该属性的get访问器以计算该属性的值。set访问器相当于一个具有名为value的参数和无返回类型的方法。当一个属性作为赋值的目标,或者作为“++”或“--”运算符的操作数被引用时,就会调用set访问器,所传递的自变量将提供新值。2属性声明value是C#的关键字,是进行属性操作时set的隐含参数。value的使用仅限于此,在其他位置使用value会出错。2属性声明【例6.7】设计一个控制台应用程序,说明属性的使用。publicclassTPoint3 //声明类TPoint3{intx,y;publicintpx{ get //get访问器

{returnx;

} set //set访问器

{x=value;

}}publicintpy{ get //get访问器

{returny;

} set //set访问器

{y=value;

}}};点=>(3,8)【例6.7】设计一个控制台应用程序,说明属性的使用。classProgram{staticvoidMain(string[]args){ TPoint3p=newTPoint3();

p.px=3;p.py=8;//属性写操作

Console.WriteLine("点=>({0},{1})",p.px,p.py);//属性读操作

}}}点=>(3,8)classPerson

{

private

intage;………//其它字段

public

intAge

{

get{returnage;}

set

{

if(value<10||value>60)value=0;age=value;

}

}

}

class

Program

{

private

static

voidMain(string[]args)

{

MyClassmy;my=new

MyClass();

my.Age=35;//调用set访问器

Console.WriteLine("my对象中age字段值为{0}",my.Age);

//调用get访问器my.Age=350;

Console.WriteLine("my对象中age字段值为{0}",my.Age);

}

}类的定义综合案例classcar

{

privateint_百公里耗油=10;

privateint_油箱容积=60;

privateint_油表;

privateint_公里数;

定义一个汽车类,演示类的定义相关知识点。构造函数重载

publiccar()

{

_油表=_油箱容积;

_公里数=0;

}

publiccar(int

当前油表)

{

_油表=当前油表;

_公里数=0;

}

publiccar(int

当前油表,int

当前里程)

{

_油表=当前油表;

_公里数=当前里程;

}

方法的嵌套调用

private

int

计算耗油(int

行驶公里数)

{

return行驶公里数*_百公里耗油/100;

}

publicvoid行驶(int

行驶公里数)

{

Console.WriteLine(“行驶{0}公里开始”,行驶公里数);

if(_油表>计算耗油(行驶公里数))

{

_公里数+=行驶公里数;

_油表-=计算耗油(行驶公里数);

Console.WriteLine("行驶完毕");

}

else

Console.WriteLine("油耗不足,行驶失败");

}

方法的重载

publicvoid加油()

{

Console.WriteLine(“开始加油”);

int

需要加的油=_油箱容积-_油表;

_油表+=需要加的油;

Console.WriteLine(“加油完毕,一共加了{0}升”,需要加的油);

}

publicvoid加油(int

加油体积)

{

Console.WriteLine("加油{0}升开始",加油体积);

if(加油体积<_油箱容积)

{

_油表+=加油体积;

Console.WriteLine("加油完毕");

}

else

Console.WriteLine("超过最大油箱容积,加油失败");

}

publicvoid获取当前汽车信息()

{

WriteLine(stri

温馨提示

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

评论

0/150

提交评论