(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是脚本,别人还一本正经跟我争,我觉得我自己很无聊啊