




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章初始化与清除,随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。,学习目标:用构造器确保初始化方法重载默认构造器This清理成员初始化构造器初始化数组初始化,初始化和清理(cleanup)正式涉及安全的两个问题。C+引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法。Java中也采用了构造器,并额外提供了“垃圾回收器”。对于不再使用的内存资源,垃圾回收器能自动将其释放。,5.1用构造器确保初始化,一个带有构造器的简单类/:initialization/SimpleConstructor.java/DemostrationofasimpleconstructorclassRockRock()/ThisistheconstructorSystem.out.print(Rock);publicclassSimpleConstructorpublicstaticvoidmain(Stringargs)for(inti=0;i10;i+)newRock();,注意:由于构造器的名称必须与类名完全相同,所以“每个方法首字母小写”的编码风格并不适用于构造器。,/:initialization/SimpleConstructor2.java/Constructorscanhavearguments.classRock2Rock2(inti)System.out.print(Rock+i+);publicclassSimpleConstructor2publicstaticvoidmain(Stringargs)for(inti=0;i8;i+)newRock2(i);,不接受任何参数的构造器叫做默认构造器(无参构造器),但是和其他方法一样,构造器也能带有形式参数,以便指定如何创建对象。,构造器是一种特殊的方法,因为它没有返回值。这与返回值为空(void)明显不同,对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西。构造器则不会返回任何东西,你别无选择。,5.2方法重载,在日常生活中,相同的词可以表达多种不同的含义它们被重载了。特别是含义之间的差别很小时,这种方式十分有用。大多数人类语言具有很强的冗余性,即使漏掉了几个词,仍然可以推断出含义,不需要对每个概念都使用不同的词汇。在Java里,构造器是强制重载方法名的另一个原因。既然构造器的名字已经由类名所决定,就只能有一个构造器名。那么要想用多种方式创建一个对象该怎么办呢?假设你要创建一个类,既可以用标准方式进行初始化,也可以从文件里读取信息来初始化。这就需要两个构造器:一个是默认构造器,另一个取字符串作为形式参数该字符串表示初始化对象所需要的文件名称。由于都是构造器,所以他们必须有相同的名字,即类名。为了让方法名相同而形式参数不同的构造器同时存在,必须用到方法重载。同时,尽管方法重载是构造器所必须的,但它亦可应用于其他方法,且用法同样方便。例:示范重载的构造器和重载的方法Overloading.java,5.2.1区分重载方法,要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?其实规则很简单:每个重载的方法都必须有一个独一无二的参数类型列表。甚至参数顺序的不同也足以区分两个方法。不过,一般情况下别这么做,因为这会使代码难以维护。如:OverloadingOrder.java,5.2.2以返回值区分重载方法,能否用方法的返回值来区分重载方法呢?voidf()intf()return1;只要编译器可以根据语境明确判断出语义,比如在intx=f()中,那么的确可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果,这是你可能会调用方法而忽略其返回值。所以,如果像下面这样调用方法:f();此时java如何才能判断该调用哪一个f()呢?别人该如何理解这种代码呢?因此,根据方法的返回值来区分重载方法是行不通的。,5.3默认构造器,默认构造器(又名“无参”构造器)是没有形式参数的它的作用是创建一个“默认对象”。如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器。classBirdpublicclassDefaultConstructorpublicstaticvoidmain(Stringargs)Birdb=newBird();表达式newBird()行创建了一个新对象,并调用其默认构造器但是,如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。,/:initialization/NoSynthesis.javaclassBird2Bird2(inti)Bird2(doubled)publicclassNoSysthesispublicstaticvoidmain(Stringargs)/!Bird2b=newBird2();Bird2b2=newBird2(1);Bird2b3=newBird2(1.0);,5.4this关键字,如果有同一类型的两个对象,分别是a和b。如何才能让两个对象都能调用peel()方法呢:classBananavoidpeel(inti)/*.*/publicclassBananaPeelpublicstaticvoidmain(Stringargs)Bananaa=newBanana(),b=newBanana();a.peel(1);b.peel(2);,为了能用简便、面向对象的语法来编写代码即“发送消息给对象”,编译器做了一些幕后工作。它暗自把“所操作对象的引用”作为第一个参数传递给Peel()。所以上述两个方法的调用就变成了这样:Banana.peel(a,1);Banana.peel(b,2);这是内部的表示形式,我们并不能这样书写代码,并试图通过编译。假设你希望在方法的内部获得对当前对象的引用,由于这个引用是由编译器“偷偷”传入的,所以没有标示符可用。但是,为此有个专门的关键字:this。,This关键字只能在方法的内部使用,表示对“调用方法的那个对象”的引用。但要注意如果在方法内部调用同一个类中的另一个方法,就不必使用this,直接调用即可。publicclassApricotvoidpick()/*/voidpit()pick();/*/在pit()内部,你可以写this.pit(),但无此必要。只有当需要明确指出对当前对象的引用时,才需要使用this关键字。如:Leaf.javathis对于将当前对象传递给其他方法也很有用。如:PassingThis.java,在构造器中调用构造器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游民宿退房协议范本及清洁维护标准
- 理发店员工招聘与职业规划辅导劳务合作合同
- 跨学科研究生委托培养与技术转移转化合同范本
- 产业园区物业合同终止及产业创新服务协议
- 建筑工程合同审计与财务管理要点解析
- 企业核心技术人员竞业禁止补偿标准合同范本
- 离婚后共同财产分割与同居期间居住权益协议范本
- 签订国际贸易合同时的汇率风险管理与法律应对
- 离婚财产分割补充协议涉及遗产继承权与分割调整
- 通信工程施工合同签订所需的技术标准及通信保障协议
- 监控维修培训
- 中医基础理论经络培训课件
- 亚麻籽油在营养保健领域的应用考核试卷
- 《雷军的管理哲学》课件
- 尿液标本临床微生物实验室检验操作指南
- 电影《白日梦想家》课件
- 正常人体结构课程标准
- 员工上下班交通安全培训课件
- GB/T 15843.2-2024网络安全技术实体鉴别第2部分:采用鉴别式加密的机制
- 初中语文八年级上册13 唐诗五首 《钱塘湖春行》活动式公开课一等奖创新教学设计
- 职业技能大赛-电工职业技能竞赛理论题库(附参考答案)
评论
0/150
提交评论