C++和Java区别

 
(1)      Java 有垃圾回收机制,当然也就没有 C++ 的析构函数。但是,可控制性和 C++ 相比就差了一点,而且也不是说有了垃圾回收,就不会产生内存泄漏。由于相互引用等原因可能造成对象的生存周期过长,垃圾回收失效。对象内存的回收,个人认为应该是由程序员来掌握的事情。 C++ 可以用 auto_ptr,shared_ptr 等智能指针来完成自动析构,当然前提是你要熟悉他们的实现机制和应用场合
(2)      Java 中所有的对象都是分配在堆上,在 Java 中只有句柄,也就是引用,没有指针。这样做有哪些好处呢 ? a) 没有指针。在 java 中没有 sizeof, 没有 * 。看看下面这些语句吧,感觉是不是很象。 b) 避免了临时对象。在 Java 中所有的对象都是以句柄表示,函数参数传递,结果返回等都是以句柄形式。也就避免了 C++ 中经常出现的局部指针局部引用问题 , 对象参数拷贝赋值,切片等问题 , 提高了效率和可靠性。
String a = new String(“123”); // Java Code
std::string *a = new string(“123”);  //c++ code
(c) Java 中,包含关系只能由句柄表示。
(3) Java 是单根继承体系,而 C++ 可以有多重继承。 java 可以用 interface 来实现多重继承。来谈谈 Java 中的 Object 类,许多有趣的地方。
Clone 方法, C++ 也可以实现,呵呵, 虚拟构造函数 ,参见 <<More Effective C++>>
Equals 方法 , 由于 Java 中对象只能由句柄表示,又没有 C++ 操作符重载的能力,所以这个来比较等价对象。 C++ 中我们可以重载 ”==” 操作符来判断等价对象。
Finalize 方法,呵呵,类似于析构函数,但是千万不要当成析构函数来用哦,这个方法何时调用不是你能把握的,取决于垃圾回收机制
hashCode 方法, STL 没有 HashMap,HashTable 等,但是 java.util 中有,所以 …..
剩余的都是满足线程和同步的方法,跟 C++ 没有可比性
(3)      java 中数组也是对象,所以当你下标越界的时候,会收到一个异常。而 C++ 数组显然要比 Java 快点,因为他不检查 index
(4)      java 中, ”123” 这种字符串也是对象,而在 C++ 中确是 const char*, 最让人范错的是那个字符串结束符。但是 java c++ 对这种 const char* 字符去有相同的优化,试试下面的代码:
String a = "123";                             
String b = "123";
if (a == b)
{
   System.out.println("OK");
}
 C++ 代码 :
const char *p = "123";
const char *q = "123";
    if ( q == p)
    {
         std::cout<<"OK"<<std::endl;
    }
(5)     Java中所有的对象方法都是virtual, 除了声明为final的方法。
(6)     没有操作符重载
(7)     语言级的序列化机制, C++也可以实现,呵呵,看看C++高手对话中的,那位用模板模式来实现序列化。
(8)     语言级的线程类极其配套互斥类等
(9)     语言级的异常体系。C++中的异常少的可怜,就STL中那几个,当然C++要的就是高效
(10)  Java反射机制
哎,从反射机制就可以看出来,Java和C++根本就没有可比性嘛。编译器能和平台比吗。那天我在公司论坛上说Java是脚本,别人还一本正经跟我争,我觉得我自己很无聊啊
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值