Java与C++都是面向对象的语言,都使用了面向对象的思想(封装、继承、多态),由于面向对象由许多非常好的特性(继承、组合等),因此二者有很好的可重用性。
主要不同点:
1、Java为解释性语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码,可直接执行。因此Java的执行速度比C/C++慢,但Java能够跨平台执行,C/C++不能。
2、Java是纯面向对象语言,所有代码(包括函数、变量)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。此外,Java语言中不存在全局变量或者全局函数,而C++兼具面向过程和面向对象编程的特点,可以定义全局变量和全局函数。
3、与C/C++语言相比,Java语言中没有指针的概念,这有效防止了C/C++语言中操作指针可能引起的系统问题,从而使程序变得更加安全。
4、与C++语言相比,Java语言不支持多重继承,但是Java语言引入了接口的概念,可以同时实现多个接口。由于接口也有多态特性,因此Java语言中可以通过实现多个接口来实现与C++语言中多重继承类似的目的。
5、在C++语言中,需要开发人员去管理内存的分配(包括申请和释放),而Java语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显示地管理内存的分配。在C++语言中,通常会把释放资源的代码放到析构函数中,Java语言中虽然没有析构函数,但却引入了一个finalize()方法,当垃圾回收器要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时被释放。
其他不同点:
1>C++语言支持运算符重载;Java不支持运算符重载。
2>C++语言支持预处理;Java没有预处理器,虽然不支持与处理功能(包括头文件、宏定义等),但它提供的import机制与C++的预处理器功能类似。
3>C++支持默认函数参数;Java不支持默认函数参数。
4>C/C++支持goto语句;Java不提供goto语句,但Java中的goto是保留关键字。
5>C/C++支持自动强制类型转换,这会导致程序的不安全;Java不支持自动强制类型转换,必须由开发人员显式地进行强制类型转换。
6>C/C++中,结构和联合的所有成员均为公有,这往往会导致安全性问题的发生;而Java根本就不包含结构和联合,所有内容都封装在类里面。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
1>Java具有平台无关性,即对每种数据类型都分配固定长度的空间,例如int型总是占据32位;而C/C++不然,同一个数据类型在不同平台上会分配不同的字节数。
2>Java提供对注释文档的内建支持,所以源码文件也可以包含它们自己的文档。通过一个单独的程序,这些文档可以提取出来,并重新格式化为HTML。
3>Java包含了一些标准库,用于完成特定的任务,同时这些库简单易用,能够大大缩短开发周期。例如,Java提供了用于访问数据库的JDBC库,用于实现分布式对象的RMI等标注库。C++则依靠一些非标准的、由其他厂商提供的库。
Java与C++的异同点总结 - CSDN博客 http://blog.csdn.net/shennongzhaizhu/article/details/51897060
变量和类型
1.1 Java没有无符号整数。(无符号右移在Java中强制用三个右尖括号表示)。
1.2 Java有内置类型String,而C++没有。C++的std::string是可变的,类似于Java的StringBuffer。
1.3 C++的整型随机器的位数而变化,但是Java不会。(C++的int在16位机器上16位,32位级以上为32位。long在32位及以下为32位,64位机器上为64位。)
1.4 Java字符串在内存中以Unicode存储,C++与源码的编码相同。
1.5 Java中不存在指针。Java的引用是功能弱化的指针,只能做“调用所指对象的方法”的操作。
1.6 Java的Stream对象(除了PrintStream)功能较单一,只能按字节读写,需要Reader或者Writer的辅助。C++的任何流都可以按字节、字符串、整形的方式读或者写。
1.7 Java是少数几种不能用双等号比较字符串的语言。
1.8 Java的泛型参数不允许是基元类型。(坑)
1.9 Java强制局部变量初始化。
2. 类机制
2.1 Java是完全面向对象的,所有方法都必须写在类中。
2.2 Java强制异常规约。
2.3 Java单根继承,所有对象都继承自Object。并且提供接口机制。
2.4 Java在覆盖时默认为虚函数。
2.5 Java没有默认参数。
2.6 Java中没有运算符重载,和转换函数。
2.7 Java无引用传值。(标准库中一般用Boxing代替。)
2.8 Java没有Struct或者Union。
2.9 Java可以委托构造,而C++14才加入这个特性。
2.10 Java的对象(包括数组)存放于堆上,用new实例化。C++可以选择存放于栈上或者堆上。
2.11 Java可以定义abstract类和final类,即必须被继承,或者无法被继承。C++直到C++1?才支持这个特性。
2.12 Java强制一个文件中只能有一个public的类/接口,并且文件路径强制为它的包名和类名。
3. 其它语言特性
3.1 Java没有delete运算符,由于有gc托管,无需delete。
3.2 Java没有typedef,以及任何和它作用相同的语法。
3.3 Java没有宏。(另一方面这也是种好处,宏是另一个万恶之源)。
3.4 Java使用点运算符做C++用::运算符的事情。而Java的::运算符可以将一个静态函数或者带着对象的动态函数变成一个闭包(Java8)。
3.5 Java的lambda表达式在Java8中被引入,C++是从C++11。
3.6 C++11中引入了range循环,Java是从Java5。
3.7 C++在查找名字时只查找当前代码文件中那行以上的部分。而Java的查找范围是整个项目。(这就是为什么C++需要include而Java不用。)
3.8 Java的标准库比较丰富(尤其是带GUI)。C++如果要实现相同的功能,除了第三方库之外,可以调用系统的api。
3.9 Java在8之前,switch不支持字符串。C++从11起支持短字符串的Switch(长度4字节之内,会映射成int来判断)。
3.10 由于Java是半编译半解释的,运行速度略慢。jvm启动速度不是一般的慢。
我是一个写了几年c++的程序员。Java没有系统学过,略知一二。
我简单说一些感触吧。
相对而言,C++更难学,Java易学。 C++本身就是C的超集,在面向过程之上,还有面向对象的概念。更甚的是,它的面向对象比Java还要复杂。 Java中的多继承是无法多继承多个实体的,最多只有要给实体,其他用interface来间接实现。C++的多继承是可以直接继承多个实体,还有各种稀奇古怪的菱形继承。
C++是编译型语言,Java更像是半编译型语言
C++中的一个类,在被编译后,就是一堆指令集,运行的时候,这个类本身不会有任何对象的东东。而Java的类,在运行的时候,是有类对象的概念。 什么叫类对象,即类自身就是一个对象。 类对象这种东西的存在无疑给程序带来的不少的灵活性。 例如运行时候的类型识别,运行时候查看一个类的函数列表,甚至于动态修改一个类的函数,还有通过反射的机制,给出函数名就可以取得相应的函数指针,等等的,都可以通过类对象来实现。 所以,我说它更像是半编译型的语言。有一定的动态性,但又做不到Python这类的脚本语言那样的动态性。
C++对象是对象,指针是指针。 Java一切皆是指针。
说这句话的时候,我不能完全确定“Java一切是指针”的正确性,因为我并确认Java中对于int这种是否是以指针方式来处理的,现在我懒了,也不太追究它的细节,不过可以暂时这样认为。 当C++传递一个大对象的时候,那可能就是一个大块内存的copy,而对于Java,你不用担心,它传递就是一个引用而已。 因此,在C++中为了减少copy,我们一般传递指针或者引用。
其实还有很多,我并不想写了。。。
Java采用了C及C++的语法格式,对于学习过C及C++的程序设计者来说,学习Java将有可能很轻松。但是,如果仔细检查Java语言的许多细节,就会发现Java取消了不少C及C++的特性,并且加入了一些新的特性。这些差异包括:
不再有指针(Pointer)的概念。
这是Java和C/C++在语法上的主要区别之一。在C及C++中,指针的灵活运用将会给程序设计带来极大的便利,但是其灵活性也成为了导致程序不稳定的一个主要因素。配合C及C++的内存管理策略,编程人员必须亲自跟踪自己向系统申请到的内存,最后确认交还给系统。并且在使用指针时,要随时注意是否超过合法的内存空间,造成Segmentation Fault或General Protection Fault这样的问题。
Java提供了一种引用(Reference)类型用来替代指针,通过引用去访问申请到的内存空间,可以确保不会访问不属于自己的内存空间,同时,程序的执行系统也可以动态地做内存垃圾回收工作,将那些被取消引用的内存空间回收给系统使用。这种动态内存分配机制,通过牺牲一定的灵活性,保证了内存分配一定程度上的安全性。
不再有函数(Function)的概念。
Java编程语言中,取消了结构化语言中最重要的部分——函数。在面向对象程序设计的概念里,对象的数据才是真正的主题,而处理对象数据的方法则必须依附在对象内才有意义。因此函数概念完全是不必要的。这强化了面向对象的开发策略。
不再使用structure、union和typedef.
事实上,在C++中就可以去掉C中的structure和union等对复杂数据的自定义结构类型了,因为类(Class)的定义方式完全可以做到这项功能。而typedef的功能也可以由类来实现。虽然C++这样的设计是为了和C兼容,但是这些毕竟是多余的语言特点,在Java语言中便被抛弃了。
不再有类的多重继承(Multiple Inheritance)。
在C++中,多重继承是一项很强的功能,但也是较难掌握的。取消多重继承降低了Java语言的功能,但它使Java看起来更为简洁。同时,Java也提供了接口(Interface)的方式,可以实现部分多重继承的作用。和多重继承的不同之处在于接口并不会定义类方法的内容,以及类中的数据。
不再有操作符重载(Operator Overloading)。
操作符重载被看作是C++的一个特色。在C++中,利用操作符重载,程序设计者通过对现有运算符赋予自己的定义,可以使程序看起来更为自然。但是,如果使用不当,也会使整个程序的可读性大受影响。同时,这一功能的存在也并非必要,程序设计者可以定义类中的方法来达到同样的目的。
取消了自动类型转换。
Java是一种强类型检查的编程语言,对于诸如浮点型变量赋值给整型变量这样的情况而言,在C++的语法中是允许的,最多只是在编译时给出警告信息。但是,在Java中,除非写明强制类型转换,否则编译无法通过。
不再有预处理器(preprocessor)功能。
利用C/C++中提供的#define、#include等预处理指令,厉害的程序设计人员可以自己开发一套只有自己才看得懂的宏指令集。从软件工程的角度上看,这对团队开发软件和整个软件的维护都是十分不利的。同时,预编译后的程序代码和程序设计者看到的程序代码是不同的。如果宏指令集有错,编译器产生的错误信息将不会是编程人员所预期的,这增加了程序调试的难度。
取消了goto语句。
在C++中,goto语句已经不被建议使用了,保留goto只是为了和C语法兼容。在Java中goto语句被完全抛弃了,与此同时,Java又扩大了break语句和continue语句的功能,通过使用break和continue,程序流程被允许在多层循环中跳转。
可以这样说,Java编程语言是一种简洁而有效的纯面向对象的编程语言。而C++语言因为要与C兼容(C++语言是作为C语言的一个超集被定义的),所以在面向对象的特性方面不如Java好。
区别就是语法上的区别,java虽然没有指针,但可以实现指针这样的效果。没有指针也是提高了程序的安全性和稳定性。