Java语言与C++语言的差别总结

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

世上先有C++,而后才有Java,整个Java语言的发展历史就是一部对C++的填坑史。因此在Java语言学习过程当中,将其与C++语言对比是一件有意义的事情。经过这些对比,咱们可以了解到Java语言相对于C++语言有哪些改进,能带给咱们哪些进步,这样对于更加深刻理解这两种语言是大有裨益的。正则表达式

 

下面我总结一下Java语言与C++语言的各类差别。数组

一、Java用来操纵对象的引用能够先初始化再指向对象,而C++的引用必须在初始化时就指向对象。闭包

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

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

四、Java只能经过new在堆上建立对象,基本类型除外,而C++除了new仍是能够建立全局对象或者栈对象。操作系统

五、Java有自带垃圾回收机制,不用关心对象的内存释放,而C++须要手动释放经过new建立的对象。线程

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

七、Java局部做用域定义的变量不能隐藏更大做用域定义的变量,而C++能够隐藏。对象

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

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

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

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

十二、Java类全部成员函数实现和变量初始化都要写在类定义里,而C++类成员函数在类定义里申明,在类外实现,成员变量能够在类定义里初始化。

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

1四、Java每一个文件只能有一个public类的名称与文件名称相同,包外能够访问这个类可是没法访问其余类,而且这个类有一个main函数,而C++没有这个约束。

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

1六、Java支持>>>的无符号移位方式,不论正负数都用0填充,而C++根据第一个bit的值来决定是0填充仍是1填充。

1七、Java不支持操做符重载机制,而C++支持这个机制。

1八、Java没有sizeof操做符,由于全部数据类型在全部机器中的大小是相同的,而C++支持sizeof操做符且数据类型在不一样机器里大小不必定一致。

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

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

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

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

2三、Java类的静态成员只有在类被第一次实例化才会初始化一次,若是不实例化就不会初始化,而C++类的静态成员在类实例化前就被初始化了,且跟类是否有实例化不要紧。

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

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

2六、Java不支持预编译宏机制,由于它不用考虑跨平台差别编译控制,而C++支持这个机制。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4一、Java泛型里基本类型不能做为泛型参数,须要用到包装类型,好比int类型要包装成Interger类型,缘由是泛型对象被擦除成Object类型了,而Object类型不能存储int类型只能存储Interger类型,C++没有这个问题。

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

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

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

4五、Java容器支持可选操做,某个类型的对象能够不支持这些接口,若是对这种对象调用这个接口就会抛出UnsupportedOperationException异常,这种动态语言特性C++不支持。

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

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

4八、Java支持注解机制,能够在代码中嵌入必定格式的元数据,而C++不提供这个机制。

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

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

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

相关文章
相关标签/搜索