面向对象程序设计思想(下).ppt_第1页
面向对象程序设计思想(下).ppt_第2页
面向对象程序设计思想(下).ppt_第3页
面向对象程序设计思想(下).ppt_第4页
面向对象程序设计思想(下).ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

计算机语言C#,第三章面向对象程序设计思想(下),上一讲作业答案,1、C#语言中,值类型和引用类型有何不同?【解答】值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。2、C#中不同整型之间进行转换的原则是什么?【解答】在整型之间进行转换时,小范围类型可以隐式转换为大范围类型,但大范围类型转换为小范围类型时需要使用显式转换。,计时工HourlyWorker,classHourlyWorkerstringname;intage;doublewagePerHour;doubleworkHours;publicvoidsetWagePerHour(doublewagePerHour)this.wagePerHour=wagePerHour;publicvoidsetWorkHours(doubleworkHours)this.workHours=workHours;publicdoubleearnings()returnthis.wagePerHour*this.workHours;publicstringgetName();publicintgetAge()returnthis.age;,publicvoidsetName(stringname)=name;publicvoidsetAge(intage)this.age=age;publicvoidsetValue(stringname,intage,doublewagePerHour,doubleworkHours)this.setName(name);this.setAge(age);this.setWagePerHour(wagePerHour);this.setWorkHours(workHours);publicstringshow()+(+this.age+):+this.earnings();,计件工PieceWorker,classPieceWorkerstringname;intage;intquantity;doubleprice;publicvoidsetQuantity(intquantity)this.quantity=quantity;publicvoidsetPrice(doubleprice)this.price=price;publicdoubleearnings()returnthis.quantity*this.price;publicstringgetName();publicintgetAge()returnthis.age;,publicvoidsetName(stringname)=name;publicvoidsetAge(intage)this.age=age;publicvoidsetValue(stringname,intage,intquantity,doubleprice)this.setName(name);this.setAge(age);this.setQuantity(quantity);this.setPrice(price);publicstringshow()+(+this.age+):+this.earnings();,合同工ContractWorker,classContractWorkerstringname;intage;doublesalary;intquantity;doubleprice;publicvoidsetSalary(doublesalary)this.salary=salary;publicvoidsetQuantity(intquantity)this.quantity=quantity;publicvoidsetPrice(doubleprice)this.price=price;publicdoubleearnings()returnthis.salary+this.quantity*this.price;publicstringgetName();,publicintgetAge()returnthis.age;publicvoidsetName(stringname)=name;publicvoidsetAge(intage)this.age=age;publicvoidsetValue(stringname,intage,doublesalary,intquantity,doubleprice)this.setName(name);this.setAge(age);this.setSalary(salary);this.setQuantity(quantity);this.setPrice(price);publicstringshow()+(+this.age+):+this.earnings();,测试程序,classProgramstaticvoidMain(stringargs)HourlyWorkerhw=newHourlyWorker();PieceWorkerpw=newPieceWorker();ContractWorkercw=newContractWorker();hw.setValue(Tom,32,8,40);Console.WriteLine(hw.show();pw.setValue(Mike,44,3,800);Console.WriteLine(pw.show();cw.setValue(Lee,35,1000,2,800);Console.WriteLine(cw.show();Console.ReadLine();输出:Tom(32):320Mike(44):240Lee(35):2600,问题:,1、合同工的底薪是相同。如果有100个合同工,他们的底薪原来是1000,那么我们要为这100个对象设置底薪。有一天老板突发善心将底薪提高为1200元,我们要重新设置这100个对象的底薪。这将是非常头疼,而且易错的事。2、每个字段的访问控制比较繁琐。3、在测试程序中使用setValue设置参数仍稍嫌麻烦,做好在创建对象是直接设置。4、三个类中有大量代码相同,应该提高代码复用。,学习目标,1、理解类成员和实例成员2、理解字段和属性的差别3、理解构造方法的作用4、理解方法重载,一、解决问题1,C#中将类的属性和方法分为两类:一类为该类所有对象所共享,称之为“类成员”,包括类属性和类方法。例如底薪salary。另一类是每个对象独自存储,互不干扰的属性和方法,称为实例成员。例如姓名name。,1.1类属性,类属性在定义时使用static关键字,如:classContractWorkerstaticdoublesalary;类属性在使用时通过类名.属性名访问。如:ContractWorker.salary,例1,classContractWorkerstringname;intage;publicstaticdoublesalary;intquantity;doubleprice;publicdoubleearnings()returnContractWorker.salary+this.quantity*this.price;,classProgramstaticvoidMain(stringargs)ContractWorkercw1=newContractWorker();ContractWorkercw2=newContractWorker();ContractWorker.salary=1000;cw1.setValue(Tom,25,2,700);cw2.setValue(Lee,35,2,800);Console.WriteLine(cw1.show();Console.WriteLine(cw2.show();ContractWorker.salary=1200;Console.WriteLine(cw1.show();Console.WriteLine(cw2.show();Console.ReadLine();,1.2实例属性,使用实例属性时必须先创建对象(实例),然后通过对象.属性名访问。,1.3类方法,使用static声明的方法称之为类方法,或静态方法。使用类方法时通过类名.方法名调用。类方法中不能使用实例属性和实例方法,否则编译错误。,例2,classClass1staticinti;intj;publicvoidsetJ(intj)this.j=j;publicstaticintf1()returni+j;/错误publicintf2()returni+j;,classProgramstaticvoidMain(stringargs)Class1c=newClass1();c.setJ(3);Console.WriteLine(Class1.f1();Console.WriteLine(c.f2();Console.ReadLine();,1.4实例方法,只有创建了对象才能调用的方法称为实例方法。,二、解决问题2,思路:(1)每个属性设置一个访问权限,设置哪些程序可以访问他们。(2)根据属性的需要,分别设置为只读、只写、可读可写。,2.1访问修饰符,C#中常用的访问修饰符:public(常用)任何外部的类都可以不受限制的存取这个类的方法和数据成员。internal在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工作,而该项目外的其它代码无法访问。protected除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。protectedinternal只限于当前项目,或者从该项目的类继承的子类才可以存取。private(常用)类中的所有方法和数据成员只能在此类中使用,外部无法存取。(默认),例3,如果将以前例子中方法的public去掉,程序将编译错误。因为此时默认为private,私有类型,测试程序和它不在同一类中,所以无法访问。,2.2get访问器,get访问器意味着可以对成员的值进行读操作。get访问器对应一个不带参数的方法,并返回一个与属性相同类型的值。步骤:(1)定义一个私有的数据成员。如:privatestringname;(2)定义一个共有属性,通过get方法获得私有成员的值。如:publicstringNamegetreturnname;,2.3set访问器,set访问器意味着可以对成员的值进行写操作。set访问器将隐式参数value间接地向私有字段赋值。步骤:(1)定义一个私有的数据成员。如:privatestingname;(2)定义一个共有属性,通过set方法设置私有成员的值。如:publicstringNamegetreturnname;setname=value;,如果一个属性既包括get访问器又包括set访问器,那么这个属性为可读可写属性。如果一个属性只包括get访问器,那么这个属性为只读属性。如果一个属性只包括set访问器,那么这个属性为只写属性。,例4,classHourlyWorkerprivatestringname;publicstringNamegetreturnname;setname=value;privateintage;publicintAgegetreturnage;setage=value;privatestaticdoublewagePerHour;publicstaticdoubleWagePerHourgetreturnwagePerHour;setHourlyWorker.wagePerHour=value;privatedoubleworkHours;publicdoubleWorkHoursgetreturnworkHours;setworkHours=value;,publicdoubleearnings()returnHourlyWorker.wagePerHour*this.workHours;publicvoidsetValue(stringname,intage,doubleworkHours)=name;this.age=age;this.workHours=workHours;publicstringshow()+(+this.age+):+this.earnings();,classProgramstaticvoidMain(stringargs)HourlyWorkerhw1=newHourlyWorker();HourlyWorker.WagePerHour=8;hw1.Name=Tom;hw1.Age=32;hw1.WorkHours=40;Console.WriteLine(0(1):2,hw1.Name,hw1.Age,hw1.earnings();HourlyWorkerhw2=newHourlyWorker();hw2.setValue(Mike,44,40);Console.WriteLine(hw2.show();HourlyWorker.WagePerHour=10;Console.WriteLine(hw1.show();Console.WriteLine(hw2.show();Console.ReadLine();,三、解决问题3,当我们使用new创建对象时,程序首先为对象分配内存,然后调用构造方法初始化各成员。1、构造方法是与类名相同的方法,且无任何返回值(连void也没有)。2、使用构造方法的好处是它能够确保每一个对象在被使用之前都适当地进行了初始化的动作。3、如果程序中没有定义任何构造方法,系统将自动产生一个形如:public类名()的构造方法,此构造方法称为“默认构造方法”4、一个类可以有多个构造方法,只要他们的参数列表不同(参数类型、个数),此时称为方法重载。5、默认构造函数自动将非静态成员初始化:数值型:如int、double等,初始化为0。bool类型:初始化为false.引用类型:初始化为null。6、如果自己定义了构造函数,则不会自动进行初始化。,例5,在例4的中增加下列代码:classHourlyWorkerpublicHourlyWorker()setValue(,0,0);publicHourlyWorker(stringname,intage,doubleworkHours)setValue(name,age,workHours);,classProgramstaticvoidMain(stringargs)HourlyWorkerhw1=newHourlyWorker(Mike,44,40);HourlyWorker.WagePerHour=8;Console.WriteLine(hw1.show();Console.ReadLine();,四、方法参数传递,1、传递值类型的参数usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceValueTransferExampleclassProgrampublicstaticvoidAddOne(inta)a+;staticvoidMain()inta=3;Console.WriteLine(调用AddOne之前,a=0,a);AddOne(a);Console.WriteLine(调用AddOne之后,a=0,a);Console.ReadLine();,2、传递引用类型的参数usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceReferenceTransferExampleclassProgrampublicstaticvoidAddOne(refinta)a+;staticvoidMain()intx=3;Console.WriteLine(调用AddOne之前,x=0,x);AddOne(refx);Console.WriteLine(调用AddOne之后,x=0,x);Console.ReadLine();,3、输出多个引用类型的参数输出引用类型参数的格式为:out参数类型参数名usingSystem;usingSystem.Collections

温馨提示

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

评论

0/150

提交评论