理解类和对象.ppt_第1页
理解类和对象.ppt_第2页
理解类和对象.ppt_第3页
理解类和对象.ppt_第4页
理解类和对象.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1 1 2 7 1理解分类 设计一个类的过程 就是对信息进行分类 将相关信息放到一个有意义的实体中的过程 3 7 2封装的目的 封装是类的一个重要原则中心思想 使用一个类的程序不应该关系类的内部实际如何工作封装有时也称为信息隐藏封装的目的 将方法和数据合并到一个类中 换言之 为了支持分类控制对方法和数据的访问 换言之 为了控制类的使用 类和对象 类是对象的模板 它定义了对象的公共属性和行为 方法 属性和方法共同称作类的成员对象是类的实例 是具体的对象必须使用new进行实例化才可以使用 类和对象3 1 1 类对象人类 模板 阿土仔 具体化 姓名姓名 阿土仔性别性别 男使用卡片 使用 陷害卡 使用道具 使用 飞弹 属性 方法 类和对象3 1 1 类 相对对象而言 类似于模板或蓝图包含方法和数据 对象 是类的实例使用关键字new创建对象具有状态和行为 对象 类 7 类概览 Class definition class 类成员被分成了三大类 数据成员函数成员嵌套类型 8 数据成员包括 成员变量 也叫域 用于表示数据成员变量可以用于类的特定实例 对象 实例变量 也可以属于类自身 通过声明为static 这时 它称为静态变量或类变量 一个静态方法通过它的类 不是它的对象 来调用且它属于类而不属于对象 同样 一个静态变量属于类而不是任何特定的对象 常量成员变量也可以声明为只读 通过Readonly关键字 常量成员的值在编译程序时被设置为源代码中指定的值 并且在所编译程序的整个生存期内均表示这一值 而只读成员变量在创建时给它赋值 并且在此对象生存期内保持此值 事件按声明成员变量的相似方式来声明 用法大不一样 事件驱动程序 程序执行的下一个动作取决于程序中触发的下一个事件 所以 让程序按语句书写顺序依次执行的思想恐怕得不到实现了 当运行一个GUI应用程序时就需要此异步功能 9 函数成员包括 方法构造函数析构函数属性索引器操作符 10 嵌套类型 类体中定义的类 结构 枚举和接口 7 4控制可访问性 一个方法或字段假如只允许从类的内部访问 就说他是私有的 private 该关键字是默认的 但作为一种良好的编程习惯 应该显式地将方法和字段声明为private一个方法或字段假如既能从类的内部访问 也能从外部访问 就说他是公共的 public 注意 方法中声明的变量默认是不初始化的相反 类中的字段自动初始化为0 false或null作为一个良好的编程习惯 应该显式地初始化字段 11 命名和可访问性 NETFramework推荐以下字段和方法的命名约定 它们是以可访问性为出发点来考虑的 public的标识符应该以大写字母开头 例如 Area非public的标识符应该以小写字母开头 例如 radius例外 类名是以大写字母开头 而构造器必须完全和类名相同 故一个private的构造器也应该以大写字母开头 12 13 7 4 1使用构造器 字段的构造器创建一个对象时 对应的表示实例变量的内存被分配 这是对象创建过程的一部分 但分配完成后 且在任何自动或人工初始化发生前 内存和实例变量仅表示上次使用后残留的垃圾 将这部分垃圾用于计算就会导致错误的结果 例 distance time speed 没有实例化的实例变量很容易导致错误的发生 14 1 自动初始化short int float decimal等为0char类型值赋值为Unicode字符 u0000bool类型值初始为false引用类型初始化为null一般情况下 不推荐让运行时自动执行实例变量的初始化 阅读源代码的程序员不能看到此初始值 他或她可能不知道前面所列的缺省初始值 缺省值随编译器的不同 同一软件公司发行编译器版本的不同而有所差异 15 2 在声明中给实例变量赋值classAccount privatedecimalbalance 100 privatedecimalbalance 16 如果我们需要一个if语句来确定恰当的初始化值 例如 一个银行可能通过 如果在2004年6月1日前新开帐户 免费赠送开户额200元 如果在6月1日和7月1日期间新开帐户 则赠送开户额100元 7月1日后免费赠额为0 敬请把握良机 来近行特别宣传 17 以上代码看似正确 但实际是无效的 C 只允许if语句及类似语句位于函数成员体的内部 classAccount privatedecimalbalance publicvoidInitialize if OpeningDateisearlierthan1stofJune balance 200 elseif OpeningDateisinbetween1stofJuneand1stofJuly balance 100 elsebalance 0 18 AccountmyAccount newAccount myAccount Initialize 19 使用实例构造函数 类的实例构造函数是一个有专门作用的方法 当用new关键字创建此类的一个对象时调用它 实例构造函数用于执行实例变量的初始化及其他创建对象所需的动作 定义实例构造函数 20 Instance Constructor Definition Constructor Identifier 其中 private public protected internal base this 21 必须等同于构造函数所在的类标识符 例如一个叫Dog的类中的构造函数必须也叫Dog 实例构造函数不能返回值 所以 没有指定返回类型 甚至也没有使用void关键字 导致执行此实例构造函数前的另一个实例构造函数 22 说明 与常规方法一样 实例构造函数定义的构造函数标示符后必须用一个圆括号来包含可选的形式参数列表 当用new关键字创建一个新对象时 参数值被传递给这些形式参数 如果类包含两个或更多的实例构造函数 在声明实例构造函数语句之前 你可以选择性地执行同一个类中的实例构造函数 通过将构造函数初始化器this放在形式参数列表后面来实现 23 调用实例构造函数CatmyCat newCat 圆括号看似没有必要 那为什么非要包含它呢 我们已经知道 newcat 创建一个Cat类的新对象并返问一个对此对象的引用 在这里 就是将它赋值给myCat 任何方法调用必在方法名后面加一对圆扩号按同样方法调用一个实例构造函数 24 类名 在这里就是Cat 后的圆括号可以像常规方法 样包括一个参数列表 此参数列表必须与实例构造函数中对应的形式参数列表匹配 如果存在两个或更多个实例构造函数 通常为重载 形式参数列表与传递的参数列表匹配的实例构造函数被执行 25 一个带空形式参数列表的实例构造函数称作缺省实例构造函数 缺省实例构造函数的另一个术语是无参数实例构造函数 classTree privateintage 0 classTree privateintage 0 publicTree 26 注意 如果你编写一个或多个非缺省实例构造函数 需要的话 你必须编写自己的缺省实例构造函数 如果你在类中包含一个或多个实例构造函数 C 编译器不会包含一个缺省实例构造函数 例如 classCar privateintodometer publicCar intinitialOdometer odometer initialOdometer CaryourCar newCar Invalid Default 27 技巧 如果你在类中包含一个或多个实例构造函数 最好同时包含一个缺省实例构造函数即使你认为类在编写时并不需要一个缺省构造函数 但此类在频繁使用过程中 目的和场合稍有不同时 可能突然需要调用缺省构造函数 当你在构建类时添加缺省实例构造函数就省事了 28 重载实例构造函数 为了区分重载实例构造函数中包含的不同形式参数列表 像对待常规重载方法一样 编译器遵循相同的判断过程 29 构造函数初始化器 假设无论调用哪一个重载实例构造函数 某个类都需要执行一套核心初始化语句 我们可以首先在每个实例构造函数中包含相同的初始化语句集 然后我们在顶端添加此实例构造函数特定的语句 这样虽然能正常工作 但每个实例构造函数都将承担相同的核心语句执行任务 而且你也要重复复制和粘贴这些语句 另一种办法是 仅在缺省实例构造函数中放入核心语句 并让每个重载实例构造函数通过构造函数初始化器来调用它 这样就可以删除第一种途径中多余的代码了 30 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 31 私有实例构造函数 private代替public一个私有实例构造函数不能由此类的外部任何地方调用 这与私有方法和私有实例变量相似 一个私有实例构造函数不能用于创建对象 所以只包含私有实例构造函数的类可有效防止从此类的外部对类中的任何对象进行实例化 这一原理通常用于仅包含静态成员的类中 这些静态类根本没有必要实例化 这样可阻止在程序的其他部分对他们的偶然实例化 32 静态构造函数 classFish privatestaticintnumberOfFishCreated staticFish 只能由运行时访问 numberOfFishCreated 0 Constructor identifier必须与静态构造函数所在的类同名 静态构造函数没有指定任何参数静态构造函数没有指定任何访问修饰符 分部类 一个类可能包含大量方法 字段 构造器以及其他内容一个功能齐全的类可能相当大C 中 可以将一个类的源代码拆分到单独的文件中这样一来 大型类就可以使用较小的 更容易管理的部分来进行组织使用partial关键字来定义类的不同部分 33 partialclassCircle publicCircle defaultconstructor this radius 0 publicCircle intinitialRadius overloadedconstructor this radius initialRadius Thecontentsofcirc2 cslooklikethis partialclassCircle privateintradius publicdoubleArea returnMath PI this radius this radius 34 数据成员 datamember 实例变量表示与单个对象相关的数据 当创建一个对象时 它的实例变量赋于对应于此对象的值 而且这些值在对象的生存期间与对象保持一致 如果我们要表示属于同一类的整组对象相关的信息片断 BankSimulation的例子 我们必须先决定账户数量 并且此数量在程序中固定不变 假定我们放宽此条件 在程序执行的任何时候都能打开或关闭此账户 而且还希望跟踪创建Account对象的总数量 实现 classAccount publicuinttotalAccountCreated 35 此方法的弊端 数据复制 totalAccountCreated导致每个Account对象表示一个等同于其他所有Account对象的值 这不仅浪费了计算机内存 也混淆了程序员的注意力 由于所有Account对象的代码更改而导致的代码效率低下 每次创建一个新Account对象 Bank对象必须修改 将变量值加1 所有的Account对象 每次添加一个新的Account 为了进行更新 迭代语句将不得不遍历整个Account对象集合 36 37 解决的方法 只在一个地方保存totalAccountsCreated 将它从每个对象中删除 因为Account类定义了所有Account对象的属性 所以将它放在Account类中 通过static关键字实现 classAccount publicstaticuinttotalAccountsCreated Efficient 类似于全局变量只存在一个totalAccountsCreated的复制 它属于整个Account类而不属于单个对象 totalAccountsCreated由所有Account对象共享 totalAccountsCreated有一个值 即使没有创建Account对象也是如此 totalAccountsCreated可以通过Account类访问 38 39 静态成员变量 实例变量表示与单个对象相关的数据 当创建一个对象时 它的实例变量赋于对应于此对象的值 而且这些值在对象的生存期间与对象保持一致 如果我们要表示属于同一类的整组对象相关的信息片断 注意 静态成员变量也叫做共享字段 类似于全局变量一个静态成员变量使用类名加点操作符不能通过对单个对象使用点操作符来访问 40 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 41 24 publicvoidAddNewAccount 25 26 accounts Add newAccount 27 Console WriteLine Newaccountadded 28 PrintStatistics 29 30 31 publicvoidRemoveFirstAccount 32 33 if accounts Count 0 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 42 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 case A 68 bigBucksBank AddNewAccount break 70 case E 71 Console WriteLine ByeBye break 73 case R 74 bigBucksBank RemoveFirstAccount break 76 case P 77 bigBucksBank PrintStatistics break 79 default 80 Console WriteLine Invalidchoice 81 break 82 83 while command E 84 43 86 privatestaticvoidPrintMenu 87 88 Console WriteLine nWhatwouldyouliketodo n 89 A Addnewaccount n 90 R Removeaccount n 91 P Printstatistics n 92 E Endsession n 93 94 44 语法箱 Data member declaration static const readonly where public private protected internal protectedinternal 45 函数成员 实例方法 实例函数组静态方法 静态方法组类的所有对象共享每个实例方法的一个拷贝 编译器将此方法所调用对象的引用作为一个参数暗中传递给实例方法 46 Method where new static virtual sealed override abstract extern public private protected internal protectedinternal void 47 调用一个方法的方式是 在方法的名字后面加上一对包含参数的圆括号 并与形式参数匹配 48 静态方法 调用main方法 运行时不会创建任何对象 与其它方法一样 静态方法的定义必须放在类体中 classMyClass publicstaticvoidMain 运行时可以直接通过类名调用 Myclass Main 49 调用一个静态方法的三种途径 从方法所属类的内部调用 此时不需要任何类名或对象名作为前缀 50 从所属类外部调用如果定义方法所在类存在任何一个对象 则可使用此对象名加点操作符来调用 RocketrocketA newRocket rocketA Average 不管定义方法所在类是否存在任何对象 都可以通过类名加加点操作符来调用注意 最好使用类名而不是对象名 因为类名调用格式清楚的表示我们正调用一个静态方法 51 何时使用静态方法 不能明确指定属于某一特定对象的方法应该为静态classMyMath publicdoubleAverage paramsdouble numbers 如果要调用Average方法 MyMathmathObject newMyMath mathObject Average 将Average声明为staticpublicstaticdoubleAverage paramsdouble numbers 调用 MyMath Average 52 技巧 如果程序包含若干不与任何特定对象相关联的方法 提供的功能属于同一个范畴 那么为这些方法创建一个类并声明为static 静态方法遍布 Net框架中 例 System Math类包含24个静态数学方法 Console类包含Read ReadLine Write WriteLine等 53 2 在某些情况下 使用一个静态方法来访问静态成员变量 54 使用const关键字创建静态字段 const字段是静态字段 但在声明时不适用static关键字const字段一旦声明 其值永远不会改变classMath cublicconstdoublePI 3 1415926 55 所有的静态变量必须声明为Private 当从类的外部访问时 私有静态变量只能通过静态方法进行访问或通过在同一类中作为变量定义的实例方法来访问 不能从同一个类的静态方法内直接访问和调用实例变量及实例方法静态方法与一个类而不是与任何特定对象相关联 实例方法和实例变量属于一个类的特定对象 静态和实例类成员的这一区别导致不能从同一类的静态方法内部直接调用一个实例方法或直接访问一个实例变量 56 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 57 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 0 kilometersperhour Light Speed 50 sunRay SetTimeTraveled 240 51 Console WriteLine Thesunrayhastraveled 0 kilometersafter240seconds 52 sunRay GetDistanceTraveled 53 Console WriteLine Lighttravels 0 kilometersafter480seconds 54 Light CalculateDistance 480 55 Console WriteLine Ittakes 0 N2 secondsforarayofsunshine 56 Light CalculateTime 150000000 57 Console WriteLine totravelfromthesuntotheearth 58 59 58 用this关键字自引用 this是一个特殊的引用 指针 它指向的是 自己 也就是当前对象当需要对当前对象的引用时 this关键字写在方法体内 this的作用 点取成员区分同名变量将当前对象 自己 作为参数 传递给其他对象的方法作为方法名表示构造方法 59 60 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 nCostofshipping 0 1 C title Dispatcher ShippingCost this 25 27 publicBookGetHeavierBook BookaBook 28 29 if weight aBook GetWeight 30 returnthis 31 else32 returnaBook 33 34 区别形式参数 本地变量与实例变量 this的作用1 61 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 作为一个参数将当前对象的引用传递给另一个方法 将当前对象的引用返回给方法的调用者 62 只读成员 readonlymember 与常量成员 由const关键字声明 一样 只读成员也用于表示一个不变化的值 但是 赋值给常量的值必须在源代码中指定 如 constdecimalMassOfElectron 9 0E 28m 只读成员的值直到程序运行时才知道只读成员的值在一个构造函数中初始化 而且此后不能再修改 所以 常量成员在编译后程序的整个生存期内保持不变 而只读成员只在此对象的生存期内保持不变 常量成员的类型限于以下之一 byte sbyte short ushort int uint long float double decimal char bool enum string只读成员可以为任何类型 63 01 usingSystem 02 03 classAccount04 05 publicreadonlystringAccountNumber 06 07

温馨提示

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

评论

0/150

提交评论