1.语言类型

编译型语言:即将源程序全部编译成机器代码的可运行程序,然后可直接运行这个程序。依赖编译器,执行速度快,跨平台性差

解释型语言:解释一句执行一句,直至结束。需要解释环境,执行速度慢,跨平台性好。
C\C++是编译型语言。Java比较特殊,Java也需要编译,只不过将源程序编译成中间代码(Java Bytecode),即对应的.class文
件。程序运行时,jvm再把代码根据不同的cpu,不同的os,解释成相应的机器码。转化的机器码可以被cache,以提高重复执行的
效率。
2、指针

JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针
操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有
利于Java程序的安全。

3、继承

c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦
,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的
功能,又避免了c++中的多重继承实现方式带来的诸多不便。

Java采用了一种单根式的分级结构,因此所有对象都是从根类Object统一继承的。而在C++中,我们可在任何地方启动一个新的
继承树,所以最后往往看到包含了大量树的“一片森林”。在Java中,我们无论如何都只有一个分级结构。尽管这表面上看似乎
造成了限制,但由于我们知道每个对象肯定至少有一个Object接口,所以往往能获得更强大的能力。C++目前似乎是唯一没有强
制单根结构的唯一一种OO语言。

4、数据类型及类

Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。
对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全
局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。

5.内存管理

Java中没有“破坏器”(Destructor)。变量不存在“作用域”的问题。一个对象的“存在时间”是由对象的存在时间决定的,
并非由垃圾收集器决定。有个finalize()方法是每一个类的成员,它在某种程度上类似于C++的“破坏器”。但finalize()是由
垃圾收集器调用的,而且只负责释放“资源”(如打开的文件、套接字、端口、URL等等)。如需在一个特定的地点做某样事情
,必须创建一个特殊的方法,并调用它,不能依赖finalize()。而在另一方面,C++中的所有对象都会(或者说“应该”)破坏
,但并非Java中的所有对象都会被当作“垃圾”收集掉。由于Java不支持破坏器的概念,所以在必要的时候,必须谨慎地创建一
个清除方法。而且针对类内的基础类以及成员对象,需要明确调用所有清除方法。

Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个
类Read的对象,然后调用该对象的work方法: Read r=new Read(); r.work();语句Read r=new Read();在堆栈结构上建立
了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c++中必须由程序员释放内存资源,增加了程
序设计者的负担。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。Java里无用内存回收程序是以线
程方式在后台运行的,利用空闲时间工作。

6、多线程

Java内建了对多线程的支持。利用一个特殊的Thread类,我们可通过继承创建一个新线程(放弃了run()方法)。若将
synchronized(同步)关键字作为方法的一个类型限制符使用,相互排斥现象会在对象这一级发生。在任何给定的时间,只有一
个线程能使用一个对象的synchronized方法。在另一方面,一个synchronized方法进入以后,它首先会“锁定”对象,防止其他
任何synchronized方法再使用那个对象。只有退出了这个方法,才会将对象“解锁”。在线程之间,我们仍然要负责实现更复杂
的同步机制,方法是创建自己的“监视器”类。递归的synchronized方法可以正常运作。若线程的优先等级相同,则时间的“分
片”不能得到保证。

7、字符串

c和c++不支持字符串变量,在c和c++程序中使用'\0'终止符代表字符串的结束。java内建了字符串类,在Java中字符串是用类对
象(String和StringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:

(1)在整个系统中建立字符串和访问字符串元素的方法是一致的;

(2)字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;

(3)Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;

(4)可对字符串用“+”进行连接操作。

8、类型转换

在c和c++中有时出现数据类型的隐含转换,这就涉及了自动强制类转换问题。例如,在c++中可将一浮点值赋予整型变量,并去
掉其尾数。Java不支持c++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。

9、操作符重载

Java不支持操作符重载。操作符重载被认为是c++的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方
便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。

10、预处理功能

Java不支持预处理功能。c/c++在编译过程中都有一个预编译阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,
但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与c++预处理器的功能类似。