




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,孙月江syjsdut,1,2,第7章创建并管理类和对象,定义一个类,在其中包含一些列相互关联的方法和数据项使用public和private关键字,控制成员的可访问性使用new关键字来创建对象并调用一个构造器来初始化自己编写并调用构造器使用static关键字创建可由同一个类的所有实例共享的方法和数据解释如何创建匿名类,3,7.1理解分类,设计一个类的过程,就是对信息进行分类,将相关信息放到一个有意义的实体中的过程,4,7.2封装的目的,封装是类的一个重要原则中心思想:使用一个类的程序不应该关系类的内部实际如何工作封装有时也称为信息隐藏封装的目的:将方法和数据合并到一个类中;换言之,为了支持分类控制对方法和数据的访问;换言之,为了控制类的使用,类和对象,类是对象的模板,它定义了对象的公共属性和行为(方法)。属性和方法共同称作类的成员对象是类的实例,是具体的对象必须使用new进行实例化才可以使用,类和对象3.1.1,类对象人类(模板)阿土仔(具体化)姓名姓名=阿土仔性别性别=男使用卡片()使用“陷害卡”使用道具()使用“飞弹”,属性,方法,类和对象3.1.1,类:相对对象而言,类似于模板或蓝图包含方法和数据,对象:是类的实例使用关键字new创建对象具有状态和行为,对象,类,8,类概览,Class_definition:=class,:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=,类成员被分成了三大类:数据成员函数成员嵌套类型,9,数据成员包括:,成员变量:(也叫域)用于表示数据成员变量可以用于类的特定实例(对象)-实例变量;也可以属于类自身(通过声明为static),这时,它称为静态变量或类变量。一个静态方法通过它的类(不是它的对象)来调用且它属于类而不属于对象。同样,一个静态变量属于类而不是任何特定的对象。常量成员变量也可以声明为只读(通过Readonly关键字)常量成员的值在编译程序时被设置为源代码中指定的值,并且在所编译程序的整个生存期内均表示这一值。而只读成员变量在创建时给它赋值,并且在此对象生存期内保持此值。事件按声明成员变量的相似方式来声明。用法大不一样。事件驱动程序。程序执行的下一个动作取决于程序中触发的下一个事件。所以,让程序按语句书写顺序依次执行的思想恐怕得不到实现了。当运行一个GUI应用程序时就需要此异步功能。,10,函数成员包括:,方法构造函数析构函数属性索引器操作符,11,嵌套类型:,类体中定义的类、结构、枚举和接口,7.4控制可访问性,一个方法或字段假如只允许从类的内部访问,就说他是私有的(private)该关键字是默认的,但作为一种良好的编程习惯,应该显式地将方法和字段声明为private一个方法或字段假如既能从类的内部访问,也能从外部访问,就说他是公共的(public)注意:方法中声明的变量默认是不初始化的相反,类中的字段自动初始化为0,false或null作为一个良好的编程习惯,应该显式地初始化字段,12,命名和可访问性,.NETFramework推荐以下字段和方法的命名约定,它们是以可访问性为出发点来考虑的:public的标识符应该以大写字母开头,例如:Area非public的标识符应该以小写字母开头,例如:radius例外:类名是以大写字母开头,而构造器必须完全和类名相同,故一个private的构造器也应该以大写字母开头,13,14,7.4.1使用构造器,字段的构造器创建一个对象时,对应的表示实例变量的内存被分配,这是对象创建过程的一部分。但分配完成后(且在任何自动或人工初始化发生前),内存和实例变量仅表示上次使用后残留的垃圾。将这部分垃圾用于计算就会导致错误的结果。例:distance=time*speed;没有实例化的实例变量很容易导致错误的发生,15,1、自动初始化short、int、float、decimal等为0char类型值赋值为Unicode字符、u0000bool类型值初始为false引用类型初始化为null一般情况下,不推荐让运行时自动执行实例变量的初始化:阅读源代码的程序员不能看到此初始值。他或她可能不知道前面所列的缺省初始值,缺省值随编译器的不同、同一软件公司发行编译器版本的不同而有所差异。,16,2、在声明中给实例变量赋值classAccountprivatedecimalbalance=100;.privatedecimalbalance=;,17,如果我们需要一个if语句来确定恰当的初始化值,例如:一个银行可能通过“如果在2004年6月1日前新开帐户,免费赠送开户额200元;如果在6月1日和7月1日期间新开帐户,则赠送开户额100元,7月1日后免费赠额为0,敬请把握良机”来近行特别宣传。,18,以上代码看似正确,但实际是无效的。C#只允许if语句及类似语句位于函数成员体的内部。classAccountprivatedecimalbalance;publicvoidInitialize()if(OpeningDateisearlierthan1stofJune)balance=200;elseif(OpeningDateisinbetween1stofJuneand1stofJuly)balance=100;elsebalance=0;,19,AccountmyAccount=newAccount();myAccount.Initialize();,20,使用实例构造函数,类的实例构造函数是一个有专门作用的方法,当用new关键字创建此类的一个对象时调用它。实例构造函数用于执行实例变量的初始化及其他创建对象所需的动作。定义实例构造函数,21,Instance_Constructor_Definition:=Constructor_Identifier()其中:=private:=public:=protected:=internal:=:base():=:this():=:=;,22,,必须等同于构造函数所在的类标识符。例如一个叫Dog的类中的构造函数必须也叫Dog。实例构造函数不能返回值。所以,没有指定返回类型,甚至也没有使用void关键字。导致执行此实例构造函数前的另一个实例构造函数。,23,说明:与常规方法一样,实例构造函数定义的构造函数标示符后必须用一个圆括号来包含可选的形式参数列表。当用new关键字创建一个新对象时,参数值被传递给这些形式参数。如果类包含两个或更多的实例构造函数,在声明实例构造函数语句之前,你可以选择性地执行同一个类中的实例构造函数。通过将构造函数初始化器this放在形式参数列表后面来实现。,24,调用实例构造函数CatmyCat=newCat();圆括号看似没有必要,那为什么非要包含它呢?我们已经知道,newcat()创建一个Cat类的新对象并返问一个对此对象的引用在这里,就是将它赋值给myCat。任何方法调用必在方法名后面加一对圆扩号按同样方法调用一个实例构造函数。,25,类名(在这里就是Cat)后的圆括号可以像常规方法样包括一个参数列表():此参数列表必须与实例构造函数中对应的形式参数列表匹配。如果存在两个或更多个实例构造函数(通常为重载),形式参数列表与传递的参数列表匹配的实例构造函数被执行。,26,一个带空形式参数列表的实例构造函数称作缺省实例构造函数。缺省实例构造函数的另一个术语是无参数实例构造函数。,classTreeprivateintage=0;.,classTreeprivateintage=0;publicTree();.,27,注意:如果你编写一个或多个非缺省实例构造函数,需要的话,你必须编写自己的缺省实例构造函数:如果你在类中包含一个或多个实例构造函数,C#编译器不会包含一个缺省实例构造函数。例如:,classCarprivateintodometer;publicCar(intinitialOdometer)odometer=initialOdometer;,CaryourCar=newCar();/Invalid.Default,28,技巧:如果你在类中包含一个或多个实例构造函数,最好同时包含一个缺省实例构造函数即使你认为类在编写时并不需要一个缺省构造函数,但此类在频繁使用过程中,目的和场合稍有不同时,可能突然需要调用缺省构造函数,当你在构建类时添加缺省实例构造函数就省事了。,29,重载实例构造函数,为了区分重载实例构造函数中包含的不同形式参数列表,像对待常规重载方法一样,编译器遵循相同的判断过程。,30,构造函数初始化器,假设无论调用哪一个重载实例构造函数,某个类都需要执行一套核心初始化语句。我们可以首先在每个实例构造函数中包含相同的初始化语句集,然后我们在顶端添加此实例构造函数特定的语句。这样虽然能正常工作,但每个实例构造函数都将承担相同的核心语句执行任务,而且你也要重复复制和粘贴这些语句。另一种办法是,仅在缺省实例构造函数中放入核心语句,并让每个重载实例构造函数通过构造函数初始化器来调用它,这样就可以删除第一种途径中多余的代码了。,31,01:classAccount02:03:privatedecimalbalance;04:privatedecimalinterestRate;05:privatestringholderName;06:07:publicAccount(decimalinitialBalance,decimalinitialInterestRate,08:stringinitialHolderName)09:10:balance=initialBalance;11:interestRate=initialInterestRate;12:holderName=initialHolderName;13:BankStatistician.AccountAdded(balance);14:Console.WriteLine(Newaccountopened);15:16:17:publicAccount(stringinitialHolderName):this(0,0,initialHolderName)18:19:Console.WriteLine(Note:Onlyinitialholdernamesupplied);20:21:22:publicAccount():this(0,0,Notassignedyet)23:24:Console.WriteLine(Note:Noinitialinformationsupplied);25:,32,私有实例构造函数,private代替public一个私有实例构造函数不能由此类的外部任何地方调用,这与私有方法和私有实例变量相似。一个私有实例构造函数不能用于创建对象,所以只包含私有实例构造函数的类可有效防止从此类的外部对类中的任何对象进行实例化。这一原理通常用于仅包含静态成员的类中。这些静态类根本没有必要实例化,这样可阻止在程序的其他部分对他们的偶然实例化。,33,静态构造函数,classFishprivatestaticintnumberOfFishCreated;staticFish()-只能由运行时访问numberOfFishCreated=0;.,Constructor_identifier必须与静态构造函数所在的类同名。静态构造函数没有指定任何参数静态构造函数没有指定任何访问修饰符,分部类,一个类可能包含大量方法、字段、构造器以及其他内容一个功能齐全的类可能相当大C#中,可以将一个类的源代码拆分到单独的文件中这样一来,大型类就可以使用较小的、更容易管理的部分来进行组织使用partial关键字来定义类的不同部分,34,partialclassCirclepublicCircle()/defaultconstructorthis.radius=0;publicCircle(intinitialRadius)/overloadedconstructorthis.radius=initialRadius;Thecontentsofcirc2.cslooklikethis:partialclassCircleprivateintradius;publicdoubleArea()returnMath.PI*this.radius*this.radius;,35,数据成员(datamember),实例变量表示与单个对象相关的数据,当创建一个对象时,它的实例变量赋于对应于此对象的值,而且这些值在对象的生存期间与对象保持一致。如果我们要表示属于同一类的整组对象相关的信息片断?BankSimulation的例子:我们必须先决定账户数量,并且此数量在程序中固定不变。假定我们放宽此条件,在程序执行的任何时候都能打开或关闭此账户,而且还希望跟踪创建Account对象的总数量。实现:classAccountpublicuinttotalAccountCreated;,36,此方法的弊端:,数据复制:totalAccountCreated导致每个Account对象表示一个等同于其他所有Account对象的值。这不仅浪费了计算机内存,也混淆了程序员的注意力。由于所有Account对象的代码更改而导致的代码效率低下:每次创建一个新Account对象,Bank对象必须修改(将变量值加1)所有的Account对象。每次添加一个新的Account,为了进行更新,迭代语句将不得不遍历整个Account对象集合。,37,38,解决的方法:,只在一个地方保存totalAccountsCreated,将它从每个对象中删除。因为Account类定义了所有Account对象的属性,所以将它放在Account类中。通过static关键字实现,classAccount.publicstaticuinttotalAccountsCreated;/Efficient.,类似于全局变量只存在一个totalAccountsCreated的复制,它属于整个Account类而不属于单个对象。totalAccountsCreated由所有Account对象共享。totalAccountsCreated有一个值,即使没有创建Account对象也是如此。totalAccountsCreated可以通过Account类访问。,39,40,静态成员变量,实例变量表示与单个对象相关的数据,当创建一个对象时,它的实例变量赋于对应于此对象的值,而且这些值在对象的生存期间与对象保持一致。如果我们要表示属于同一类的整组对象相关的信息片断?注意:静态成员变量也叫做共享字段,类似于全局变量一个静态成员变量使用类名加点操作符不能通过对单个对象使用点操作符来访问。,41,01:usingSystem;02:usingSystem.Collections;03:04:classAccount05:06:publicstaticuinttotalAccountsCreated=0;07:08:publicAccount()09:10:totalAccountsCreated+;11:12:13:14:classBank15:16:privateArrayListaccounts;17:18:publicBank()19:20:Console.WriteLine(Congratulations!Youhavecreatedanewbank);21:accounts=newArrayList();22:23:,42,24:publicvoidAddNewAccount()25:26:accounts.Add(newAccount();27:Console.WriteLine(Newaccountadded!);28:PrintStatistics();29:30:31:publicvoidRemoveFirstAccount()32:33:if(accounts.Count0)34:35:accounts.RemoveAt(0);36:Console.WriteLine(Accountremoved!n);37:PrintStatistics();38:39:else40:41:Console.WriteLine(Sorrynomorecurrentaccounts);42:43:44:45:publicvoidPrintStatistics()46:47:Console.WriteLine(Numberofcurrentaccounts:+accounts.Count+48:nNumberofnewaccountscreated:+Account.totalAccountsCreated);49:50:,43,52:classDynamicBankSimulation53:54:privatestaticBankbigBucksBank;56:publicstaticvoidMain()57:58:stringcommand;60:bigBucksBank=newBank();61:do62:63:PrintMenu();64:command=Console.ReadLine().ToUpper();65:switch(command)66:67:caseA:68:bigBucksBank.AddNewAccount();break;70:caseE:71:Console.WriteLine(ByeBye!);break;73:caseR:74:bigBucksBank.RemoveFirstAccount();break;76:caseP:77:bigBucksBank.PrintStatistics();break;79:default:80:Console.WriteLine(Invalidchoice);81:break;82:83:while(command!=E);84:,44,86:privatestaticvoidPrintMenu()87:88:Console.WriteLine(nWhatwouldyouliketodo?n+89:A)Addnewaccountn+90:R)Removeaccountn+91:P)Printstatisticsn+92:E)Endsessionn);93:94:,45,语法箱,Data_member_declaration:=staticconst|readonly=,=.;where:=public:=private:=protected:=internal:=protectedinternal,46,函数成员,实例方法:实例函数组静态方法:静态方法组类的所有对象共享每个实例方法的一个拷贝:编译器将此方法所调用对象的引用作为一个参数暗中传递给实例方法。,47,Method:=where:=():=:=:=new:=static:=virtual:=sealed:=override:=abstract:=extern:=public:=private:=protected:=internal:=protectedinternal:=void:=,48,调用一个方法的方式是:在方法的名字后面加上一对包含参数的圆括号,并与形式参数匹配。,49,静态方法,调用main方法,运行时不会创建任何对象。与其它方法一样,静态方法的定义必须放在类体中。classMyClass().publicstaticvoidMain().运行时可以直接通过类名调用:Myclass.Main(),50,调用一个静态方法的三种途径:,从方法所属类的内部调用,此时不需要任何类名或对象名作为前缀,51,从所属类外部调用如果定义方法所在类存在任何一个对象,则可使用此对象名加点操作符来调用:RocketrocketA=newRocket();.rocketA.Average(.).不管定义方法所在类是否存在任何对象,都可以通过类名加加点操作符来调用注意:最好使用类名而不是对象名,因为类名调用格式清楚的表示我们正调用一个静态方法。,52,何时使用静态方法,不能明确指定属于某一特定对象的方法应该为静态classMyMath.publicdoubleAverage(paramsdoublenumbers).如果要调用Average方法:MyMathmathObject=newMyMath();mathObject.Average()将Average声明为staticpublicstaticdoubleAverage(paramsdoublenumbers)调用:MyMath.Average(),53,技巧:如果程序包含若干不与任何特定对象相关联的方法,提供的功能属于同一个范畴,那么为这些方法创建一个类并声明为static。静态方法遍布.Net框架中。例:System.Math类包含24个静态数学方法。Console类包含Read、ReadLine、Write、WriteLine等,54,2、在某些情况下,使用一个静态方法来访问静态成员变量,55,使用const关键字创建静态字段,const字段是静态字段,但在声明时不适用static关键字const字段一旦声明,其值永远不会改变classMathcublicconstdoublePI=3.1415926;,56,所有的静态变量必须声明为Private,当从类的外部访问时,私有静态变量只能通过静态方法进行访问或通过在同一类中作为变量定义的实例方法来访问。不能从同一个类的静态方法内直接访问和调用实例变量及实例方法静态方法与一个类而不是与任何特定对象相关联。实例方法和实例变量属于一个类的特定对象。静态和实例类成员的这一区别导致不能从同一类的静态方法内部直接调用一个实例方法或直接访问一个实例变量。,57,01:usingSystem;02:03:classLight04:06:publicconstdoubleSpeed=299792;07:privatedoubletimeTraveled;08:privatedoubledistanceTraveled;09:10:publicstaticdoubleCalculateDistance(doubleseconds)11:12:returnseconds*Speed;13:14:15:publicstaticdoubleCalculateTime(doubledistance)16:17:LightsomeLight=newLight();18:someLight.SetDistanceTraveled(distance);19:returnsomeLight.GetTimeTraveled();20:21:22:publicvoidSetTimeTraveled(doublenewTimeTraveled)23:24:timeTraveled=newTimeTraveled;25:,58,27:publicvoidSetDistanceTraveled(doublenewDistanceTraveled)28:distanceTraveled=newDistanceTraveled;32:publicdoubleGetDistanceTraveled()33:returnCalculateDistance(timeTraveled);37:publicdoubleGetTimeTraveled()38:returndistanceTraveled/Speed;41:43:classSolarSystem44:45:publicstaticvoidMain()46:47:LightsunRay=newLight();49:Console.WriteLine(Speedoflight:0kilometersperhour,Light.Speed);50:sunRay.SetTimeTraveled(240);51:Console.WriteLine(Thesunrayhastraveled0kilometersafter240seconds,52:sunRay.GetDistanceTraveled();53:Console.WriteLine(Lighttravels0kilometersafter480seconds,54:Light.CalculateDistance(480);55:Console.WriteLine(Ittakes0:N2secondsforarayofsunshine,56:Light.CalculateTime(150000000);57:Console.WriteLine(totravelfromthesuntotheearth);58:59:,59,用this关键字自引用,this是一个特殊的引用(指针),它指向的是“自己”,也就是当前对象当需要对当前对象的引用时,this关键字写在方法体内。this的作用:点取成员区分同名变量将当前对象(自己)作为参数,传递给其他对象的方法作为方法名表示构造方法,60,61,01:usingSystem;03:classBook04:05:privatestringtitle;06:privateuintnumberOfPages;07:privatedoubleweight;09:publicvoidSetAll(stringtitle,uintnumberOfPages,doubleweight)10:11:this.title=title;12:this.numberOfPages=numberOfPages;13:this.weight=weight;14:16:publicdoubleGetWeight()17:18:returnweight;19:21:publicvoidPrintShippingCost()22:23:Console.WriteLine(nCostofshipping0:1:C,title,Dispatcher.ShippingCost(this);25:27:publicBookGetHeavierBook(BookaBook)28:29:if(weightaBook.GetWeight()30:returnthis;31:else32:returnaBook;33:34:,区别形式参数、本地变量与实例变量,this的作用1,62,36:classDispatcher37:38:publicstaticdecimalShippingCost(BookbookToSend)39:40:return5m+(decimal)(bookToSend.GetWeight()*3);41:42:43:44:classVirtualBookshop45:46:publicstaticvoidMain()47:48:BookmyBook=newBook();49:BookyourBook=newBook();50:BookheavierBook;51:52:myBook.SetAll(“计算机系统结构,400,2.3);53:Console.WriteLine(Shippingcost:0:C,Dispatcher.ShippingCost(myBook);54:myBook.PrintShippingCost();56:yourBook.SetAll(“微机原理,610,3.1);57:heavierBook=yourBook.GetHeavierBook(myBook);58:heavierBook.PrintShippingCost();59:60:,作为一个参数将当前对象的引用传递给另一个方法,将当前对象的引用返回给方法的调用者,63,只读成员(readonlymember),与常量成员(由const关键字声明)一样,只读成员也用于表示一个不变化的值。但是,赋值给常量的值必须在源代码中指定,如:constdecimalMassOfElectron=9.0E-28m;只读成员的值直到程序运行时才知道只读成员的值在一个构造函数中初始化,而且此后不能再修改。所以,常量成员在编译后程序的整个生存期内保持不变,而只读成员只在此对象的生存期内保持不变。常量成员的类型限于以下之一:byte、sbyte、short、ushort、int、uint、long、float、double、decimal、char、bool、enum、string只读成员可以为任何类型,64,01:usingSystem;02:03:classAccount04:05:publicreadonlystringAccountNum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公务员考试时事政治测试卷附参考答案详解(精练)题型大全
- 2025年法律职业资格考试高频难、易错点题含答案详解【培优】
- 【论文-教育教学】农村小学“家校协同评价”机制的实践困境与对策
- 家纺品质考试题及答案
- 2025年江苏无锡经济开发区事业单位招聘8人笔试高频难、易错点备考题库及参考答案详解
- 2025年天津市滨海新区中医医院暨天津中医药大学第四附属医院招聘13人笔试高频难、易错点备考题库及参考答案详解
- 杜尔伯特蒙古族自治县2025黑龙江大庆杜尔伯特蒙古族自治县事业单位人才引进10人笔试历年参考题库附带答案详解
- Linux系统定时任务计划制定
- 企业资产评估报告撰写指南
- 乱世之中的权谋规程
- 杭州2025网约车区域考试试题和答案
- 2025广西崇左凭祥市委宣传部招聘编外工作人员1人考试参考题库及答案解析
- 2025江西赣州南康赣商村镇银行招聘4人考试参考题库及答案解析
- 房屋建筑工程实体质量检查评分表
- 民航安全安全检查员
- 学生伤害事故的责任分析和处理案例
- 隧道防排水检查井技术交底书
- 《历史》中职课件05第五章
- TSS-UT811-001UT-811线路保护测控装置调试说明书V1[1]0.
- (终稿)加油站全流程诊断与优化提量指导手册
- EN779-2012一般通风过滤器——过滤性能测定(中文版)
评论
0/150
提交评论