本文仅从片面的角度比较Java与C++的一些特性,如有错误的地方,请指正。
语言特性上的一些差异:
1、Java没有无符号整数,C++/C#都有。
2、Java中不存在指针。Java的引用是功能弱化的指针,只能做“调用所指对象的方法”的操作,C#默认不使用指针,在unsafe标识时可以使用。
3、Java不能用双等号比较字符串(注意常量池中的字符串),C++/C#可以。
4、Java强制局部变量初始化。
5、Java不支持自动类型转换,必须强制类型转换。
6、Java和C#没有宏。
7、C++经过编译连接后生成二进制代码,C#生成MSIL,Java生成字节码。
8、Java和C#有垃圾回收机制(GC),C++需要手动释放资源,可能会因失误忘记释放资源而造成内存泄漏等问题(C++11提供智能指针来解决这一问题)。
类机制上的一些差异:
1、 Java是完全面向对象的,所有方法都必须写在类中,C++既可以面向过程也可以面向对象,函数不必须写在类中。为了避免命名重复与实现代码重用性,C++和C#使用命名空间,Java使用包。
2、 Java中有强制性异常(除RuntimeException外,必须在编译前处理),而C++没有。(C++ C# 和Java的捕获异常语法大体相同)
3、 Java所有对象都直接或间接继承自Object,并且提供接口机制,C++没有共同的基类。
4、 Java在重写时默认为虚函数,而C++必须用virtual说明。
C++:
1 class A 2 { 3 public: 4 void virtual FUN() //修改这里的virtual 5 { 6 cout<<"FUN in A is called"<<endl; 7 } 8 }; 9 10 class B : public A 11 { 12 public: 13 void FUN() 14 { 15 cout<<"FUN in B is called"<<endl; 16 } 17 }; 18 int main() 19 { 20 A a; 21 B b; 22 A *p; 23 p = &a; 24 p->FUN(); 25 p = &b; 26 b.FUN(); 27 return 0; 28 } 29 /* 30 有virtual时结果 31 FUN in A is called 32 FUN in B is called 33 */ 34 /* 35 删去virtual时结果 36 FUN in A is called 37 FUN in A is called 38 */
Java:
1 class A{ 2 public void FUN(){ 3 System.out.println("FUN in A is called"); 4 } 5 } 6 class B extends A{ 7 public void FUN(){ 8 System.out.println("FUN in B is called"); 9 } 10 } 11 public class VirtualTest { 12 public static void main(String args[]) { 13 A a = new A(); 14 B b = new B(); 15 A p; 16 p = a; 17 p.FUN(); 18 p = b; 19 p.FUN(); 20 } 21 } 22 /* 23 默认为virtual 24 FUN in A is called 25 FUN in B is called 26 */
5、 Java因会与方法重载产生语义二义性而不支持默认参数。
6、 C++有运算符重载,和类型转换函数,而Java中没有。