C++和Java的区别:
(面试问到这个问题,特来总结一下 根据C++Prime和Think in Java两本书总结而来)
尽管Java是基于C++的的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。在Java中,一切都被视为对象。
1. C++创建对象之后,需要再使用完将其调用delete方法将其销毁;Java有垃圾回收机制,用来监视new出来的所有对象,辨别不会再被引用的对象,然后释放内存空间。
2. 作用域(C、C++、Java的作用域由花括号的位置决定):
但是以下代码在C和C++中是合法的,在Java中编译器会报告变量已定义。因为C和C++会将较大作用域的变量隐藏起来,但是Java不允许。
{
int x = 12;
{
int x = 96;
}
}
基本成员的默认值
当变量作为类的成员使用时,Java才确保给定默认值,以确保那些基本类型的成员变量得到初始化,但是C++没有此功能。而对于局部变量,C++编译器会对其予以警告,Java则会视为错误。
Java不可以将一个非布尔值当做布尔值在逻辑表达式中使用,C++却可以。
在C++中表达式的值为0则为假,非0则为真。
例如:
if(1){
}
移位操作符
Java中新增了一种“无符号”右移位操作符(>>>),它使用“零扩展”,无论正负,都在高位插入0。这是C、C++中所没有的。
C++引入了操作符重载机制,Java不支持,但是C#中可以实现自己的重载操作符。
Java允许我们把任何基本数据类型转换成别的基本数据类型,除了布尔类型外。
Java没有Sizeof()。在C\C++中,sizeof()操作符可以告诉我们为数据项分配的字节数,因为C++中不同的数据类型在不同的机器上可能有不同的大小。但是Java中所有数据类型在所有机器中大小都是相同的。(例如,C++的int在16位机器上为16位,在32及以上为32位,long在32位及以下为32位,在64位上为64位)
C++有goto,Java没有goto。
Java提供了一种类似的跳转机制:标签。用法 label:
label1:
outer-iteration{
inner-iteration{
break;(1)
continue;(2)
continue label1;(3)
break label1;(4)
}
}
(1)中,break中断内部迭代,回到外部迭代
(2)中,continue使执行点移回到内部迭代的起始处。
(3)中,continue label1同时终端内部迭代以及外部迭代,直接转到label1处;随后继续迭代,从外部迭代开始。
(4)break label1 也会中断所有迭代,并回到label1处,但是不重新进入迭代。即完全终止两个迭代。
10. C++中析构函数是提供一个在对象删除前可以释放这个对象所占用的资源的机会,但是Java并未提供“析构函数”或者类似的概念。
在C++中,对象一定会被销毁(程序没有缺陷的情况下);
在Java里,对象却并非总是被垃圾回收。(垃圾回收并不等于“析构”)
11. 名称屏蔽如果Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。而C++若要在子类中引入一个新的重载方法,则需要屏蔽基类方法。
12. C++中有多继承,Java中只有单一继承。Java可以通过接口实现多继承。
13. Java是半解释和半编译的,运行速度比C++慢。
14. Java没有Struct或者Union
15. Java的泛型不允许使用基本数据类型。
16. 数组
在c++中,数组定义时,已经分配存储空间,并可以使用。 (定义时指定数组大小)
在java中,数组定义时,int arr[],只字义了数组变量,数组是不可以使用的。 只有数组new以后,才会创建数组,分配存储空间,并可以使用。 (定义时指定数组大小是非法的,创建时指定数组大小)
17. C++有指针,Java没有。
18.附上C++在32位和64位系统的主要长度对比: