第2章-面向对象程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.NET程序设计杨剑yang_jian03@126.com2C#程序设计语言第一章:.NET与C#概述第二章:面向对象程序设计第三章:集合、索引器与泛型第四章:程序调试与异常处理第五章:基于事件驱动的程序设计第六章:Windows程序设计技术第七章:C#数据库编程技术第八章:文件操作与编程技术第九章:多线程和异步编程第二章面向对象程序设计4本章目标理解面向对象的基本概念,正确区分类和对象,对象的声明和对象的创建掌握类的定义与使用方法,正确定义类的数据成员、属性和方法。理解值类型和引用类型的区别。理解构造函数的作用,掌握其使用方法。理解类的可访问性、正确使用访问修饰符控制对类成员的访问掌握类的方法的定义、调用与重载,理解方法的参数传递的工作机制。5本章目标虚方法的概念、目的静态类与静态类成员的定义与使用类的继承性与多态性抽象方法和抽象类嵌套类、分部类和命名空间接口6OOP—类和对象厨房起居室浴室书房饭厅储藏室门廊类对象类相对对象而言,类似于蓝图包含方法和数据对象是类的实例使用关键字new创建对象具有行为7类的定义对象的类型称为类(class),类代表了某一类对象的共性和特征[访问修饰符]class类名[:基类]{类的成员;}类的成员包括常量、字段、属性、索引器、方法、事件、构造函数等类的定义—定义类和创建对象publicclassStudent{publicstringname;//数据成员publicintage;publicstringGetMessage()//方法成员{returnstring.Format(姓名:{0},年龄:{1}岁。,name,age);}}定义类89类的定义—定义类和创建对象将类实例化为对象Studentstu1;//声明一个Student对象stu1类成员的访问类名对象名对象名=new类名();stu1=newStudent();//为stu1分配内存空间类名对象名=new类名();Studentstu2=newStudent();//声明同时创建对象类内部——直接访问(或用-this.类成员)类外部——对象名.类成员this.namestu1.name=令狐冲;10类的定义—访问修饰符2-1Teacher类private成员protected成员public成员internal成员Student类只有Student类在Teacher类都在同一程序集中,才可访问internal成员不可访问不可访问可以访问11类的定义—访问修饰符2-2修饰符说明public所属类的成员以及非所属类的成员都可以访问internal当前程序集可以访问private只有所属类的成员才能访问protected所属类或派生自所属类的类型可以访问使用访问修饰符,可以定义应用程序中类成员的作用域访问修饰符只是控制类外对类成员的访问,类的内部对自己成员的访问不受其限制,即在类的内部可以访问所有的类成员类的定义—数据成员和属性常量publicconstdoublepi=3.1415926;[访问修饰符]const数据类型常量名=常量的值;12字段publicdoubleradius;[访问修饰符]数据类型字段名;如果未指定访问修饰符,则使用默认的可访问性,类的成员默认为private第一级类型(指不嵌套在其他类型中的类型)的可访问性只能是internal或public,默认可访问性是internal类的定义—数据成员和属性属性——是限制对类成员访问的方法[访问修饰符]数据类型属性名{get{//获取属性的代码,用return返回值}set{//设置属性的代码,用value赋值}}13读/写属性类的定义—数据成员和属性属性是限制对类成员访问的方法:只读属性只写属性[访问修饰符]数据类型属性名{get{//获取属性的代码,用return返回值}14[访问修饰符]数据类型属性名{set{//设置属性的代码,用value赋值}}15类的定义—值类型和引用类型42i•42c值类型:值类型变量直接包含其本身的数据存储在栈中必须初始化直接分配空间int、char、结构引用类型:表示指向数据的指针或引用存储在堆中.NET垃圾回收器处理析构类、接口、数组、字符串inti;i=42;CostObjectc;为null,则表示未引用任何对象16类的方法—方法的声明类的方法定义类的某种行为(或功能)[访问修饰符]返回值类型方法名([参数列表]){语句;……[return返回值;]}访问修饰符(可选),默认情况下为private类的方法—方法调用方法是个“黑匣子”,完成某个特定的应用程序功能,并返回结果Sum(x,y)方法名(参数列表)17在方法声明的类定义中调用该方法add.Sum(x,y);对象名.方法名(参数列表)在方法声明的类定义外部调用该方法,需要通过类声明的对象调用该方法18类的方法—方法调用实现两个整型的加法classAdd{publicintSum(intpara1,intpara2){returnpara1+para2;}}AddmyAdd=newAdd();intsum=myAdd.Sum(2,3);使用方法实例化一个对象返回结果调用方法形式参数实际参数类的方法—方法调用Adda=newAdd();a.Sum(5,6);作为一条独立的语句使用19类的方法被调用时,有以下几种使用方法Adda=newAdd();intr=4*a.Sum(5,6);作为表达式的一部分,参与算术运算、赋值运算等Adda=newAdd();intr=a.Sum(a.Sum(5,6),8);作为另一个方法的参数来使用20方法调用小结方法之间允许相互调用,不需要知道方法的具体实现,提高了效率情况举例1、类Student的方法a()调用Student类的方法b(),直接调用publicvoida(){b();//调用b()}2、类Student的方法a()调用类Teacher的方法b(),先创建类对象,然后使用“.”调用publicvoida(){Teachert=newTeacher();t.b();//调用Teacher类的b()}21参数的值传递方式工资计税的方法为:低于等于3000不计税,超出3000的部分按10%缴税intpay;//税前工资floattaxRate=0.1f;//税率floatafterTax;//税后工资Console.WriteLine(请输入税前工资:);pay=int.Parse(Console.ReadLine());if(pay=3000)//低于3000不缴税{afterTax=pay;}else//高于3000部分按税率缴税{afterTax=pay-(pay-3000)*taxRate;}Console.WriteLine(税前工资{0},税后工资{1},pay,afterTax);怎样用方法实现?22代码分析关键代码回顾://此方法根据税前工资计算税后工资privatestaticfloatGetPay(intpay,floattaxRate){floatafterTax;if(pay=3000)//低于3000不缴税{afterTax=pay;}else//高于3000部分按税率缴税{afterTax=pay-(pay-3000)*taxRate;}returnafterTax;}传入税前工资、税率返回税后工资23为什么使用ref下面代码输出结果是什么?staticvoidMain(string[]args){intnum1=5,num2=10;//两个数字Console.WriteLine(交换前两个数的值分别为:{0}和{1},num1,num2);Swap(num1,num2);//交换两个数的值Console.WriteLine(交换后两个数的值分别为:{0}和{1},num1,num2);}//交换两个数的方法privatestaticvoidSwap(intnum1,intnum2){inttemp;//中间变量temp=num1;num1=num2;num2=temp;}值传递不能保留参数的修改要按引用传递,使用ref24通过引用传递参数ref修饰参数:调用方法后,参数值的更改仍然保留定义和调用在参数前使用ref在调用方法前作为参数的变量声明并赋值何时使用希望保留参数的更改25分析staticvoidMain(string[]args){Console.WriteLine(交换前两个数的值分别为:{0}和{1},num1,num2);//交换两个数的值Swap(refnum1,refnum2);Console.WriteLine(交换后两个数的值分别为:{0}和{1},num1,num2);}//交换两个数的方法privatestaticvoidSwap(refintnum1,refintnum2){inttemp;//中间变量temp=num1;num1=num2;num2=temp;}调用时也要使用ref26两种传参方式的比较调用方法方法定义ModifyValue(num1,refnum2);ModifyValue(intparam1,refintparam2){};调用前num1=3num2=5param1=3param2=5方法中修改:调用后param1=4param2=6num1=3num2=6调用值传递引用传递27方法的参数回顾:参数传递使用值传递,参数值的更改不能保留。使用ref可以将参数值的更改保留out类型参数(输出参数)privatestaticboolAddScore(intscore,outintscoreResult){if(score50&&score60){Console.WriteLine(你的成绩在50-60之间,可以加分。);scoreResult=60;}else{scoreResult=score;}}都可以输出结果ref侧重修改,out侧重输出用ref和out修饰的参数都是引用传参方式,在方法体内对参数的修改和赋值都会被保留到实参中,但两者在使用上是有一定的区别的。(1)用ref修饰的参数,在传参前必须对实参明确赋初值。(2)用out修饰的参数,在传参前不需要赋初值,但在方法内部必须赋值后才能使用,且在方法结束前,必须对该参数赋值。28引用类型数据的传参引用类型参数总是按引用传递引用类型参数传递不需要使用ref或out关键字(string除外),引用类型参数的传递,实际上是将实参对数据的引用复制给了形参。所以形参与实参共同指向同一个内存区域。29publicintSum(intpara1,intpara2){returnpara1+para2;}为什么要重载整形参数,返回值整型如果想让两个string型、两个double型相加,怎么做?编写两个不同名字的方法,这样我们在进行调用时要先判断是什么类型,能否不判断直接就能相加呢?30方法的重载同一个类中添加几个名字相同,参数与返回值不同的方法调用时只要传递参数即可,无需判断类型publicstringSum(stringpara1,stringpara2){returnpara1+para2;}publicdoubleSum(doublepara1,doublepara2){returnpara1+para2;}31classAdd{publicintSum(intpara1,intpara2){…}publicintSum(intpara1,intpara2,intpara3){…}}classAdd{publicstringSum(stringpara1,stringpara2){…}publicintSum(intpara1,intpara2){…}}重载的方式基于不同类型参数的重载相同类型不同参数个数的重载不允许重载方法仅仅是返回值不同32装箱和拆箱2-1装箱是将值类型转换为引用类型拆箱是将引用类型转换为值类型利用装箱和拆箱功能,可通过允许值

1 / 92
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功