Java和C++有什么区别,该学习哪种呢?

 我来答
tattackor
2015-09-22 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:876万
展开全部
一、从纯语言层面说,很难区分哪个语言好,哪个不好,因为他们大多数用途不一样。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的使用都违反了单入口,单出口的范例。我们使用它们在一个循环的中间来转换控制退出。事实上,对一下封装块来说,它们不知道它们正被退出,且可能写了假设它们不被退出。这会导致很难识别的错误。
匿名用户
2013-11-19
展开全部
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
  当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。那么Java到底有何神奇之处呢?
  Java语言其实最早诞生于1991年,起初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻,甚至差点夭折。但是,网络的出现改变了OAK的命运。
  在Java出现以前,Internet上的信息内容都是一些乏味死板的HTML文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他们迫切希望能在WEB中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力。SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都心生感叹:噢,这正是我想要的!于是Java成了一颗耀眼的明星,丑小鸭一下子变成了白天鹅。 Java主要特性   1、Java语言是简单的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
  2、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
   3、Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
   4、Java语言是健壮的。Java的强类型机制、异常处理、废料的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
   5、Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
  6、Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件), 然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
   7、Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。
   8、Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式, 然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
   9、Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
   10、Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable) 的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。 Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
   11、Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
  Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次,到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口(Java Enterprise APIs)为企业计算及电子商务应用系统提供了有关技术和丰富的类库。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-19
展开全部
Java 和 C++ 的意外处理语法与 JavaScript 的非常相似。同 JavaScript 中一样,它们也是以 try..catch 语句为中心的。主要的区别在于 catch 的变量。就象前面页面中所解释的一样,在 JavaScript 中这个变量可以是任何数据类型,可以是一个对象、一个字符串、一个整数或任何其它被支持的类型。实际上,JavaScript 不支持类型声明,所以就无法声明 catch 的变量类型。在 Java 中,catch 的变量是 Java 类的一个例示,将标准 Java 扩展成可导致的类。Catch 语句应该是这样的: catch (objectType exception)    其中意外是一个 objectType 类型的对象。C++ 就不是那么限制了,Catch 的变量可以是标准 C++ 意外类的一个例示,或者是任何 C++ 类型: catch (char *message)    由于在 JavaScript 中没有类型声明,在每个 try 代码区它只支持一个 catch 代码区。在前面页面中已经显示了,当我们的意外处理要依赖于变量类型时,我们就使用 instanceOf 函数来检查它是否是正确的类型。在 C++ 和 Java 中,对每一个 try 代码区你可以使用多个 catch 代码区。每个 catch 代码区负责处理适当类型的意外。假如你想处理 char 类型和 myException 类型的意外: try { // following function can throw exceptions of type char or myException doSomeThingUseful(); } catch (char *exceptionString) { // handle the case that exception is a string } catch (myException exceptionObject) // handle the case that exception is an instance of type myException }    在 JavaScript 中,你要用这些代码行: try { // following function can throw exceptions of type char or myException doSomeThingUseful(); } catch (exception) { // verify exception is of myExceptionObject type if (exception instanceOf myExceptionObject) { if (exception.kind == "string") { // handle the sting exception } else if (exception.kind == "myException") { // handle the object exception } }    另一个区别是 Java 和 C++ 支持意外 catch-all(全捕捉),也就是在一个 catch 代码区捕捉全部的意外。在 Java 中的语法是: catch (Throwable t) { // Handle all cases }    其中 Throwable 是一个事先定义的 Java 类。在 C++ 中相应的 catch-all 语法是: catch ( ... ) { // Handle all cases }    正如上面所说过的,由于 JavaScript 只支持一个 catch 代码区,根据定义,所有的意外都是由同一个 catch 代码区捕捉的。你应该使用: catch ( exception ) { // Handle all exceptions }    同样的区别在 C++、 Java 和 JavaScript 的导致语句中也存在。在三种语言中语法是一样的: throw exceptionObject;    由于 Java 只能捕捉 Throwable 类型的意外, exceptionObject 必须是这种类型。C++ 和 JavaScript 可以抛出任何数据类型,包括字符串、整数、对象等。    C++ 和 Java 在意外向上繁殖的方式上与 JavaScript 也不同。如果一个意外不在 C++ 或 Java 中处理,那么在调用方案中,它就自动被提升到一个更高层次,如调用函数、主程序或浏览器。在 JavaScript 中,如果你希望一个更高层次处理这个意外的话,就不得不自己来提升这个意外。前面页中已经显示过,你应该使用这个简单的语法: throw exceptionObj;    最后一个区别是 C++ 和 Java 不支持 try..catch 代码区的嵌套。而在 JavaScript 中,你可以将一个 try...catch 语句装在另一个语句的 try 或 catch 区内。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-19
展开全部
我建议你先学C++吧,Java是纯面向对象的,最好别一开始就学纯面向对象,否则学了也白学。其实学什么编程语言都不重要,重要的是你的编程思维能力.懂了编程的基本原理之后 ,想学任何一门语言都是非常快的.所以,选择学某种语言时不要忘了学好其他计算机基础课程.比如:计算机基本原理,操作系统,网络原理等等,大学里的计算机专业的基础课程.其实C++和Java是各有特色,C++其主要用途是在开发游戏和一些软件,JAVA其用途最多的是在于它的跨平台性,跟C++差不多,像手机游戏很多都是用JAVA开发的.相对来说,JAVA的前途比较大,工作也相对多一些.所以呢!关键还是看你自己喜欢学哪一种,你觉得学哪一种更合你的胃口.具体的区别,网上一查便知道.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柠檬达人show
2014-05-29 · TA获得超过869个赞
知道答主
回答量:126
采纳率:0%
帮助的人:8.5万
展开全部
一群搓逼在这误导别人,学什么语言要看你自己,你可以先学一学java不喜欢在去学c++,j2se你学完了你还是没法做项目,可以用jframe框架做一些简单的桌面应用,j2ee是pc端web,j2me是移动端。有时你写代码写的不规范这样会影响到后期开发或别人接受后没法做了,那就要重新开始,那这样你去哪里都没人要,java的语法是很严谨的,错一点不报错是很正常,要你自己去找,有可能一个问题就导致整个项目无法正常运行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式