Java vs C++:两种主流编程语言的差异对比

来源:互联网 发布:蹭网器淘宝叫什么 编辑:程序博客网 时间:2024/06/06 04:49

       Java和C++作为最近十几年应用最广泛,影响最深远的语言,有它们相似的地方,但根本理念还是有很大差异的。C++被直接设计为C的超集,这给它带来了很多虔诚的使用者,也带来了很多历史包袱。作为既实现面向对象,泛型又效率极高的语言;在内存效率不再那么重要的情况下,C++的应用领域不可避免的越来越窄。而Java,不直接继承自C,但考虑到其创始人詹姆斯·高斯林曾经用了十几年的C语言编程,想来他在设计Java的时候是在深入根植于C而设计。Java是一门纯面向对象的语言,也是一门面向应用的语言,它强大的类库让人能很快做出一些很有意思的东西出来。下面就各方面谈下Java与C++不同的地方:

 

基本语法

1.总的来说,C++和Java基本语法类似,都根植于C,但Java根据自己需要做了一点修改

2.就基本数据类型,Java和C++主要都是整型、浮点型和布尔型。微小的区别是,Java多了byte;C++用bool,Java是 boolean。其次,Java的所有primitive类型都有对应的包装器容器类型,通过包装变成对象才能放入Java内置的Collections中。

还有就是,Java是类型安全的语言,整型,浮点型和布尔型之间不支持隐式类型转换。

3.复合类型方面,首先,Java没有指针。其次,Java的引用与C++的引用很不一样:C++的引用作用是别名,从实现上来讲是常量指针;而Java 引用则是用以绑定对象,更像是一个封装的指针。

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

   这点把Java的引用当做指针,把C++的引用当做常量指针的话就很容易理解了。

5.Java类的基本类型成员变量可以自动初始化为默认值,类的复杂类型成员变量或者函数的基本类型成员变量如果没有初始化会报编译错误,而C++不提供这个机制。这一点个人认为很重要:这点决定了C++的构造函数规则要比Java复杂的多。数据成员得按顺序赋值,专门引进构造函数初始化列表来提高效率等。Java就方便很多,反正构造函数里没有初始化的成员可以被设为默认值。

6.C++中,除了极少数运算符,都可以重载,而Java不行。

7.Java没有sizeof操作符,因为所有数据类型在所有机器中的大小是相同,没有必要。而C++中经常使用,题库里这样的题很多。

8.Java支持foreach方式的遍历数组或容器的循环方法,而C++11才加入这个机制

9.const和final:C++用const修饰常量,Java用final,两者都可以修饰常量和不可改变的参数类型。同时final还可以修饰不可继承的类,不可覆盖的方法。

10.全局变量:Java没有全局变量,但public static变量可以充当全局变量且封装性更好,public static final类似全局常量。

11.Java的逻辑运算符有两种,短运算符&&和||,同C++一样,支持短路运算; 长运算符&和|,不支持短路运算。

     这方面,得感谢Java的类型安全,在C++中,由于可以类型转换,&和|不可能同时实现逻辑运算和位运算。


面向对象:继承与多态


1.Java中所有类都继承自Object,形成一个继承体系。而C++没有这样一个终极类。Object并非抽象类,有几个方法,如equals(),toString(),hashCode(),无需覆盖 。

2.Java属于纯面对对象语言,函数只能定义在类里,而C++可以将函数定义在类外。并且C++是鼓励将较大的程序块写在类外的,写在类内会自动inline。

3.C++和Java在没有声明Constructor时都会有编译器创建的默认构造函数;声明任意Constructor后都不会有默认构造函数。Java用super()显式调用父类构造函数,C++则没有这个关键字

4.Java没有析构函数

5.C++继承分private继承,public继承和protected继承。而Java不分,相当于是公有继承。它们的共有继承都表达了is-A的关系。C++的私有继承表现了Has—A的关系。 Effective C++这本书上的观点是protected继承没啥意义,私有继承的话最好用Composition的关系代替。

6.数据成员:都表征类属性。Java的属性都类内初始值。

7.成员函数/方法:都表征类行为。Java类除static和final外其他函数定义默认是虚函数,而C++用virtual关键字定义定义函数才是虚函数。

8.多重继承:C++支持多重继承,Java不支持多重继承,Java通过接口和内置类来实现C++多重继承的功能。




泛型与容器

1.Java容器有公共基类Collections,下分Set,Map和List。如果容器如果没有指定类型,那么里面保存的对象默认都是Object类型,而C++容器没有这些特性。

2.Java的泛型基本都是用于集合(容器)操作的,是在Java后来引用来指定集合中类型一致的。而C++的泛型是用来实现类型无关,减少重复代码的。

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



类库

Java有丰富的类库功能,且提供JDK文档下载或在线查询功能。这也是Java最强大之处。相比而言,C++的标准库略显单薄,boost库可能内容很多,不过对此并不熟悉。下面说下Java几个重要的类库。

1.集合Collections,对应C++的容器。

2.线程Thread,可以方便的进行多线程并发编程。

3.数据库编程:JDBC

4.网络编程:socket

5.web编程:JSP,Servelet,EJB

6.图形界面编程:Swing,AWT,JavaFX

此外,Java还有SSH三大框架



其他

1.Java的异常机制支持finally关键字,用以包含异常处理后肯定会执行的代码。Java注释采用特定的格式时,可以用javadoc来解析成帮助文档,而C++不提供这个机制。

2.Java用带反转域名的类库命名方式来解决名字污染问题,而C++使用名字空间来解决。这里需要说明的是:它之间的.运算符并不代表分支结构,可以看成是名字的一部分。比如java.rmi.server.*并不是java.rmi.*的子集。

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




欢迎补充。。。

参考:CSDN博客和《Head First Java》


































































































































































































































































阅读全文
0 0
原创粉丝点击