为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

java与c++区别和联系

2017-10-24 17页 doc 37KB 29阅读

用户头像

is_594905

暂无简介

举报
java与c++区别和联系java与c++区别和联系 C++和JAVA的区别(本资料较全面) 2008-06-12 16:56 C++和JAVA的区别(本资料较全面) 声明:本内容共分为三部分,即三篇文章. JAVA和C,,的区别介绍框架纲领如下: (一) 序言: (二) 我学习二者的个人感受: (三) 个人建议: (四) 用JAVA中继承的特性来描述C,,和JAVA的关系图示: (五) JAVA和C,,的区别(前言导读): ) JAVA和C++的基本区别(开始华山论剑) (六 1)JAVA摒弃的C,,内容。 2)JAVA的新特性...
java与c++区别和联系
java与c++区别和联系 C++和JAVA的区别(本资料较全面) 2008-06-12 16:56 C++和JAVA的区别(本资料较全面) 声明:本内容共分为三部分,即三篇文章. JAVA和C,,的区别介绍框架纲领如下: (一) 序言: (二) 我学习二者的个人感受: (三) 个人建议: (四) 用JAVA中继承的特性来描述C,,和JAVA的关系图示: (五) JAVA和C,,的区别(前言导读): ) JAVA和C++的基本区别(开始华山论剑) (六 1)JAVA摒弃的C,,内容。 2)JAVA的新特性。 3)JAVA和C,,都有却不同的特性. (七) JAVA和C,,的区别详细介绍(对部分知识点的扩充): (八) C,,与JAVA区别小总结: 开始进行: (一)序言:本人整理的资料几乎涵盖了所有的方面,也可以说包含了用百度搜索能搜到的几乎所有的内容,并参考有关书籍资料学习中遇到的编程问题~ 网上资料最全面、最具有代性的二者的区别总汇,当然它没有一本专门介绍二者区别的书更具有权威性和全面性,但是我相信你 其中所涉及到的内容不乏有拷贝的内容,但大部分是经过自己分析和思考而整理出来的,并对某些别人上传到互联网上的资料做了人那里ctrl+c一下放到自己的家门儿就算是ok了,我们尽可能的要向资料的准确性和版权性付相应的责任。 这样一方面对自己有很大的提高,另一方面只有这样才能给广大同仁提供更准确和更丰富的信息内容,大家才能共同提高和进步. (二)我学习二者的个人感受: 我最初学习的是Java,后来又学习C,,,虽然二者都是面向对象的语言(C,,是半面向对象语言),但是在C,,的学习过程中活性的语法让一个之前学过JAVA语言的人感到很不爽~~~ Java确实是个很不错的东西,尤其是其背后有强大的类库做支撑,用起来感觉那是相当的爽,但速度也确实是个问题。幸好现在 解释执行方式了,即时编译器(JITC、just-in-time compiler)技术和原型编译技术的出现大大提高了JAVA的运行效率。 C,,灵活无比,但纯属高级玩具或者高深的九阳神功,假如玩不好,就把自己绕进去,如练奇门遁甲一般走火入魔,如果玩好了C++在时因为必须完全兼容C语言又必须提供所有的面向对象特性所以最终它的结构变得特别复杂,当引入泛型编程STL(Java是在C++的基础上开发出来的,比C++简化很多,容易使用很多,但是在有些方面特别是泛型方面明显没有C++使用起来灵对于图像的剪切等方面的技术。 (三)个人建议:所以我认为如果先学习C,,再来学习JAVA会容易很多。先学C,,就好比一开始你是穿着裤子进行110米跨超级重装骑兵脱下盔甲下了马换上短剑拿起轻盾再背一把可替换的AK47。 进行跨栏,没有那么多的乱七八糟的东西或者越弄越复杂的 东西,显得干净利落,在增加了多个新特性后又不失功能的强大。要不 当然,如果有人想学习JAVA,也没有必要非得从C,,开始学起,我说的是如果有人需要两种语言都学的话,这个流程还是可以 (四)下面我用一个JAVA中继承的特性来描述C,,和JAVA的关系: class C,, { protected String attribute=”构造函数、new关键字等等”; C++( ){System.out.println(“我C,,是JAVA的爸爸~”); } void C,,的家产( ) { System.out.println(“我有家财万贯:结构体或联合体、枚举、指针、操作符重载、预处理、支持自动的类型转换、全局变量或全局可以声明无符号整数、goto语句、delete操作符、标准库函数、wchar_t型、支持异常处理等等”); } } class Java extends C,, { //我完全继承了父亲的属性 Java( ){System.out.println(“我JAVA是C,,的儿子~”); } void C,,的家产( )//儿子重写C,,的家产( )这个方法 { System.out.println(“我有更值钱的东西:我用类来代替结构体、我有API来代替标准库函数、我有finalize( )函数来代替析构函数来代替wchar_t型、 身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性~JAVA则是完全的面向对象语言,它句法更清晰,规模更小, 用C++可以使用纯过程化的编程,也可以是基于对象的编程,还可以是面向对象的编程,当然大部分是混合编程,c++可以跨平台调用标准库函数写的程序跨平台才能非常容易,不能跨平台的是VC++等IDE(也就是说你用VC,,写出来的C,,程序就不能准C++支持得很好,注意:不要混淆C,,和VC,,的概念。)[/color]java是纯面向对象的语言,其最大的特色Write once ,R作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就就会理解为什么说Java是一种优秀的程序设计语言。 Java和c++的相似之处多于不同之处,但两种语言因为有几处主要的不同使得Java更容易学习,并且编程环境更为简单。 (六)JAVA和C++的基本区别(开始华山论剑) 先来探讨一下C,,和JAVA的基本区别。 这些不同之处大致分为三类: 1)JAVA不支持的C,,特性。 2)JAVA的独特之处。 3)C,,和JAVA都有但是却不相同的特性。 的对象模型几乎就是C++对象模型的简化版。然而,C++和Java之间仍存在一些显著的差异。可以这样说,这些差异代表着技术的 详细讨论这三类: 1)JAVA摒弃的C,,(2)即使指针可以被限制在JAVA的运行系统中(这在理论上是可行的,因为JAVA程序是解释执行 c)JAVA不再包括预处理,也不再支持预处理指令。预处理在C,,语言中已经不如C中那么重要,JAVA的设计者认为是彻底消d)JAVA不支持自动的类型转换,因为这种类型转换导致精度降低例如当从长整型转换为整型时,必须显示强制执行类型转换。 e)在JAVA中的代码必须封装在一个或者多个类中。因此JAVA中不再包含所谓的全局变量或者全局函数。 f)JAVA不再允许默认参数。在C,,中,当过程调用时存在没有对应值的参数时可以使用一个预先指定的值。JAVA不再允许这样g)JAVA不支持多继承,即不允许一个子类继承多个父类。 h)虽然JAVA支持构造函数,但是不再支持析构函数[/b]。但是,JAVA增加了finalize( )函数。 i)JAVA不再支持typedef. j)在JAVA中不再可能声明无符号整数。 k)JAVA不再支持goto语句。 l)JAVA不再有delete操作符。 m)JAVA中的<>不再重载I/O操作。 n)JAVA中,对象只能由引用传递,C,,中对象可由值或引用传递. 2)、JAVA的新特性。 JAVA中的许多特性是C,,中没有的。其中最重要的三个方面是多线程、包和接口,还有其他的许多独特之处都丰富了JAVA 1)多线程允许两个或者多个相同的线程并发运行。 而且,这是一种在语言级支持的并发机制。C,,中没有类似的机制,或者说C,,采用的是单线程的体系结构。如果需要并发执功能手工启动。虽然这两种方法都可以同时执行两个或者多个线程,但是JAVA的方法清楚而且便于使用。 2)C,,中没有可以与JAVA包对应的特性。[/b]最近似的是用一个公用头文件的一组库函数。然而,在C,,中构建和使用库函数同的。 3)JAVA的接口与C,,的抽象类相似(C,,中的抽象类是包括至少一个纯虚函数的类)。[/b]例如,C,,的抽象类和JAVA的个子类实现的一致接口。两者之间最大的不同之处在于接口更清晰的表明了这个概念。 4)JAVA提供一个流线型的9)JAVA包含一个内置的字符String在某种程度上和C,,提供的标准string类很相似。当然C,,中的string只有在程序中声明后方可使用,它并不是内置的 3)、JAVA和C,,的不同的特性。 1)JAVA和C,,都支持布尔类型的数据,但是JAVA实现true和false的方式和C,,不同。在C,,中,true是非零值,false转换为false。这种情况在JAVA中不会出现。 2)在创建C,,类时,访问说明符应用到一组声明中。而JAVA中,访问说明符仅应用于其限定的声明中。 3)C,,支持异常处理,这与JAVA类似,但是在C,,中无需捕捉一个被引发的异常。 (七)JAVA和C,,的区别详细介绍(对部分知识点的扩充) (1) JAVA的运行速度(JAVA最大的障碍在于速度) 预先定义好的常量,并且是一个布尔表达式能得到的唯一的两个值。虽然C,,也定义了true and false ,并指定为布尔变量,但 解释过的Java要比C的执行速度慢上约20倍。无论什么都不能阻止Java语言进行编译。当时刚刚出现了一些准实时编译器,它 理由认为会出现适用于更多流行平台的纯固有编译器,但假若没有那些编译器,由于速度的限制,必须有些问题是Java不能解决许多企业的应用开发人员非常喜爱Java的语言特性,但是在开发重要系统时,语言特性和执行效率之间的抉择往往令人伤透脑筋如何压缩或者运行的延迟关系如何设置,但是对程序的运行速度却非常重视,这使厂商将Java的编译策略开发放在了首位。现在解释执行方式了,即时编译器(JITC、just-in-time compiler)技术和原型编译技术已经被许多厂家采用,包括Sun、IBM、Orac地提高了Java的执行效率。 (2)JAVA所有东西都必须置入一个类. 商正在利用这些技术逐步提高Java的执行速度,其中IBM公司早已将Java虚拟机(JVM,JavaVirtual Machine)、操作系统和 Java是完全面向对象的语言,它不再支持C++程序时所使用的过程式的设计方法,所有函数和变量部必须是类的一部分。除了基等)之外,其他的数据对Java来说都是对象,包括数组。 对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。JAVA不存在全局函数或者全局数据(Class),消除了不必要的麻烦。 考虑将static方法和static数据置入一个类里。而c++允许将函数和变量定义为全局的。此外,Java中取消了c,c++中的结构和 JAVA的语法其实是参照c++的语法诞生的,但是她去除了c++中的多重继承,指针,delete等难于掌握的技术,为了便于移植和使是主函数public static void main(String[] args){}也要放在主类中,可以看出和C,,的明显区别。 (3) 在Java中,类定义采取几乎和C++同样的形式。 但没有标志结束的分号。没有类声明,只有类定义。 (4) Java中没有作用域范围运算符“::”. Java利用点号做所有的事情,但可以不用考虑它,因为只能在一个类里定义元素。即使那些方法定义,也必须在一个类的内部,们注意到的一项差异是对static方法的调用:使用ClassName.methodName()。 除此以外,package(包)的名字是用点号建立的,并能用import关键字实现C++的“#include”的一部分功能。 例如下面这个语句: import java.awt.*; #include并不直接映射成import,但在使用时有类似的感觉。若想使用另一个库里的类,只需使用import命令,并指定库名即可c,c十十在编译过程中都有一个预编译阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性的引入语句(import)与c十十预处理器(#include)的功能类似。(注意:只是类似而已) (5)JAVA中没有预处理功能的详细介绍 不再有#define、#include等预处理程序(Preprocessor)的功能。C++语言很重要的一个特点就是它的预处理程序。有些其他程序语是欠缺处理宏(Macro)的能力。#define的功能在Java中我们可以用定义常数(constant)的方式来取代,而#include在Java中是不会把类型数据记录在对象实体之中,我们不需要靠一些标头文件(header file)来知道我们使用的对象或数值是属于什么数据类型。如果你使用C++语言时,只使用预处理程序的#include和#define功能的话,那么你大概不会觉得Java这样的设计对你产生什么 处理程序中宏功能的高手,你可能会觉得很不方便,进而怀疑Java如此设计的意义何在。 使用预处理程序虽然可以很方便地达到许多功能,但是站在软件的角度上看,对整个 软件的维护其实是很不利的。由于C++团队工作及日后维护的困难度。 的程序设计高手常会自行开发一套只有自己看的懂的宏语言,一旦整个软件要交给其他人去维护,后继者很难在短时间 看到的则是预处理程序处理过的程序代码,一旦交给预处理程序处理的宏在Java中,这些类型包括boolean,cava里变得更苛刻。 例如: 条件表达式只能是boolean(布尔)类型,不可使用整数。 必须使用象X+Y这样的一个表达式的结果;不能仅仅用“X+Y”来实现“副作用”。 double.所有主类型的大小都是固有的,且与具体的机器无关(考虑到移植的问题)。这肯定会对性能造成一定的影响,具体取决 (7)Java静态引用的字串会自动转换成String对象。[/b][/color] java和C及C++不同,没有独立的静态字符数组字串可供使用c和c十十不支持字符串变量,在c和c十十程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(string和sa语言的核心,用类对象实现字符串有以下几个优点: a)在整个系统中建立字符串和访问字符串元素的方法是一致的; b)Java字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分; c)Java字符串执行运行时检查,可帮助排除一些运行时发生的错误; d)可对字符串用“十”号进行连接操作。 (8) Java增添了三个右移位运算符“>>>”,具有与“逻辑”右移位运算符类似的功用,可在最末尾插入零值。“>>”则会在移位的同时插 (9) 尽管表面上类似,但与C++相比,Java数组采用的是一个颇为不同的结构,并具有独特的行为。就是说Java提供数据下标越有一个只读的length成员,通过它可知道数组有多大。而且一旦超过数组边界,运行期检查会自动丢弃一个异常。所有数组都是分配给另一个(只是简单地复制数组句柄)。数组标识符属于第一级对象,它的所有方法通常都适用于其他所有对象。 (10) 对于所有不属于主类型的对象,都只能通过new命令创建 和C++不同,Java没有相应的命令可以“在堆栈上”创建不属于主创建,同时不使用new命令。所有主要的类都有自己的“封装(器)”类,所以能够通过new创建等价的、以内存“堆”为基础的对象 +那样通过集合初始化进行分配,或者使用new). 继续: (11) Java中不必进行提前声明方法。 若想在定义前使用一个类或方法,只需直接使用它即可——编译器会保证使用恰当的定义。所以和在C++中不同,我们不会碰到 (12) Java用包代替了命名空间。 由于将所有东西都置入一个类,而且由于采用了一种名为 “封装”的机制,它能针对类名进行类似于命名空间分解的操作,所以命包也会在单独一个库名下收集库的组件。我们只需简单地“import“(导入)一个包,剩下的工作会由编译器自动完成。 (13) 被定义成类成员的对象句柄会自动初始化成null。 对基本类数据成员的初始化在Java里得到了可靠的保障。若不明确地进行初始化,它们就会得到一个默认值(零或等价的值)可对的存储方式,这和C++是不同的。 (14) 在Java里,没有象C和C++那样的指针。 用new创建一个对象的时候,会获得一个引用(或者叫句柄) 例如: Strings = new String("helloworld"); 要么在类 除错时间最久的也是指针的问题。配合上C++对ff(15) Java提 为所有自变量都是按引用传递的(注意:而C,,中对象可由值或引用传递。) (16) Java中没有“破坏器”(Destructor)。 变量不存在“作用域”的问题。一个对象的“存在时间”是由对象的存在时间决定的,并非由垃圾收集器决定。有个finalize()方法是每++的“破坏器(就是析构函数的使用)”。但finalize()是由垃圾收集器调用的,而且只负责释放“资源”(如打开的文件、套接字、端做某样事情,必须创建一个特殊的方法,并调用它,不能依赖finalize()。而在另一方面,C++中的所有对象都会(或者说“应该”)法。 (17) Java具有方法“重载”机制,它的工作原理与C++函数的重载载几乎是完全相同的。 (18) Java不支持默认自变量。 (19) Java中没有goto语句。 Java一方面移除了Goto的功能,它采取的无条件跳转机制是“break 标签”或者“continue 标签” ,另一方面同时扩大了break和eak或continue。如此一来不但避免了滥用Goto的可能性,同时也保存下Goto的好处。 “可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto当作“垃圾”收集掉。由于Java不支持破坏器的概念,所以在必要的时候,必须谨慎地创建一个清除方法。而且针对类 乎造成了限制,但由于我们知道每个对象肯定至少有一个Object接口,所以往往能获得更强大的能力。C++目前似乎是唯一没有强 它提供了一系列集合:Vector(向量),Stack(堆栈)以及Hashtable(散列表),用于容纳Object引用。利用这些集合,我们非是为实现象C++“标准模板库”(STL)那样的快速调用而设计的。Java 1.2中的新集合显得更加完整,但仍不具备正宗模板那样 (22)“垃圾收集”意味着在Java中出现 ++基础上的一种极大进步,使许多编程问题消弥于无形之中。但对少数几个垃圾收集器力有不逮的问题,它却是不大适合的。但 (23) Java 类。递归的synchronized方法可以正常运作。若线程的优先等级相同,则时间的“分片”不能得到保证。 (24)我们不是象C++那 JAVA中若未规定一个“显式”(明确的)限定符,就会默认为“友好的”(friendly)。这意味着同一个包里的其他元素也可以访问它朋友),但不可由包外的任何元素访问。而在C,,中如果未规定就会默认为私有的private。 类——以及类然而,在多线程的环境中,对private的恰当运用是非常重要的。Java的protected关键字意味着消了) (25) 嵌套的类。 访问”。注意Java没有与C++的protected关键字等价的元素,后者意味着“只能由继承者访问”(以前可用“private protected”实现 在C++中,对类进行嵌套有助于隐藏名称,并便于代码的组织(但C++的“命名空间”已使名称的隐藏显得多余)。Java的“封装”或不再是一个问题。Java 1.1引入了“ 的成员,毋需任何条件——就好象那些成员直接隶属于内部类对象一样。这样便为回调问题提供了一个更优秀的——C++是用 JAVA所有方法都是在类的主体定义的。所以用C++的眼光看,似乎所有函数都已嵌入,但实情并非如此。Java编译器也许会自多的控制权力。在Java中,可为一个方法使用final关键字,从而“建议”进行嵌入操作。然而,嵌入函数对于C++的编译器来说也 (27) Java中的继承具有与C++相同的效果,但采用的语法不同。 Java用extends关键字标志从一个基础类的继承,并用super关键字指出准备在基础类中调用的方法,它与我们当前所在的方法关键字只允许我们访问父类的方法——亦即分级结构的 上一级)。通过在C++中设定基础类的作用域,我们可访问位于分级结构基础类构建器。正如早先指出的那样,所有类最终都会从Object里自动继承。和C++不同,不存在明确的构建器初始化列表。但 b举例说明 public class Foo extends Bar { publicFoo(String msg) 行全部的基础类初始化,而且不允许我们在主体的后面部分进行这一工作。通过组合运用自动初始化以及来自未初始化对象句柄的 { super(msg); Calls base constructor } public baz(int i) { Override super.baz(i); Calls base method } } (28) Java中的继承不会改变基础类成员的保护级别。 我们不能在Java中指定public,priv ate或者protected继承,这一点与C++是相同的。此外,在衍生类中的优先方法不能减少对员在基础类中属于public,而我们用另一个方法代替了它,那么用于替换的方法也必须属于public(编译器会自动检查)。 (29) Java提供了一个interface关键字,它的作用是创建抽象基础类的一个等价物。 在其中填充抽象方法,且没有数据成员。这样一来,对于仅仅设计成一个接口的东西,以及对于用extends关键字在现有功能基础的差异。不值得用abstract关键字产生一种类似的效果,因为我们不能创建属于那个类的一个对象。一个abstract(抽象)类可包的需要。 含什么东西),但它也能包含用于具体实现的代码。因此,它被限制成一个单一的继承。通过与接口联合使用,这一方案避免了对 为创建可进行“例示”(即创建一个实例)的一个interface(接口)的版本,需使用implements关键字。它的语法类似于继承的语public interface Face { public void smile(); } public class Baz extends Bar implements Face { public void smile( ) { System.out.println("a warm smile"); } } (30) Java中没有virtual关键字,因为所有非static方法都肯定会用到动态绑定。 在Java中,程序员不必自行决定是否使用动态绑定。C++之所以采用了virtual,是由于我们对性能进行调整的时候,可通过将其者换句话说:“如果不用,就没必要为它付出代价”)。virtual经常会造成一定程度的混淆,而且获得令人不快的结果。final关键字译器指出这种方法不能被取代,所以它的范围可能被静态约束(而且成为嵌入状态,所以使用C++非virtual 调用的等价方式)。 (31) Java不提供多重继承机制(MI),至少不象C++那样做。 与protected类似,MI表面上是一个很不错的主意,但只有真正面对一个特定的设计问题时,才知道自己需要它。由于Java使用场合才需要用到MI。interface关键字会帮助我们自动完成多个接口的合并工作。 c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现所谓的interface基本上定义了一个类的对外沟通的方法原型,以及类derived d = (derived)base; 这与旧式风格的C造型是一样的。编译器会自动调用动态造型机制,不要求使用额外的语法。尽管它并不象C++的“new casts”那检查使用情况,并丢弃那些“异常”,所以它不会象C++那样允许坏造型的存在。 (33) Java采取了不同的异常控制机制,因为此时已经不存在构建器。 可添加一个finally从句,强制执行特定的语句,以便进行必要的清除工作。Java中的所有异常都是从基础类Throwable里继承而接口。 public void f(Obj b) throws IOException { myresource mr = b.createResource(); try { mr.UseResource(); } catch(MyException e) { handle my exception } catch(Throwable e) { handle all other exceptions } finally{ mr.dispose(); special cleanup } } (34) Java的异常比C++的出色得多。 JAVA中的异常机制用于捕获例外事件,增强系统容错能力 如代码所示: try { 可能产生例外的代码 } catch(exceptionType name) 其中exceptionType表示异常类型。 { 处理 } 而C++则没有如此方便的机制。 java丢弃一个错误的异常后,不是象C++那样在运行期间调用一个函数,Java异常规范是在编译期间检查并执行的。除此以外,版本的异常规范:它们可丢弃指定的异常或者从那些异常衍生出来的其他异常。这样一来,我们最终得到的是更为“健壮”的异常控 (35) Java具有方法重载的能力,但不允许运算符(操作符)重新载OperatorOverloading String类不能用+和+=运算符连接不同的字串,而且String表达式使用自动的类型转换,但那是一种特殊的 public: Complex(double real,double image) { Real_number=real; Image_number=image; } Complex operator+(Complex&rhs) { Return Complex(rhs(real_number+real_number,rhs.image_number+image_,nulnbef); } private: doublereal_number 实部 doublejmage_nunmber; 虚部 } 在这里,如果你使用+来作为复数的加法符号,大家都不会有疑义,但是如果你使用的是*或》这样的符号,那么别人看到你的程序以定义类中的方法来达到同样的目的. 也是Operator Overloading一大问题,当大家都对运算符赋予自己的定义后,整个程序的可读性就会大受影响。Operator Overlo
/
本文档为【java与c++区别和联系】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索