Java的设计者曾说过,设计这门语言的灵感主要来自于C++。

世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史。所以在Java语言学习过程中,将其与C++语言对比是一件有意义的事情。通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的。

下面我总结一下Java语言与C++语言的各种差异。

1、Java用来操纵对象的引用可以先初始化再指向对象,而C++的引用必须在初始化时就指向对象。

2、Java类除static和final外其他函数定义默认是虚函数,而C++用virtual关键字定义定义函数才是虚函数。

3、Java有一套继承自object类型的单根继承结构,而C++没有标准库内置的类继承体系。

4、Java只能通过new在堆上创建对象,基本类型除外,而C++除了new还是可以创建全局对象或者栈对象。

5、Java有自带垃圾回收机制,不用关心对象的内存释放,而C++需要手动释放通过new创建的对象。

6、Java数组成员能初始化默认值null,提供未初始化的访问和越界访问保护,而C++不提供这个机制。

7、Java局部作用域定义的变量不能隐藏更大作用域定义的变量,而C++可以隐藏。

8、Java类的基本类型成员变量可以自动初始化为默认值,类的复杂类型成员变量或者函数的基本类型成员变量如果没有初始化会报编译错误,而C++不提供这个机制。

9、Java属于纯面对对象语言,函数只能定义在类里,而C++可以将函数定义在类外。

10、Java函数调用时入参传递,对象类型参数只能传引用不能传值,基本类型参数可以传值,而C++可以使用对象传值方式。

11、Java用带反转域名的类库命名方式来解决名字污染问题,而C++使用名字空间来解决。

12、Java类所有成员函数实现和变量初始化都要写在类定义里,而C++类成员函数在类定义里申明,在类外实现,成员变量可以在类定义里初始化。

13、Java通过类名来引用类的静态成员时,是用类名加.号来引用,而不是C++的:号来引用。

14、Java每个文件只能有一个public类的名称与文件名称相同,包外可以访问这个类但是无法访问其他类,并且这个类有一个main函数,而C++没有这个约束。

15、Java注释采用特定的格式时,可以用javadoc来解析成帮助文档,而C++不提供这个机制。

16、Java支持>>>操作符的无符号移位方式,不论正负数都用0填充,而C++没有这个操作符。

17、Java不支持操作符重载机制,而C++支持这个机制。

18、Java没有sizeof操作符,因为所有数据类型在所有机器中的大小是相同的,而C++支持sizeof操作符且数据类型在不同机器里大小不一定一致。

19、Java不支持从整形到布尔型的转换,而C++支持这个机制。

20、Java支持foreach方式的遍历数组或容器的循环方法,而C++不提供这个机制。

21、Java支持带标签的continue和break语句,用以提供有限的类似C++ goto语句的功能。

22、Java不支持C++的析构函数,但是提供了一个finalize函数,会在垃圾回收之前执行,但是除了一些特殊情况外应尽少使用finalize函数去释放资源,而是在程序中主动显式的去释放资源。

23、Java类的静态成员只有在类被第一次实例化或者第一次访问类的静态成员时才会初始化一次,而C++类的静态成员在类实例化前就被初始化了,且跟类是否有实例化没关系。

24、Java没有C++类成员初始化列表,只能在类成员被定义后再显示给类成员赋值。

25、Java数组不能越界写,否则会报错误,而C++不提供这个机制。

26、Java不支持预编译宏机制,因为它不用考虑跨平台差异编译控制,而C++支持这个机制。

27、Java提供包访问控制权限能让包内的类互相访问,而包外的类不能访问包内的类,而C++不提供这个机制。

28、Java支持给类设定public或包访问控制权限,而C++不提供这个机制。

29、Java所有非基本类型对象都有一个特殊的toString方法,用于将对象转变成String对象,而C++要靠定义String操作符处理函数来实现。

30、Java支持在子类不会覆盖父类的同名函数,并且可以用super关键字来显示调用父类的函数,而C++的子类会直接覆盖父类的同名函数。

31、Java中子类构造函数中通过super关键字来显示初始化父类的构造函数,而C++直接调用父类构造函数来进行初始化。

32、Java支持关键字final用于定义常量、不能改变的函数参数、不能被覆盖的方法和不能被继承的类,而C++对于前两种通过通过define和const关键字支持,对于后两种不支持。

33、Java用abstract关键字表示类的抽象方法,而C++用类似的纯虚函数来表示。

34、Java支持用interface定义一个类为接口类,接口类里只能存在抽象方法,并用implements来实现这个接口类,而C++不提供这个机制。

35、Java的多重继承只支持从一个抽象基类或具体基类加多个接口基类派生,或者通过多个抽象的内部类来派生,而C++支持从任意数量抽象基类或具体基类派生。

36、Java拥有类似闭包功能的内部类,能够访问外部类的成员,而C++的嵌套类不支持这个机制。

37、Java容器有公共基类collection,如果容器如果没有指定类型,那么里面保存的对象默认都是Object类型,而C++容器没有这些特性。

38、Java的异常机制支持finally关键字,能够保证不论异常是否被匹配上都会执行finally关键字的代码,而C++不提供这个机制。

39、Java标准库支持正则表达式,而C++不提供这个机制。

40、Java支持反射机制,其区别于RTTI的是不需要在编译时确定类的类型信息,而是在运行时才确定类的类型信息,通过Class类可以获取类名、成员变量、方法和创建类对象等,而C++只支持RTTI机制。

41、Java泛型里基本类型不能作为泛型参数,需要用到包装类型,比如int类型要包装成Interger类型,原因是泛型对象被擦除成Object类型了,而Object类型不能存储int类型只能存储Interger类型,C++没有这个问题。

