第1个回答 2018-11-23
C ++是面向对象编程(OOP)语言
Java是由Sun Microsystems开发的编程语言
Bjarne Stroustrup在Murray Hil的AT&T贝尔实验室开发了C ++。
Java语言最初称为OAK。最初,它是为处理设备和机顶盒而开发的。
类名和文件名之间没有严格的关系。在C ++中,头文件和实现文件用于特定的类。
严格的关系是强制执行的,例如PayRoll类的源代码必须在PayRoll.java中。
1.Java比C++程序可靠性更高。有人曾估计每50行C++程序中至少有一个BUG。姑且不去讨论这个数字是否夸张,但是任何一个C++程序员都不得不承认C++语言在提供强大的功能的同时也提高了程序含BUG的可能性。Java语言通过改变语言的特性大大提高了程序的可靠性。
2.Java语言不需要程序对内存进行分配和回收。Java丢弃了C++
中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,在Java语言中,内存的分配和回收都是自动进行的,程序员无须考虑内存碎片的问题。
3.Java语言中没有指针的概念,引入了真正的数组。不同于C++中利用指针实现的“伪数组”,Java引入了真正的数组,同时将容易造成麻烦的指针从语言中去掉,这将有利于防止在c++程序中常见的因为数组操作越界等指针操作而对系统数据进行非法读写带来的不安全问题。
4.Java用接口(Interface)技术取代C++程序中的多继承性。接口与多继承有同样的功能,但是省却了多继承在实现和维护上的复杂性。本回答被网友采纳
第2个回答 2018-11-23
1 多继承:Java中不使用多继承,而是用一个叫“Interface”的结构,Java中的接口与C++中的一个只有纯虚函数的类等价。但Java接口不是一个类。接口中声明的方法不能在接口中执行,而且一个Java接口不能有任何成员变量。所以对接口的多继承就不会导致被加到C++中的虚继承的问题。所以在Java中不需要虚继承,因为它不可能在多于一个路径中继承到相同的成员变量。Java中使用类聚合来替换多继承,特别是在Observer模式中,是一致的。
2 内存管理:Java使用垃圾收集机制,垃圾收集是一个内存管理scheme ,它在对内存块的所有引用都不存在后就自动的释放这个内存块。垃圾收集机制使得对特定种类的应用很容易编程,程序的设计者不需要考虑清除“dead”内存。C++中缺少这种机制,很多人为C++提供了garbage collectors ,有的是第三方软件,有的是在网上的共享软件。这些collectors很不完美,但方便了使用。
对于Java没有方法来使writer来手动的发现去管理内存。很明显,你不能写你自己的内存管理者,也不能在内存管理者控制的内存中构造对象。
原因:任何内存管理计划都允许程序有指针和对未使用空间的引用,这是违反特定的安全的。手动管理内存的任何形式,如holding on to dead pointers or references ,都会导致安全漏洞。在典型的Java环境中,安全是一个涉及到的严重的问题。Java applets经常在web浏览器中运行和被下载。用户可能不知道运行的applet,因为他们的浏览器是活动的。如果允许手动内存管理,不道德的人就可能发布包含不安全applet的web页。这些applet可能就被正在浏览的,没有防备的用户下载到了自己的系统中。一但下载了这些applet,就可以把私有信息返回给web页的作者。
在Java中缺少手动内存管理的问题?这使得Java在硬实时(a hard real time system)约束的系统中使用困难。当garbage collector运行时,这个问题是很难预测的。可以使用有意义的CPU时间来处理,必须建立一种方式,使得你要用的内存可靠而不会引起垃圾收集。在实时应用中使用任何Java库都可能导致垃圾收集,要注意。
3. Finalize
Java 中的finalize 方法大概对应于C++中的析构器。当一个对象被garbage collector收集了,它的finalize方法就被调用了。注意,在大多数情况下,finalize不是一个释放由对象持有的资源的好的位置。可能需要很长时间这个对象才好被garbage collector收集,这样,在finalize中它们释放的资源可能被持有很长时间。
导出类的finalize方法必须明确调用基类的finalize方法。如果忘记这样做,基类中的finalize方法就完全不会被调用。
4. ToString()
任何有toString方法的类,都是被用于特殊的上下文中,希望得到一个String 。在一个String的上下文中,对象的toString方法会自动的调用。对toString()方法的自动使用好像是自动转换C++系统的不成熟版本。这个特征使得String类有些地方比其它类特殊。我认为,对Java设计者,可以看作是使用一个一般的转换系统(如,一个方法模板)
5. Exceptions and finally
在C++中,当一个异常离开了一个方法的范围,被定位在堆栈的所有对象被回收,它们的析构器被调用。这样,如果你想释放一个资源或当一个异常发生时,清除什么。你必须把代码放到一个被定位到堆栈上的对象的析构器中。
这是人为的,错误倾向的,不方便的。而且从构造器和析构器中抛出异常是有问题的,这在C++中是难使用的问题。
在Java中,每个try块可以有一个finally语句,这样一个块退出的任何时间,不管退出的原因(try块执行结束或者异常抛出),finally语句中的代码都被执行。
这看起来比C++的机制要好,可以在finally语句中直接清除代码,而不是人为的把它们放到析构器中。而且,被清除的代码可以与被清楚的变量保持在相同的范围中。主要的不利方面是强迫应用程序员(1)知道被定位在块中的每个资源的释放协议(2)在finally块中要明确的处理所有的清除操作。
6. Threads
Java中线程的执行是最小的和优雅的。方法可以被从并发修改中保护的简单方式是简单的标志和严格的代码机制,在两个线程间创建一个集合点是非常简单的,所有的结合也是一个好的语言特征。
7. Operator Overloading
在Java 1 中不能像C++那样使用操作符重载。
8. Templates
模板是C++中好的特征。在Java中不能创建一个类型安全的容器。Java中所有的容器都能包含任何种类的对象,这会导致问题。
在Java中所有的casts(造型)是类型安全的,这减轻了这个问题。即Java中的造型等价于C++中引用的dynamic_cast (动态造型)。不正确的造型结果在一个异常中被抛出。因为一个Java容器中的对象必须被下溯(downcast),且因为这样的造型相对的安全,类型安全容器的需要就减轻了。
类型安全容器并不是模板的唯一好处。C++中的模板可以获得静态多态。尽管在C++和Java中可以使用抽象基类来获得这种多态,使用模板还是用独特的好处的,如,不需要virtual overhead ,如,不需要额外的时间和内存来管理对正常C++虚函数的动态绑定。
9. Break和Continue标签
对结构化语言的原则是不允许使用goto语句的,但也不允许使用破坏单入口,单出口的范例(paradigm)。如使用goto语句来创建for循环或者while循环的等价体并不违反结构化编程。
单入口,单出口范例要求对每个代码块只能有一个入口点和一个出口点。不能有其它方式从代码块中间进入或者退出。入口在顶部,出口在底部。
在C,C++中break和continue的使用,或者Java中的Continue的使用都违反了单入口,单出口的范例。我们使用它们在一个循环的中间来转换控制退出。事实上,对一下封装块来说,它们不知道它们正被退出,且可能写了假设它们不被退出。这会导致很难识别的错误。本回答被网友采纳
第3个回答 2022-04-18
java和C++都是面向对象的编程语言,但它们之间也存在着不同。在Java中,一切都是一种抗议(从Java.lang.Object获得一切时,命令的单根链)。在C++中,没有这样的命令根链。C++既支持过程编程,也支持面向对象的编程;通过这种方式,它被称为混合编程。
第4个回答 2021-01-15
1、Java源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
2、C++源码一次编译,直接在编译的过程中链接了,形成了机器码。
3、C++比Java执行速度快,但是Java可以利用JVM跨平台。
4、Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
5、C++中有指针,Java中没有,但是有引用。
6、C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
7、C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
8、C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
基本上就是以上内容,回答中有什么遗漏欢迎网友们补充,希望对您有所帮助。