提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-08-30 11:58:03.000|阅读 516 次
概述:Java语言与C++语言是目前最流行的编程语言。两者的编程思想虽然有一定的共同性,但是在很多方面仍然存在着比较大的差异。如两者在作用域上仍然存在着很大的差异。下面笔者就分析一下这两门语言在作用域上的差异,以帮助大家进一步认识Java语言的优势。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
Java语言与C++语言是目前最流行的编程语言。两者的编程思想虽然有一定的共同性,但是在很多方面仍然存在着比较大的差异。如两者在作用域上仍然存在着很大的差异。下面笔者就分析一下这两门语言在作用域上的差异,以帮助大家进一步认识Java语言的优势。
差异一:变量作用域的不同
如下图,这段程序代码是符合C++语言的语法要求的。其可以在C语言下正常运行。但是其在Java语言平台下编译的时候,就会被告知有错误。其格式、关键字上面都没有错误。那么错误到底是这么呢?这就关系到变量的作用域。
{
float y=3.15 { float y=3.15 } } |
作用域就决定了其定义的变量名的可见性与生命周期。在C++语言(包括其衍生出来的其他语言)与Java语言中,都是用一定花括号来代表一个作用域的。如上面的代码,就表示有两个作用域。外面一对花括号代表一级作用域;里面一对花括号代表二级作用域,依次类推。通常情况下,一级作用域中定义的变量,对其下级作用率都是有效的。也就是说,其下级作用域可以直接引用上级作用域中定义的变量。但是在二级作用域中,可以更改一级作用率中设置的变量值,不过这个更改只在二级作用域内部有效。如上面这个代码,在二级作用域中可以再定义一个y变量,重新赋值。注意,其实在二级作用域中定义的变量与一级作用域中定义的变量,虽然名字相同,但是他们不是同一个变量。如果此时在一级作用域外,有其他代码引用这个y变量的话,则其的值仍然是3.14,而不会是3.15。也就是说,在二级作用域中定义的变量,只在其内部有效。对于上级作用域是没有丝毫影响的。也就是说,在作用域中定义的变量只在其作用域内有效。出了其作用域外,其内部设置的变量就全部无效了。
这个作用域的设置其实Java语言与C++语言是类似的。但是在细节上Java语言又多了一条限制。如上表的代码所示,虽然在上面的代码中变量y在两个不同的作用域中定义,照理来说是两者是互不干涉,可以共存。但是在Java编译器中,是不允许有这种情况存在的。把上面这个代码在Java编译器中编译的话,编译器会通知程序开发人员,说这个变量y已经定义过。然后编译会以错误告终。虽然在C++语言中在不同级别的作用域中定义名字相同的变量是允许的,而在Java语言中则不行,这并不代表在变量的作用域上有所不同。其实从本质上来说,两者变量的作用域是相同的。只是对于Java语言来说,其又多加了一条限制。在Java语言中,即使作用域不同,其定义的变量名字也不能够相同。这主要是为了提高Java代码的可读性,防止混淆才定义了这条规则。
差异二:对象作用域的差异
Java语言与C++语言一样,都是面向对象的语言。不过两者在实现机制上有很大的不同。就拿对象的作用域来说,就有很大的差异。这也导致了两个面向对象的语言在实现细节上的巨大差异。
首先Java程序员需要明白的是,Java对象作用域与变量的作用域是不同的。如上面的分析,变量的作用域只在作用域内部有效。如在二级作用域内定义的变量,超出了二级作用域,那么就无效了。但是对象则不同,其可以存在于作用域之外。如现在在某个作用域内定义了一个name_full对象。当脱离这个作用域的时候,这个对象的引用是消失了。但是刚才创建的这个对象仍然实实在在的保存在内存中。在Java程序的运行过程中,只要通过传递或者复制对象引用的手段,那么在其他作用域内仍然可以访问这个对象。也就是说,只要我们有这个需要,那么在某个作用域内创建的对象其会一直存在并可以在作用域外的其他任何一个地方进行访问。当然前提是要通过复制或者传递等手段把对象引用传递到其他的作用域中。这就是Java对象与Java变量在作用域上最大的不同。
其次,Java对象与C++语言的作用域有很大的不同。其实C++语言中的对象跟变量的作用域到是很类似的。在C++语言中一旦使用完对象之后,就必须把这个对象销毁掉。说的确切一点,就是要在作用域内把使用完的对象所占的内存空间释放掉。否则的话,如果在作用于外部,由于已经失去了对这个对象的引用,为此这个对象就好像成为了太空中的一个人,无法再对其进行任何的操作,只要任其自生自灭。为此对于C++语言来说,程序员很难在脱离作用域外后,确保在需要调用对象时,仍然可以访问这个对象。这也正是C++语言开发过程中最让人头疼的问题。因为需要手工来销毁对象。万一对象所占用的内存空间没有别及时释放的话,那么对于应用程序的安全与性能都会产生很大的影响。
在Java程序中,这个作用域外的对象最终有两个去向。首先,可以通过复制或者传递,在作用域外部仍然可以访问这个对象。其次,就是销毁对象。不过我们不用通过代码来销毁这个以前创建的对象。因为在Java语言中有一种叫做垃圾回收器的处理机制,其可以用来动态监视New关键字创建的所有对象,并根据一定的规则来判断哪些对象不会再被引用。如果其判断某个对象不再被引用话,则会自动释放这些对象所占用的内存空间,以供其他新的对象所使用。我们程序开发人员只管创建对象即可,而不用去担心什么时候去销毁对象。为此,这就可以消除C++语言面临的内存溢出问题。这个内存溢出问题就是因为程序开发人员用完对象后忘记销毁所造成的。
由于在Java程序开发中,我们开发人员不用关心对象的销毁问题,为此可以更多的精力放在代码的优化上。而不像C++语言那样,要把这个对象销毁问题当作头件大事来对待。虽然如此,不过Java程序员也不能够掉以轻心。特别是当我们在离开某个作用域后还需要访问这个对象的时候,一定要记得通过复制或者传递等手段把对象引用传递给其他作用域。否则的话,即使这个对象没有消亡,还实际存储在内存中,但是也会因为缺少了引用而无法访问他们。为此在跨作用域引用对象的时候,这个引用的复制与传递千万不能够忘了。
如果不幸忘了的话,那么在作用域外的代码就无法再访问这个对象。不过这个对象在一定时候会被垃圾回收器回收了。被释放了的内存空间就可以被重复使用,从而防止内存溢出的问题发生。
总之,当Java程序员在开发应用程序的时候,这个Java对象与Java变量作用域的差异,以及Java对象与其他语言对象作用域的差异,一定要了然于胸。这有助于Java程序员能够更好的利用这个Java对象。另外笔者不厌其烦的再强调一遍,默认情况下脱离了某个作用域之后,对象就失去了引用无法访问。如果要在作用域再访问这个对象的时候,则需要及时把这个引用复制或者传递出来。否则的话,作用域外的代码是无法再操作这个对象。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