以文本方式查看主题

-  曙海教育集团论坛  (http://sun4.cn/bbs/index.asp)
--  C++语言开发  (http://sun4.cn/bbs/list.asp?boardid=63)
----  C++与Java语言及其开发工具 (2)  (http://sun4.cn/bbs/dispbbs.asp?boardid=63&id=2440)

--  作者:wangxinxin
--  发布时间:2010-12-10 15:13:24
--  C++与Java语言及其开发工具 (2)

在Java中,对变量和方法的访问控制是通过访问修饰符来实现的。Java定义了4种
访问级别:公共(public)、受保护(protected)、私有(private)和友好(friendly)。
公共类型的方法及变量可从任意类进行访问;受保护类型的方法及变量只能从当前
类及其子类访问;私有类型的方法及变量则只能从当前类访问。如果未给出这三种
类型中任意一种的显式说明 ,表明相应的方法或变量属于"友好"类型,从而可由属
于同一"包"(package)内的所有类进行访问。在Java内,"包"是一个单独的编译单
位,它是具有某种共性的类所组成的集合。通过定义包这个单位,可实现相关对象
之间的相互访问,同时把这些对象与包之外的其它对象隔离。 

面向对象的编程机制是Java的一个极为重要的方面。在Java内,如果不创建新类,
就无法创建应用程序。Java定义了一个特殊的超类Object,用户创建的类都是Object
的子类。J ava程序既可在解释器内也可在浏览器内运行,但无论采用哪种方式,都
必须先创建一个类实例,然后才能提交运行。此外,利用继承机制,用户还可充分利
用各种超类提供的功能。 

2. 与C++的差别 

尽管C++程序员可以相对容易地掌握Java编程,但他们仍然必须克服从C++带来的一
些旧习惯。Java取消了C++中的如下特性或功能: 

·结构或指针 ·#define语句 

·指针 ·多重继承 

·独立的函数 ·GOTO语句 

·操作符重载 ·自动类型转换 

Java不支持结构和指针,而且取消了C++中的#define或#typedef语句和头文件。 

事实上,constant和typedef这两条语句包含了#define语句的作用。现在,结构和
联合已经被Java的类所代替。删除这些特性的原因是:由于其希望维持与C语言的
向后兼容性,C ++的语言规范包含了大量冗余。比如,类实际上就已经包括了结构
和联合的作用,因此这两种数据结构完全可以取消。关于#define语句,Java语言规
范的制订者认为:尽管该语句的出发点是为了增强程序的可读性,但实际效果却恰
恰相反,它常常导致难读的代码,故应该予以取消。Java不再支持独立函数,因此任
何函数都必须封装到某个类中。由于人们普遍认为, C++所用的超类是非常不稳定
的,因此Java抛弃了C++中的多继承并代之以接口。Java的接口指的是,在别的类看
来一个类所能实现的方法。它所显示的只是一个类的方法或常量和变量 ,而不是
这个类的全部结构。 

最后,Java还取消了C++中的GOTO语句、操作符重载、自动类型转换及指针数据类
型。 GOTO语句引起的争议已经有很多年了,可一直阴魂不散,这跟某些程序员对该
语句一直情有独钟有关。C++仍然支持数据类型的自动转换,但Java要求编程人员
显式实现数据类型之间的转换。自动数据类型转换使得两个数据类型互不兼容的
变量可以相互赋值,而不需要给出显式说明。这有时会导致一些问题,其中最常见
的是精确度损失。比方说,如果把一个带符号的32位整数赋给一个无符号整数,则
所有的结果均为正数。Java的设计者们认为这很容易引起程序错误,从而决定不支
持这种转换方式。 

某些C和C++程序员也许会觉得遗憾,因为Java不再支持他们非常愿意使用的指针类
型。但我们都知道,指针是调试程序时使人最感头痛的地方之一。Java的设计者们
认为,由于Ja va取消结构类型并且把数组封装到了对象里面,指针已经不再有用武
之地。但有些C和C++高级编程人员可能仍然需要一段时间才能走出指针的阴影。
因为指针的用法尽管很难掌握,可一旦掌握了其使用技巧,就会让人感到它的功能
的确非常强大。作为一种面向分布式计算环境的编程语言,Java放弃对指针的支持
是非常顺理成章的,因为只有这样,才可能产生一种稳可能产生一种稳定、高效而
且安全的代码。 

3. 内存管理和线索 

Java语言带来的好处还在于其自动内存管理和线索控制。在C和C++中,内存必须用
free、 malloc和其它许多内存管理标准库管理。因此,系统要了解何时分配、释
放内存并且跟踪所有的内存使用情况是非常困难的。如果要在C和C++中实现线索
功能,必须使用一个可对线索进行各种控制的类库。而在Java中,尽管线索仍然需
要类的支持,但系统却在语言级包括了线索同步机制。 

Java具有内嵌的内存管理程序。一旦创建了一个对象,Java的运行系统就开始跟踪
这个对象,直到不再需要跟踪该对象的所有引用为止。当某个对象不存在相应的引
用时,Java把这个对象放到一个用于垃圾搜集的栈内。为在性能损失最小的情况下
提供自动垃圾搜集机制,这个垃圾搜集程序将在后台或作为低优先级线索运行。这
样,Java的垃圾搜集软件将在前台线索的执行期间抽空执行,或者在系统显式提出
需要使用那些被已经死亡的类所占用的内存空间时执行。 

从后台内存管理程序可以很明显地看出,多线索的确可以增强Java环境的相对性能。
鉴于多线索的重要性,Java在语言级提供了线索同步机制,使多线索成为一种内嵌
特性。Java 语言支持针对方法的同步修饰符,并通过该修饰符来指明线索的运行
顺序。此外,Java还能控制方法与实例变量的相互作用机制,确保了各方法之间在
修改数据时不会产生冲突。 

Java的内存管理和线索支持还具有使Java语言简单化的作用。正是由于把内存管
理任务嵌入到了Java环境,Java语言才可以取消指针数据类型、malloc和free函
数。这样,程序员就可以把更多的时间化在真正的编程工作上,而不是去跟踪调试
与内存使用相关的程序错误。正是由于其多线索机制,Java才可以为一个可移植
的解释系统提供较高的性能。 

Java语言非常适合于异构网络系统(尤其是Internet)上的高性能、分布式计算环
境。虽然个人机系统未必可以看作是高性能的,但目前的个人机已经具有相当好
的性能。再者, 目前几乎所有操作系统均提供了各种高级特性,如内嵌的联网功
能和真正的多任务、多线索支持等。然而在几年前,这些功能还只有昂贵的UNIX
工作站才能提供。有了这些软硬件基础 ,加上Java的简单易学及面向对象特性,
未来的程序员将可以在联入网络的个人机上开发适合于在各种硬件和软件平台上
发布的高级"内容"。