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代码的可读性,防止混淆才定义了这条规则。