42、Java泛型在运行期,无法获取泛型参数的类型信息,在编译期做完类型一致性检查后,对象的类型信息就被擦除了,被转换成Object类型,运行期不能创建这种参数类型的对象,且只能调用Object或不带泛型参数类型对象所拥有的方法,一个补偿的办法是为泛型增加边界,泛型只会擦除到它的第一个边界,通过设定边界就能够调用这个边界类型所拥有的方法,而C++模板没有这个问题。

43、Java泛型支持通配符机制,<?extends T>表示某种从类型T派生的类型,<? super T>表示某种类型T的基类型,<?>表示非Object的某种类型,而C++不支持这个特性。

44、Java为数组操作提供Arrays类,包含一些静态函数,而C++通过C库来完成一些操作,但没有Java的Arrays类丰富强大。

45、Java容器支持可选操作,某个类型的对象可以不支持这些接口,如果对这种对象调用这个接口就会抛出UnsupportedOperationException异常,这种动态语言特性C++不支持。

46、Java的标准输入输出对象是System.in/System.out,而C++是cin/cout。

47、Java中的enum类型比较像类,可以有方法,除了不能继承,而C++的enum不提供这个机制。

48、Java支持注解机制,可以在代码中嵌入一定格式的元数据,而C++不提供这个机制。

49、Java的线程库提供Thread.yield()方法,能够主动让出线程的执行权,而C++不支持这个特性。

50、Java语言支持内置的synchronized关键字来标记一个方法或语句块受到锁的保护,并且一个对象的所有synchronized方法或一个类的所有静态synchronized方法共享同一个锁,而C++不提供这个机制。

51、Java的Object.wait()会暂停当前线程进入睡眠状态,同时会释放持有的锁,当另一个进程调用Object.notify()后,睡眠线程会重新持有锁,然后被唤醒继续执行,而C++在调用操作系统的同类函数时,是不能在持有锁的时候睡眠的,因为睡眠不会释放锁。

Java语言与C++语言的差异总结的更多相关文章

  1. 【转载】Java与C++语言在作用域上的差异浅析

    http://developer.51cto.com/art/200906/126199.htm 差异一:变量作用域的不同 如下面这段程序代码是符合C++语言的语法要求的.其可以在C语言下正常运行.但 ...

  2. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  3. JAVA语言对比C++语言的几个优点和自身的关键特性

    之所以写这篇博客不是为了比较JAVA语言和C++语言到底孰优孰劣,而是从语言本身出发进行对比总结程序编码设计上的差别.因水平有限,某些内容可能太过片面,欢迎指正和讨论. JAVA语言在设计上很好地借鉴 ...

  4. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  5. java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性

    java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...

  6. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  7. Java编写的C语言词法分析器

    Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...

  8. Java学习笔记--脚本语言支持API

    Java语言的动态性之脚本语言支持API 随着Java平台的流行,很多的脚本语言(scripting language)都可以运行在Java虚拟机啊上,其中比较流行的有JavaScript.JRuby ...

  9. JAVA入门之基础语言

    在上一章文章中,读者已经了解了如何搭建Java 开发环境及Java 程序的开发过程.从本篇文章开始讲解Java 的基本语言.这些基本语言的语法和其他一些编程语言相比有些是类似的,但还有很多不同之处,读 ...

随机推荐

  1. 将VLC库封装为duilib的万能视频播放控件

    转载请说明出处,谢谢~~ 昨天封装好了基于webkit的浏览器控件,修复了duilib的浏览器功能的不足,而我的仿酷狗播放器项目中不光需要浏览器,同时也需要视频播放功能,也就是完成MV的功能.所以我打 ...

  2. LeetCode题解——Regular Expression Matching

    题目: 正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次. 解法: 一定要注意'*'必须结合前面的字符一起使用. 代码: class S ...

  3. JS数组(Array)操作汇总

    1.去掉重复的数组元素.2.获取一个数组中的重复项.3.求一个字符串的字节长度,一个英文字符占用一个字节,一个中文字符占用两个字节.4.判断一个字符串中出现次数最多的字符,统计这个次数.5.数组排序. ...

  4. <Araxis Merge>Windows平台下的Merge概览

    它是什么 Merge是一个来自Araxis的可视化文件比较/合并及文件夹同步的应用程序. 用户界面使用英语.德语.日语.法语.国际西班牙语.汉语(繁体和简体)进行本地化了. 优势 对于软件工程师和网站 ...

  5. 《Java数据结构与算法》笔记-CH4-3用栈实现分隔符匹配

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 利 ...

  6. 第二百八十七天 how can I 坚持

    终于把假请下来了,没有想象的那么复杂. 忘退车票了.明天应该有手续费了,现在又维护了,哎.10%的手续费了.7块钱,没了.希望不会白回去一趟啊. sql,group by  having .还是学不会 ...

  7. 黄金点游戏之客户端(homework-05)

    0. 摘要 之前我们玩了2次黄金数游戏,我也幸运的得到了一本<代码大全>,嘿嘿.这次的作业是一个Client/Server程序,自动化完成多轮重复游戏. 我完成了Client部分,使用C# ...

  8. JNI调用测试

    有需求使用JNI调用,籍着这个机会按照<Linux下测试Java的JNI(Java Native Interface)>上进行了下测试. 这篇文章记录得很清楚了,对原理未做深入的分析,希望 ...

  9. 问题-FireDAC连接Sqlite3提示“unable to open database file”

    相关资料:http://www.dfwlt.com/forum.php?mod=viewthread&tid=1497&extra= 问题现象:FireDAC连接Sqlite3在开发电 ...

  10. 【C++专题】static_cast, dynamic_cast, const_cast探讨

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...