快速业务通道

教您如何使用EclipseME开发J2ME程序(1) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

Java与C++语言在作用域上的差异浅析

时间:2010-12-23

Java与C++的编程思想虽然有一定的共同性,但是在很多方面仍然存在着不同 。如两者在作用域上仍然存在着很大的差异。下面笔者就分析一下这两门语言在 作用域上的差异,这里所提到的作用域包括变量作用域和对象作用域。

差异一:变量作用域的不同

如下面这段程序代码是符合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++语言在作用域上的差异浅析(2)

时间:2010-12-23

差异二:对象作用域的差异

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对象。另外笔者不厌其烦的再强调一遍 ,默认情况下脱离了某个作用域之后,对象就失去了引用无法访问。如果要在作 用域再访问这个对象的时候,则需要及时把这个引用复制或者传递出来。否则的 话,作用域外的代码是无法再操作这个对象。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号