版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java 语言中对象的理解与应用Abstract:As the currentmainstream in programming ,the object-oriented method is important theoreticalsupport in the process of software development.It isimportant to thoroughly understand the concepts ofobjects and classes, and properly apply objects inprogramming.Focusing on the obj
2、ect in theobject-oriented programming, the paper elaborates onthe understandingof the object , the objectmanagementin the Java programming language , and how to applytheobject correctly.With the efficient language andpractical experience,the paper is of good referenceto the understanding and applica
3、tion of Javaobject-oriented programming.Keywords: java ; object ; oject oriented;Object-Oriented Programming1 引言( Introduction)面向对象是当前主流编程语言的共同的特征,如Java 、C#语言。面向对象涉及到软件开发的各个阶段,具体包括面向对象分析OOA、面向对象设计OOD、面向对象编程OOP,形成了完整的面向对象的软件工程理论、方法和工具1 。在学习面向对象编程语言时,首先学习的就是对象的概念,能够正确的理解对象和使用对象对于之后的面向对象特性学习具有很大帮助。本文从对
4、象与类的理解、对象的原理和对象的使用三个方面循序渐进阐述,较全面的介绍了关于对象概念、对象存储原理及在编程中正确使用对象的技巧等内容,内容对于理解面向对象思想和学习面向对象编程具有较大帮助。2 理解对象与类 ( Understandingobjectsand classes )掌握面向对象程序设计首先要正确理解面向对象思想,面向对象思想的核心是正确理解“万物皆对象”这句话。在编程时运用“万物皆对象”的思想是指:通过使用面向对象的方式,将现实世界中的实体看作为对象,对这些实体的特性进行描述,并分析出实体具有的功能或职责。描述实体特性的过程即为提取对象属性的过程,分析实体的功能或职责的过程即为提取
5、对象方法的过程,完整描述一个对象即从属性和方法两个层面,提取对象属性和方法的过程即为使用面向对象思想进行分析和抽象的过程。在把客观实体抽象为对象后,还要继续分析各对象之间的关系,最后将对象的抽象结果描述出来形成一段文本,此文本即为面向对象思想中的“类class ”。从以上过程可以发现,类是对象的属性、方法、对象之间关系的描述。对象是现实世界中可以描述的实体,是具体的; 类是对象的描述,是不具体的,在编程时类体现为一段代码文本。以下以驾驶员和汽车为例阐述类与对象的关系与区别。现实世界中汽车与驾驶员皆为生活中常见的实体。当我们看到一辆汽车时会自然联想到汽车的品牌、型号等属性信息,分析其职责(功能)
6、可以得出汽车可以行驶、停止。但汽车不会自己行驶或停止, 它需要驾驶员执行启动、 挂挡等操作,可以看出汽车与驾驶员二者是存在依赖关系的。分析驾驶员对象可以得出驾驶员具有驾驶证照号码、性别、年龄等属性信息,驾驶员具有“驾驶”能力。分析汽车对象可以得出汽车具有品牌、型号、价格等属性,汽车具有行驶和停止的功能。经过上述分析,可以抽象出汽车类和驾驶员类,以及两个类间的依赖关系,其类图如图 1 所示。经过对汽车与驾驶员两个对象的分析,继而再抽象出两个类可以看出,面向对象思想与人类的思维方式极为相似,对于初学者而言并不难入门,但对于一些较为抽象的场景而言初学者通常会感觉稍有压力。下面以开发一款简单人机猜数字
7、游戏为例继续理解对象与类的概念。人机猜数字游戏的规则为:机器随机生成一个数值,玩家输入猜的数字且每一局最多猜三次,若三次都未猜中则本局失败。游戏根据猜的数字位数分为三个级别, 1 位数为初级、 2 位数为中级、 3 位数为高级。根据游戏规则的描述可快速分析出本案例至少包括人类玩家对象和机器玩家对象。人类玩家对象具有玩家名称、当前游戏级别属性,功能职责为输入猜的数字。机器玩家对象职责为根据当前人类玩家的级别生成相应位数的随机数字。根据上述分析可以看到只有人类玩家和机器玩家对象还无法实现游戏功能,因为目前还没有控制游戏进度的对象和描述游戏级别信息的对象。因此,在进一步分析后抽象出游戏对象和级别对象
8、。游戏对象相当于裁判,可控制游戏的启动及停止、判断所猜数字是否正确和设置当前人类玩家的级别。游戏级别对象则用于保存级别的参数信息,包括级别名称、级别对应数字的位数。综上所述,本案例最后抽取出游戏类、机器玩家类、人类玩家类、游戏级别类。其中游戏类与机器玩家类、 人类玩家类具有关联关系, ?C 器玩家类与人类玩家类具有依赖关系,人类玩家类与游戏等级类具有关联性, 其类图如图2 所示。3 Java 对象管理 ( Javaobject management )Java 语言编写的程序运行在Java 虚拟机之上,基于此特点才实现了 Java 程序的平台无关性和良好的可移植性2 ,3 。基于虚拟机平台运行
9、的另一个好处是在编写程序时不再需要考虑C 或C+语言中的手动内存管理问题,Java虚拟机会自动进行内存的申请和释放。在Java虚拟机中,存放对象的区域是内存占用比例最高的,这个区域称为堆heap4,5。因此能够理解对象在堆中的存储原理对编写高效的Java程序具有很大帮助。学习 Java 对象管理的主要内容是学习对象的生命周期,即对象的创建、使用和销毁三个阶段。3.1对象创建创建一个 Java 对象需要经过三个过程分别为加载类文件、分配内存、对象初始化5 ,6 。( 1)加载类文件:类是对对象的描述,在使用new 关键字创建对象时,虚拟机会先检查对应的类文件是否已经被加载,若未加载则会先加载类文
10、件到虚拟机中。Java 语言提供了多种类加载器classloader用于加载类文件 ( .class文件)到虚拟机中6 , 7 ,分别包括:a. 启动加载器: 最顶层的类加载器, 用于加载核心类库,如 java 语言提供的 rt.jar 等;b. 扩展类加载器:用于加载Java 目录下 ext 目录中的所有类库文件;c. 系统类加载器:负责加载应用程序classpath目录下所有类文件,此目录下类文件即为开发者自主编写的程序文件8 。( 2)分配内存:当类文件加载完后,对象在创建时需使用的初始内存大小就确定了。虚拟机在堆空间中划分出相应大小的存储空间。当前虚拟机在内存分配方法上采用指针碰撞法或
11、空闲列表法。“指针碰撞”法假设Java 堆中的内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放一个指针作为分界点。当需要分配内存时只需要把指针向空闲内存方向移动对象大小相等的距离即可。如果Java 堆中的内存并不规整,那么虚拟机需要维护一个列表用来记录哪些内存块可用。当需要分配内存时从列表中找出一个足够大的空间划分给对象实例,这就是“空闲列表”。( 3)对象初始化:虚拟机在对象内存分配完成后会给对象内部的属性分配初始值,此初始值如果没有手动设置则会被设置为数据类型默认初始值(例如 int 数据类型的初始值为 0)。最后调用类的构造方法完成对象初始化操作。3.2对象使用当
12、创建好对象后,需要通过引用方式来访问使用对象,常见的有两种方式,第一种是句柄,第二种是直接指针。( 1)句柄Java 堆中专门划分一部分内存作为句柄池,Java 栈中的引用存储的是对象的句柄地址,而句柄地址存储了对象实例数据与数据类型各自的具体地址信息。使用句柄的好处就是引用中存储的是固定的句柄地址,在对象被移动(垃圾收集时移动对象)时只会改变句柄中实例数据指针,而引用不需要更改。( 2)直接指针直接指针就是Java 栈中的引用直接存储对象的内存地址。使用直接指针最大的好处就是访问速度快,它节省了一次指针定位的时间开销。 Sun 的 Hot Spot 虚拟机使用的直接指针访问对象。( 3)对象
13、销毁对象的销毁回收由虚拟机负责执行,虚拟机判断一个对象是否可以被回收的算法包括引用计数法和根集算法。引用计数法为虚拟机内部为每个对象保存一个引用数量,当一个对象的引用数量为 0 时,则虚拟机会在下次垃圾回收时将此对象回收。由于引用计数算法无法解决对象之间引用闭环问题,因此出现了根集算法。根集算法原理是从 GCRoot(如一个静态变量)开始遍历引用关系,最后对于无法被遍历到的对象则会被回收 9 , 10 。4 对象的正确使用(Proper use of object)掌握 Java 虚拟机内部原理可有效帮助开发人员编写出高效的 Java 程序,但虚拟机内部原理的复杂性导致学习成本较高、入门较难。
14、因此对于初学者而言可以边学习边参考一些最佳实践,从而写出高质量Java 代码。在编码时正确使用对象主要包括以下几点:4.1尽量复用对象,不重复创建重复创建对象将导致内存占用增大,浪费内存空间。解决方法是重用已创建的对象和通过代码方式限制避免创建重复对象。( 1)使用单例模式。单例模式的作用是确保一个类只能创建出一个对象。实现上主要为:a. 显示声明私有构造方法,禁止使用者使用new 关键字创建对象;b. 在类中创建一个自身类型的对象,并将其定义为私有的和静态的,此变量即为供外部使用的唯一的对象;c. 定义一个全局方法,此方法向外部提供唯一的实例变量。( 2)重用对象。适当使用 new 关键字,
15、在创建完一个对象后,后期考虑不再创建新对象,而是将之前创建对象内部存储数据更新以供下次使用。例如字符串变量,虚拟机对于字符串单独设置了常量池进行存储, 因此对于代码 Strings=hello ”和 String s=new String(“ hello ”)而言,前者的效率更高。4.2及时清空过期对象虽然 Java 虚拟机提供了自动化内存管理,实现了自动垃圾回收,但是为了提高程序运行效率,当在代码中某对象不再使用时, 应手动设置对象值为null ,这样在下次垃圾回收时此对象即可被回收。例如在当编写数据访问代码时,对于 Connection 对象的释放即应在使用后立即清除引用,正确写法如下。Connection conn=null ; / 创建对象,默认值为空 tryconn=DriverManager.getConnection ( url ,username,pwd); /初始化 conn?/ .finally if (null ! =conn) tryconn.close();conn=null ;catch ( Exceptione) ; / 使用后立即清除引用5 结论( Conclusion )理解面向对象思想的核
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动技术教学设计三年级修改版
- 汉字闻课件教学课件
- 二手车销售合同范本
- 个人卖房协议模板
- 企业贷款合同范本电子行业
- 上海个人租房合同-家具齐全
- 产品责任一次性赔偿协议
- 人力资源董事聘任协议
- 互联网运营专员劳动合同
- 二手车交易抵押合同模板
- 珍爱生命主题班会
- 陈皮仓储合同模板例子
- 2024年安全生产月全国安全生产知识竞赛题库及答案(共六套)
- 2024-2025学年沪教版小学四年级上学期期中英语试卷及解答参考
- DB23T 3844-2024煤矿地区地震(矿震)监测台网技术要求
- 第7课《回忆我的母亲》课件-2024-2025学年统编版语文八年级上册
- 《阿凡达》电影赏析
- DB42-T 2286-2024 地铁冷却塔卫生管理规范
- 合作伙伴合同协议书范文5份
- 小学生主题班会《追梦奥运+做大家少年》(课件)
- 公安机关人民警察高级执法资格考题及解析
评论
0/150
提交评论