您的位置:首页 > 编程语言 > C语言/C++

Java与c++异同 小结

2016-04-10 22:40 323 查看

1. Java的char与byte–和C++中的是不同的

在C++中:

在C++中,char是基础数据类型,8位,1个字节。byte不是基础数据类型,一般是typedef unsigned char byte;这样子的,也就是说,byte其实是unsigned char类型,那么也是8位,1个字节。不同的是,char可以表示的范围是-128-127,而byte可以表示的范围是0-255。

在Java中

在java中,char和byte都是基础数据类型,其中的byte和C++中的char类型是一样的,8位,1个字节,-128-127。但是,char类型,是16位,2个字节,’\u0000’-‘\uFFFF’。

为什么java里的char是2个字节?

因为java内部都是用unicode的,所以java其实是支持中文变量名的,比如string 世界 = “我的世界”;这样的语句是可以通过的。

补充:

C++中,某些数据占多少位,多少字节,是与机器操作系统,硬件,有关系的。

而java中,是与操作系统,硬件无关的,因为java是运行在虚拟机上的,所以数据大小都是固定的。

顺便,java中的long是固定8字节,64位;int是4字节,32位。

2. Java与c++中的引用

在Java中,引用完全不透明,引用的表示方式由Java运行时的实现细节决定。不同于c/c++, Java程序无法使用任何方法处理引用。

3. 虚拟方法查找

在java中,javac生成的字节码会在运行时使用”虚拟方法查找”(virtual method lookup) ,即解释器运行代码时,会查找适用于各个对象的同名方法

而在C++中,默认不支持虚拟查找,如果程序员想在子类中覆盖方法,要显式的使用virtual 关键字。

4. equals方法覆盖

在java中,如果覆盖了equals()方法,则必须覆盖hashCode()方法,这样才能保证相等的对象具有相同的哈希码。如果不这样做,程序可能会出现难以排查的问题。

5. 布尔值的区别

在java中,不可以将一个非布尔值当做布尔值在逻辑表达式中使用。

6. 零扩展

在java中,增加了一种”无符号”右移位操作符(>>>),无论正负,都在高位插入0。

7. 垃圾回收与析构

在java中:

1. 对象可能不被垃圾回收

注:如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

2. 垃圾回收不等于”析构”

3. 垃圾回收只与内存有关

8. 指定初始化

在java中,可以在定义类成员变量的地方为其赋值,而c++中则不能这么做。

E.g.

public class InitialValue {
char ch = 'x';
int i = 999;
}


9. 对象创建过程

在java中:

假设有名为Dog的类,那么:

1. 首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,已定位Dog.class。

2. 然后载入Dog.class,有关静态初始化的所有动作将会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

3. 当用
new Dog()
创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。

4. 这块存储空间会被清零,这就自动的将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说是0,对布尔型和字符型也相同),而引用则被设置为null。

5. 调用基类构造器。

6. 执行所有出现在字段定义处的初始化动作。

7. 调用导出类的构造器主体。

在C++中:

1. base classes更早于其derived classes被初始化。

2. class的成员变量总是以其声明次序被初始化。

特别的,有构造函数执行算法:

1. 在derived class constructor 中,所有virtual base classes及上一层base class的constructors会被调用。

2. 上述完成之后,对象的vptr(s)被初始化,指向相关的virtual table(s)。

3. 如果有member initialization list的话,将在constructor体内扩展开来。这必须在vptr被设定之后才做,以免有一个virtual member function 被调用。

4. 最后,执行程序员提供的代码。

10. 名称屏蔽(继承关系中)

在Java中如果基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。

而在C++中,派生类会覆盖基类中的同名方法(如果派生类中已经声明)。

11. 向下转型和运行时类型识别

在Java中所有转型都会得到检查,如果不符合转换条件,就会返回一个ClassCastException(类转型异常)。

在C++中,我们必须执行一个特殊的操作(dynamic_cast)来获得安全的向下转型。

12. 多重继承

在C++中,组合多个类的接口的行为被称作多重继承。它可能会让你背负很沉重的包袱,因为每个类都有一个具体的实现。

在Java中,你可以执行相同的行为,凡是只有一个类可以有具体实现。

Java允许接口的多重继承,但是不允许类的多重继承。

13. 嵌套类

在Java中,内部类一方面是一种名称隐藏和组织代码的模式,另一方面,当生成一个内部类的对象时,此对象与制造它的外围对象(enclosing object)之间就有了一种联系,所以它能访问其外围类的所有成员,此外,内部类还拥有其外围类的所有元素的访问权。

在C++中,嵌套类是一个独立的类,与外层类基本没什么关系。特别是,外层类的对象和嵌套类的对象是相互独立的。嵌套类中成员的种类与非嵌套类是一样的。与其他类类似,嵌套类也使用访问控制符来控制外界对其成员的访问权限。

参考链接

/article/2729501.html

etc.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: