1. 全局变量

在Java语言程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用的、静态的变量来实现一个全局变量。例如:class GlobalVar {public static global_var;}在类GlobalVar中定义变量global_var为public static(公用、静态),使得其他类可以访问和修改该变量。

Java语言对全局变量进行了更好的封装;而在C及C++语言中,依赖于不加封装的全局变量常常造成系统的崩溃。

2. goto语句

Java语言不支持C及C++语言中的goto语句,而是通过例外处理语句try, catch, finally等代替C++语言中用goto语句处理遇到错误时跳转的情况,使程序更可读且更结构化。

3. 指针

Java语言不支持C及C++语言中的goto语句,因为由指针所进行的内存地址操作会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型的转换后,可以访问一个C++语言中的私有成员,从而破坏安全性,造成系统崩溃。

Java语言对指针进行完全的控制,程序员不能直接进行任何指针操作,例如,把整数转化为指针或者通过指针释放某一内存地址等。同时,数组作为类在Java语言中实现,很好地解决了数组访问越界这一C及C++语言中不做检查的错误。

4. 内存管理

在C语言中,程序员通过库函数malloc()和free()来分配和释放内存,C++语言中通过运算符new和delete来分配和释放内存;再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。

而在Java语言中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过new得到对象的处理权,而实际分配给对象的内存可能随程序的运行而改变,Java运行系统对此自动地进行管理并且进行垃圾(无用内存)收集,有效地防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。

5. 数据类型的支持

在C及C++语言中,对于不同的平台,编译器对于简单的数据类型如int与float等分配不同长度的字节数。

但在Java语言中,对于这些数据类型总是分配固定长度的位数,这就保证了Java语言的平台无关性。

6. 类型转换

在C及C++语言中,可以通过指针进行任意的类型转换,常常带来不安全性。

而在Java语言中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。

7. 头文件

在C及C++语言中,用头文件来声明类的原型以及全局变量、库函数等,在大的系统中维护这些头文件是很困难的。

Java语言不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。同时,Java语言中用import语句来与其他类进行通信,以便使用它们的方法。

8. 结构体和联合体

在C及C++语言中,结构体和联合体中所有成员均为公有,这就带来了安全性问题。Java语言中不包含结构体和联合体,所有的内容都封装在类中。

9. 宏定义

在C及C++语言中,用宏定义来实现的代码给程序的可读性带来了困难。Java语言不支持宏,它通过关键字final来声明一个常量,以实现宏定义中广泛使用的常量定义。