查看文章 |
Java更Object Oriented,在Java中,一切都是对象,甚至控制台入口main函数都被放入了一个对象作为静态方法——看上去有点穷折腾。 Java的对象都从堆中分配,C++的自动变量都是从栈里面分配的,我想这大概是有历史原因的——在16位操作系统时,从栈里面寻址要比从堆里面快(前者只需改变一下SP的值,后者还需要将数据段地址左移4位再加偏移量) Java的函数都是传地址的,就像C++里的引用,所以函数调用一次,参数值就会改变;而C++的参数默认是传值的,就是说把参数复制一份,原来的参数在函数调用后值不变。除非你显式地用引用来改变参数值。 Java动态申请的内存分配后不需要你操心释放,因为有GC Garbage Collection垃圾收集器,算法是只有当内存耗尽才对不再使用的对象回收内存;C++必须由程序员显式地调用delete来释放内存,这样比较灵活,但也加重了程序员的负担,容易造成内存泄漏错误。 Java程序的代码运行在虚拟机上,天然就是跨平台的;C++的代码和操作系统关系密切,移植起来比较费力,但因为是本地代码,并且在编译时可经过各种优化,效率非常高。 Java要启动一个线程需要实现一个接口Runnable,编写其中的run()方法;C++可以直接用系统API(如果是windows下的话)AfxBeginThread()就可以。线程同步可以直接借助OS提供的核心对象:事件,互斥量等。用waifForSingleObject()完成同步。 Java解决名字冲突的方式是包:Package,并且在Java中,低级抽象源文件已经很少被使用;在C++中还遗留着来自c的头文件等,后来C++也使用名字空间这种机制,类似于java的包。 Java用关键字Interface强调了接口,Java中的接口就是C++中的抽象基类——在Java中有专门的关键字Abstract来修饰不加实现的方法(C++里的纯虚函数),而C++在则是function()=0;有点土。并且从接口继承来的类,需要用implements,而C++仍不加区别的用“:”表示继承关系。 Java不再体现操纵系统的重要概念:进程;C++继续体现。\ Java的接口相当于C++的头文件,Java叫Import,你引了没有?C++叫include,你包含了没有? Java类的每个成员都需要显式地标明属性是public、private还是protected,C++只需要在改变时标明,否则下面一列都是第一个成员的属性。 关于常量修饰符:Java的final只保护引用名和被引用对象的关系,而C++的const保护对象本身不被改变,所以final像婚约,并不能保证被引用对象的变化,而C++的const才真正的矢志不渝(当然,你要是非用指针来强制改变内存,const也帮不上忙) 总之,Java让程序员操心少了,开发效率提高了,运行效率下降了(相对C++而言),如果说C++是一杆狙击枪;那Java就是一挺机枪。 |
