Java和C++有什么不同,该学习哪种呢?

已举报 回答
Java和C++有什么不同,该学习哪种呢?
问在线客服
扫码问在线客服
  • 回答数

    4

  • 浏览数

    1,539

4个回答 默认排序
  • 默认排序
  • 按时间排序

已采纳
一、从纯语言层面说,很难区分哪个语言好,哪个不好,因为他们大多数用途不一样。JAVA由于历史原因,6之前的版本swing效率太低,所以给大家的印象是不适合做桌面和C/S的应用,其实现在已经不是这样了,无论国内还是国外,java开发桌面程序已经越来越多了,但是JAVA应用最多的还是java ee应用,当然主要是B/S结构的。C++更多的做底层开发,unix和linux上的应用程序,多数C++开发的。windows上的很多桌面程序,也是C++开发的。应该说java和C++的侧重点目前还是挺明显的。语言没有好坏,学好一样就可以。建议先学C++,之后java就不难学了。

二、Java和C++的区别:
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的使用都违反了单入口,单出口的范例。我们使用它们在一个循环的中间来转换控制退出。事实上,对一下封装块来说,它们不知道它们正被退出,且可能写了假设它们不被退出。这会导致很难识别的错误。
取消 评论
女生大部分做到最后会选择软件测试方面发展,…省脑子
取消 评论
女生学软的,怎么说呢,就是不看好.
取消 评论
联想的,dell服务极差,买过就知道了
取消 评论
ZOL问答 > Java和C++有什么不同,该学习哪种呢?

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?