做网站广告经营者,电厂建设审批进度网站,做网站的一般要多钱,滕州网站建设招聘java与C的区别 来源 https://www.cnblogs.com/Allen-rg/p/6692043.html “作为一名C程序员#xff0c;我们早已掌握了面向对象程序设计的基本概念#xff0c;而且Java的语法无疑是非常熟悉的。事实上#xff0c;Java本来就是从C衍生出来的。” 然而#xff0c;C和Java之…java与C的区别 来源 https://www.cnblogs.com/Allen-rg/p/6692043.html “作为一名C程序员我们早已掌握了面向对象程序设计的基本概念而且Java的语法无疑是非常熟悉的。事实上Java本来就是从C衍生出来的。” 然而C和Java之间仍存在一些显著的差异。可以这样说这些差异代表着技术的极大进步。一旦我们弄清楚了这些差异就会理解为什么说Java是一种优秀的程序设计语言。本附录将引导大家认识用于区分Java和C的一些重要特征。 (1) 最大的障碍在于速度解释过的Java要比C的执行速度慢上约20倍。无论什么都不能阻止Java语言进行编译。写作本书的时候刚刚出现了一些准实时编译器它们能显著加快速度。当然我们完全有理由认为会出现适用于更多流行平台的纯固有编译器但假若没有那些编译器由于速度的限制必须有些问题是Java不能解决的。 (2) 和C一样Java也提供了两种类型的注释。 (3) 所有东西都必须置入一个类。不存在全局函数或者全局数据。如果想获得与全局函数等价的功能可考虑将static方法和static数据置入一个类里。注意没有象结构、枚举或者联合这一类的东西一切只有“类”Class (4) 所有方法都是在类的主体定义的。所以用C的眼光看似乎所有函数都已嵌入但实情并非如何嵌入的问题在后面讲述。 (5) 在Java中类定义采取几乎和C一样的形式。但没有标志结束的分号。没有class foo这种形式的类声明只有类定义。 class aType() void aMethod() {/* 方法主体*/} } (6) Java中没有作用域范围运算符“::”。Java利用点号做所有的事情但可以不用考虑它因为只能在一个类里定义元素。即使那些方法定义也必须在一个类的内部所以根本没有必要指定作用域的范围。我们注意到的一项差异是对static方法的调用使用ClassName.methodName()。除此以外package包的名字是用点号建立的并能用import关键字实现C的“#include”的一部分功能。例如下面这个语句 import java.awt.*; #include并不直接映射成import但在使用时有类似的感觉。 (7) 与C类似Java含有一系列“主类型”Primitive type以实现更有效率的访问。在Java中这些类型包括booleancharbyteshortintlongfloat以及double。所有主类型的大小都是固有的且与具体的机器无关考虑到移植的问题。这肯定会对性能造成一定的影响具体取决于不同的机器。对类型的检查和要求在Java里变得更苛刻。例如 ■条件表达式只能是boolean布尔类型不可使用整数。 ■必须使用象XY这样的一个表达式的结果不能仅仅用“XY”来实现“副作用”。 (8) char字符类型使用国际通用的16位Unicode字符集所以能自动表达大多数国家的字符。 (9) 静态引用的字串会自动转换成String对象。和C及C不同没有独立的静态字符数组字串可供使用。 (10) Java增添了三个右移位运算符“”具有与“逻辑”右移位运算符类似的功用可在最末尾插入零值。“”则会在移位的同时插入符号位即“算术”移位。 (11) 尽管表面上类似但与C相比Java数组采用的是一个颇为不同的结构并具有独特的行为。有一个只读的length成员通过它可知道数组有多大。而且一旦超过数组边界运行期检查会自动丢弃一个异常。所有数组都是在内存“堆”里创建的我们可将一个数组分配给另一个只是简单地复制数组句柄。数组标识符属于第一级对象它的所有方法通常都适用于其他所有对象。 (12) 对于所有不属于主类型的对象都只能通过new命令创建。和C不同Java没有相应的命令可以“在堆栈上”创建不属于主类型的对象。所有主类型都只能在堆栈上创建同时不使用new命令。所有主要的类都有自己的“封装器”类所以能够通过new创建等价的、以内存“堆”为基础的对象主类型数组是一个例外它们可象C那样通过集合初始化进行分配或者使用new。 (13) Java中不必进行提前声明。若想在定义前使用一个类或方法只需直接使用它即可——编译器会保证使用恰当的定义。所以和在C中不同我们不会碰到任何涉及提前引用的问题。 (14) Java没有预处理机。若想使用另一个库里的类只需使用import命令并指定库名即可。不存在类似于预处理机的宏。 (15) Java用包代替了命名空间。由于将所有东西都置入一个类而且由于采用了一种名为“封装”的机制它能针对类名进行类似于命名空间分解的操作所以命名的问题不再进入我们的考虑之列。数据包也会在单独一个库名下收集库的组件。我们只需简单地“import”导入一个包剩下的工作会由编译器自动完成。 (16) 被定义成类成员的对象句柄会自动初始化成null。对基本类数据成员的初始化在Java里得到了可靠的保障。若不明确地进行初始化它们就会得到一个默认值零或等价的值。可对它们进行明确的初始化显式初始化要么在类内定义它们要么在构建器中定义。采用的语法比C的语法更容易理解而且对于static和非static成员来说都是固定不变的。我们不必从外部定义static成员的存储方式这和C是不同的。 (17) 在Java里没有象C和C那样的指针。用new创建一个对象的时候会获得一个引用本书一直将其称作“句柄”。例如 String s new String(howdy); 然而C引用在创建时必须进行初始化而且不可重定义到一个不同的位置。但Java引用并不一定局限于创建时的位置。它们可根据情况任意定义这便消除了对指针的部分需求。在C和C里大量采用指针的另一个原因是为了能指向任意一个内存位置这同时会使它们变得不安全也是Java不提供这一支持的原因。指针通常被看作在基本变量数组中四处移动的一种有效手段。Java允许我们以更安全的形式达到相同的目标。解决指针问题的终极方法是“固有方法”已在附录A讨论。将指针传递给方法时通常不会带来太大的问题因为此时没有全局函数只有类。而且我们可传递对对象的引用。Java语言最开始声称自己“完全不采用指针”但随着许多程序员都质问没有指针如何工作于是后来又声明“采用受到限制的指针”。大家可自行判断它是否“真”的是一个指针。但不管在何种情况下都不存在指针“算术”。 (18) Java提供了与C类似的“构建器”Constructor。如果不自己定义一个就会获得一个默认构建器。而如果定义了一个非默认的构建器就不会为我们自动定义默认构建器。这和C是一样的。注意没有复制构建器因为所有自变量都是按引用传递的。 (19) Java中没有“破坏器”Destructor。变量不存在“作用域”的问题。一个对象的“存在时间”是由对象的存在时间决定的并非由垃圾收集器决定。有个finalize()方法是每一个类的成员它在某种程度上类似于C的“破坏器”。但finalize()是由垃圾收集器调用的而且只负责释放“资源”如打开的文件、套接字、端口、URL等等。如需在一个特定的地点做某样事情必须创建一个特殊的方法并调用它不能依赖finalize()。而在另一方面C中的所有对象都会或者说“应该”破坏但并非Java中的所有对象都会被当作“垃圾”收集掉。由于Java不支持破坏器的概念所以在必要的时候必须谨慎地创建一个清除方法。而且针对类内的基础类以及成员对象需要明确调用所有清除方法。 (20) Java具有方法“过载”机制它的工作原理与C函数的过载几乎是完全相同的。 (21) Java不支持默认自变量。 (22) Java中没有goto。它采取的无条件跳转机制是“break 标签”或者“continue 标准”用于跳出当前的多重嵌套循环。 (23) Java采用了一种单根式的分级结构因此所有对象都是从根类Object统一继承的。而在C中我们可在任何地方启动一个新的继承树所以最后往往看到包含了大量树的“一片森林”。在Java中我们无论如何都只有一个分级结构。尽管这表面上看似乎造成了限制但由于我们知道每个对象肯定至少有一个Object接口所以往往能获得更强大的能力。C目前似乎是唯一没有强制单根结构的唯一一种OO语言。 (24) Java没有模板或者参数化类型的其他形式。它提供了一系列集合Vector向量Stack堆栈以及Hashtable散列表用于容纳Object引用。利用这些集合我们的一系列要求可得到满足。但这些集合并非是为实现象C“标准模板库”STL那样的快速调用而设计的。Java 1.2中的新集合显得更加完整但仍不具备正宗模板那样的高效率使用手段。 (25) “垃圾收集”意味着在Java中出现内存漏洞的情况会少得多但也并非完全不可能若调用一个用于分配存储空间的固有方法垃圾收集器就不能对其进行跟踪监视。然而内存漏洞和资源漏洞多是由于编写不当的finalize()造成的或是由于在已分配的一个块尾释放一种资源造成的“破坏器”在此时显得特别方便。垃圾收集器是在C基础上的一种极大进步使许多编程问题消弥于无形之中。但对少数几个垃圾收集器力有不逮的问题它却是不大适合的。但垃圾收集器的大量优点也使这一处缺点显得微不足道。 (26) Java内建了对多线程的支持。利用一个特殊的Thread类我们可通过继承创建一个新线程放弃了run()方法。若将synchronized同步关键字作为方法的一个类型限制符使用相互排斥现象会在对象这一级发生。在任何给定的时间只有一个线程能使用一个对象的synchronized方法。在另一方面一个synchronized方法进入以后它首先会“锁定”对象防止其他任何synchronized方法再使用那个对象。只有退出了这个方法才会将对象“解锁”。在线程之间我们仍然要负责实现更复杂的同步机制方法是创建自己的“监视器”类。递归的synchronized方法可以正常运作。若线程的优先等级相同则时间的“分片”不能得到保证。 (27) 我们不是象C那样控制声明代码块而是将访问限定符publicprivate和protected置入每个类成员的定义里。若未规定一个“显式”明确的限定符就会默认为“友好的”friendly。这意味着同一个包里的其他元素也可以访问它相当于它们都成为C的“friends”——朋友但不可由包外的任何元素访问。类——以及类内的每个方法——都有一个访问限定符决定它是否能在文件的外部“可见”。private关键字通常很少在Java中使用因为与排斥同一个包内其他类的访问相比“友好的”访问通常更加有用。然而在多线程的环境中对private的恰当运用是非常重要的。Java的protected关键字意味着“可由继承者访问亦可由包内其他元素访问”。注意Java没有与C的protected关键字等价的元素后者意味着“只能由继承者访问”以前可用“private protected”实现这个目的但这一对关键字的组合已被取消了。 (28) 嵌套的类。在C中对类进行嵌套有助于隐藏名称并便于代码的组织但C的“命名空间”已使名称的隐藏显得多余。Java的“封装”或“打包”概念等价于C的命名空间所以不再是一个问题。Java 1.1引入了“内部类”的概念它秘密保持指向外部类的一个句柄——创建内部类对象的时候需要用到。这意味着内部类对象也许能访问外部类对象的成员毋需任何条件——就好象那些成员直接隶属于内部类对象一样。这样便为回调问题提供了一个更优秀的方案——C是用指向成员的指针解决的。 (29) 由于存在前面介绍的那种内部类所以Java里没有指向成员的指针。 (30) Java不存在“嵌入”inline方法。Java编译器也许会自行决定嵌入一个方法但我们对此没有更多的控制权力。在Java中可为一个方法使用final关键字从而“建议”进行嵌入操作。然而嵌入函数对于C的编译器来说也只是一种建议。 (31) Java中的继承具有与C相同的效果但采用的语法不同。Java用extends关键字标志从一个基础类的继承并用super关键字指出准备在基础类中调用的方法它与我们当前所在的方法具有相同的名字然而Java中的super关键字只允许我们访问父类的方法——亦即分级结构的上一级。通过在C中设定基础类的作用域我们可访问位于分级结构较深处的方法。亦可用super关键字调用基础类构建器。正如早先指出的那样所有类最终都会从Object里自动继承。和C不同不存在明确的构建器初始化列表。但编译器会强迫我们在构建器主体的开头进行全部的基础类初始化而且不允许我们在主体的后面部分进行这一工作。通过组合运用自动初始化以及来自未初始化对象句柄的异常成员的初始化可得到有效的保证。 public class Foo extends Bar { public Foo(String msg) { super(msg); // Calls base constructor } public baz(int i) { // Override super.baz(i); // Calls base method } } (32) Java中的继承不会改变基础类成员的保护级别。我们不能在Java中指定publicprivate或者protected继承这一点与C是相同的。此外在衍生类中的优先方法不能减少对基础类方法的访问。例如假设一个成员在基础类中属于public而我们用另一个方法代替了它那么用于替换的方法也必须属于public编译器会自动检查。 (33) Java提供了一个interface关键字它的作用是创建抽象基础类的一个等价物。在其中填充抽象方法且没有数据成员。这样一来对于仅仅设计成一个接口的东西以及对于用extends关键字在现有功能基础上的扩展两者之间便产生了一个明显的差异。不值得用abstract关键字产生一种类似的效果因为我们不能创建属于那个类的一个对象。一个abstract抽象类可包含抽象方法尽管并不要求在它里面包含什么东西但它也能包含用于具体实现的代码。因此它被限制成一个单一的继承。通过与接口联合使用这一方案避免了对类似于C虚拟基础类那样的一些机制的需要。 为创建可进行“例示”即创建一个实例的一个interface接口的版本需使用implements关键字。它的语法类似于继承的语法如下所示 public interface Face { public void smile(); } public class Baz extends Bar implements Face { public void smile( ) { System.out.println(a warm smile); } } (34) Java中没有virtual关键字因为所有非static方法都肯定会用到动态绑定。在Java中程序员不必自行决定是否使用文章出处飞诺网(http://dev.firnow.com/course/3_program/c/cppjs/20090403/164032.html)JAVA和C都是面向对象语言。也就是说它们都能够实现面向对象思想封装继承多态。而由于C为了照顾大量的C语言使用者 而兼容了C使得自身仅仅成为了带类的C语言多多少少影响了其面向对象的彻底性JAVA则是完全的面向对象语言它句法更清晰规模更小更易学。它是在对多种程序设计语言进行了深入细致研究的基础上据弃了其他语言的不足之处从根本上解决了c的固有缺陷。 Java和c的相似之处多于不同之处但两种语言几处主要的不同使得Java更容易学习并且编程环境更为简单。 转自http://club.topsage.com/thread-265349-1-1.html Java并不仅仅是C语言的一个变种它们在某些本质问题上有根本的不同 1Java比C程序可靠性更高。有人曾估计每50行C程序中至少有一个BUG。姑且不去讨论这个数字是否夸张但是任何一个C程序员都不得不承认C语言在提供强大的功能的同时也提高了程序含BUG的可能性。Java语言通过改变语言的特性大大提高了程序的可靠性。 2Java语言不需要程序对内存进行分配和回收。Java丢弃了C 中很少使用的、很难理解的、令人迷惑的那些特性如操作符重载、多继承、自动的强制类型转换。特别地Java语言不使用指针并提供了自动的废料收 集Examda提示: 在Java语言中内存的分配和回收都是自动进行的程序员无须考虑内存碎片的问题。 3Java语言中没有指针的概念引入了真正的数组。不同于C中利用指针实现的“伪数组”Examda,Java引入了真正的数组同时将 容易造成麻烦的指针从语言中去掉这将有利于防止在c程序中常见的因为数组操作越界等指针操作而对系统数据进行非法读写带来的不安全问题。 4Java用接口Interface技术取代C程序中的多继承性。接口与多继承有同样的功能但是省却了多继承在实现和维护上的复杂性。 Java和C各有各的优势无需争论那种语言好哪种语言不好能够存在就一定有它的优势只要你决定了要学编程就扎实的学好编程语言都是相同的学会一种其他的学起来就很容易了。 具体来说有以下几点 1指针 JAVA语言让编程者无法找到指针来直接访问内存并且增添了自动的内存管理功能从而有效地防止了c/c语言中指针操作失误如野指针所造成的系统崩溃。但也不是说JAVA没有指针虚拟机内部还是使用了指针只是外人不得使用而已。这有利于Java程序的安全。 2多重继承 c支持多重继承这是c的一个特征它允许多父类派生一个类。尽管多重继承功能很强但使用复杂而且会引起许多麻烦编译程序实现它也很不容易。Java不支持多重继承但允许一个类继承多个接口(extendsimplement)实现了c多重继承的功能又避免了c中的多重继承实现方式带来的诸多不便。 3. 数据类型及类 Java是完全面向对象的语言所有函数和变量都必须是类的一部分。除了基本数据类型之外其余的都作为类对象包括数组。对象将数据和方法结合起来把它们封装在类中这样每个对象都可实现自己的特点和行为。而c允许将函数和变量定义为全局的。此外Java中取消了c/c中的结构和联合消除了不必要的麻烦。 4. 自动内存管理 Java程序中所有的对象都是用new操作符建立在内存堆栈上这个操作符类似于c的new操作符。下面的语句由一个建立了一个类Read的对象然后调用该对象的work方法 Read rnew Read() r.work() 语句Read rnew Read()在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作不需要程序员进行删除。而c中必须由程序贝释放内存资源 增加了程序设计者的负扔。Java中当一个对象不被再用到时无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的利用空闲时间工作。 5. 操作符重载 Java不支持操作符重载。操作符重载被认为是c的突出特征在Java中虽然类大体上可以实现这样的功能但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。 6. 预处理功能 Java不支持预处理功能。c/c在编译过程中都有一个预编泽阶段即众所周知的预处理器。预处理器为开发人员提供了方便但增加了编译的复杂性。JAVA虚拟机没有预处理器但它提供的引入语句(import)与c预处理器的功能类似。 7. Java不支持缺省函数参数而c支持 在c中代码组织在函数中函数可以访问程序的全局变量。c增加了类提供了类算法该算法是与类相连的函数c类方法与Java类方法分相似然而由于c仍然支持c所以不能阻止c开发人员使用函数结果函数和方法混合使用使得程序比较混乱。Java没有不包含在类中的函数作为一个比c更纯的面向对象的语言Java强迫开发人员把所有例行程序包括在类中事实上用方法实现例行程序可激励开发人员更好地组织编码。 8. 字符串 c和c不支持字符串变量在c和c程序中使用Null终止符代表字符串的结束在Java中字符串是用类对象(strinR和stringBuffer)来实现的这些类对象是Java语言的核心用类对象实现字符串有以下几个优点 (1)在整个系统中建立字符串和访问字符串元素的方法是一致的 (2)Java字符串类是作为Java语言的一部分定义的而不是作为外加的延伸部分 (3)Java字符串执行运行时检空可帮助排除一些运行时发生的错误 (4)可对字符串用“”进行连接操作。 9. goto语句 “可怕”的goto语句是c和c的“遗物”它是该语言技术上的合法部分引用goto语句引起了程序结构的混乱不易理解goto语句子要用于无 条件转移子程序和多结构分支技术。鉴于以广理由Java不提供goto语句它虽然指定goto作为关键字但不支持它的使用使程序简洁易读。 l0. 类型转换 在c和c中有时出现数据类型的隐含转换这就涉及了自动强制类型转换问题。例如在c中可将一浮点值赋予整型变量并去掉其尾数。Java不支持c中的自动强制类型转换如果需要必须由程序显式进行强制类型转换。 11. 异常 JAVA中的异常机制用于捕获例外事件增强系统容错能力 try{//可能产生例外的代码 }catch(exceptionType name){ //处理 } 其中exceptionType表示异常类型。而C则没有如此方便的机制。