Java语言与CPP语言区别

最近有点空闲时间,学习了Java语言。教材《Java简明教程》第四版,清华大学出版社。本人以前有C++基础,所以主要总结下两者区别。

一、基本类型和运算

1.布尔常量,true和false不是数值,不能进行算术运算。而C++实际是整型。

2.字符串常量,Java作为对象,有自己的属性和方法。C++,采用‘\0’结束的字符数组。

3.字符型变量,Java采用Unicode编码,长度为16位,最大值65535。而C++是8位,最大值128。

4.局部变量检查,当局部变量和外层如类中全局变量相同时,提示编译错误。Java认为相同的命名会容易导致对程序的误解和混淆。C++则“小范围变量屏蔽大范围变量”。

5.变量赋值,类中未给出初始化值,将默认为0,或者空等。而C++不确定的值。

在方法中,未给出初始值,Java无法通过编译。C++则不会。

6.类型转换,int x=2+3.14; C++编译通过。Java编译失败,必须改成如下进行强制转换:

int x=2+(int)3.14;

7.引用,Java规定基本类型按值传递,对象类型按引用传递。返回值类似。但是Java引用是没有任何特殊标志,而C++则用‘&’表示。

8.%运算符,Java不但可以对整型运算,浮点型也可以。C++只能对整型运算。

总的来说,Java是一种强类型语言,对变量和常量的类型检验比较严格。但同时又具备更好的扩展性。

二、类和对象

1.首先,从编辑和文件管理而言,Java的类定义和实现放在一起。C++是分开的。

2.关键字this,Java中是特殊的引用,既可以指代对象,也可以指代构造函数(也只能放在构造函数的第一句,所以用在构造函数的重载函数中)。

而C++中,this只能是指向自己的指针,没有指向函数的功能。

3.Object类,Java所有其他类的祖先。C++没这个概念。因为Java基于类设计语言,C++可以基于函数。

4.关键字super,当父类定义了默认构造函数即无参数构造函数,子类可以自动调用父类的该构造函数。

但是当父类定义了带参数的构造函数时,子类必须通过super调用父类的该构造函数。C++通过初始化列表。

5.关键字final,可以修饰变量和参数,相当于C++中的const。也能修饰类和方法,表示不能被继承,表示终极类和终极方法。

6.关键字abstract,修饰类和方法,表示抽象类和抽象方法,一般用来被继承。修饰方法时,类似于C++中的纯虚函数。

三、字符串处理

C++对字符串处理常用数组,没有提供字符串对象,如果想要使用对象,则需要自己封装。而Java提供了两个类和一系列方法。

1. 变量和类型

1.1 Java没有无符号整数。(无符号右移在Java中强制用三个右尖括号表示)。

1.2 Java有内置类型String,而C++没有。C++的std::string是可变的,类似于Java的StringBuffer。

1.3 C++的整型随机器的位数而变化,但是Java不会。(C++的int在16位机器上16位,32位级以上为32位。long在32位及以下为32位,64位机器上为64位。)

1.4 Java字符串在内存中以Unicode存储,C++与源码的编码相同。

1.5 Java中不存在指针。Java的引用是功能弱化的指针,只能做“调用所指对象的方法”的操作。

1.6 Java的Stream对象(除了PrintStream)功能较单一,只能按字节读写,需要Reader或者Writer的辅助。C++的任何流都可以按字节、字符串、整形的方式读或者写。

1.7 Java是少数几种不能用双等号比较字符串的语言。

1.8 Java的泛型参数不允许是基元类型。(坑)

1.9 Java强制局部变量初始化。

2. 类机制

2.1 Java是完全面向对象的,所有方法都必须写在类中。

2.2 Java强制异常规约。

2.3 Java单根继承,所有对象都继承自Object。并且提供接口机制。

2.4 Java在覆盖时默认为虚函数。

2.5 Java没有默认参数。

2.6 Java中没有运算符重载,和转换函数。

2.7 Java无引用传值。(标准库中一般用Boxing代替。)

2.8 Java没有Struct或者Union。

2.9 Java可以委托构造,而C++14才加入这个特性。

2.10 Java的对象(包括数组)存放于堆上,用new实例化。C++可以选择存放于栈上或者堆上。

2.11 Java可以定义abstract类和final类,即必须被继承,或者无法被继承。C++直到C++1?才支持这个特性。

2.12 Java强制一个文件中只能有一个public的类/接口,并且文件路径强制为它的包名和类名。

3. 其它语言特性

3.1 Java没有delete运算符,由于有gc托管,无需delete。

3.2 Java没有typedef,以及任何和它作用相同的语法。

3.3 Java没有宏。(另一方面这也是种好处,宏是另一个万恶之源)。

3.4 Java使用点运算符做C++用::运算符的事情。而Java的::运算符可以将一个静态函数或者带着对象的动态函数变成一个闭包(Java8)。

3.5 Java的lambda表达式在Java8中被引入,C++是从C++11。

3.6 C++11中引入了range循环,Java是从Java5。

3.7 C++在查找名字时只查找当前代码文件中那行以上的部分。而Java的查找范围是整个项目。(这就是为什么C++需要include而Java不用。)

3.8 Java的标准库比较丰富(尤其是带GUI)。C++如果要实现相同的功能,除了第三方库之外,可以调用系统的api。

3.9 Java在8之前,switch不支持字符串。C++从11起支持短字符串的Switch(长度4字节之内,会映射成int来判断)。

3.10 由于Java是半编译半解释的,运行速度略慢。jvm启动速度不是一般的慢。

1.String类,常量,值不会改变。注意,关系操作符‘==’用于地址比较,而equals方法,用于内容比较。

2.StringBuffer类,带缓冲区的字符串,值可以被改变。

3.运算操作符,操作符‘+’可以连接两个String对象,不能连接两个StringBuffer对象。Java取消了运算操作符,但保留了String的‘+’和‘+=’。

4.StringBuffer对象到String对象的转换,通过toString()方法。

5.其他,String对象可直接赋值,StringBuffer赋值则通过构造函数。

四、多线程

C++多线程往往需要自己编写。而Java标准库支持多线程。例如Java的垃圾回收器是一个低优先级的线程。

1.Java定义了一个类Thread和一个接口Runable。

2.采用synchronized实现多线程同步,协调资源,保护共享变量和方法。

3.多线程优先级,范围1-10,默认值5。

4.线程间通讯,主要有三个方法:wait(),notify(),notifyAll()。其中,wait()和notify()必须成对出现。

五、其他

1.Java先编译后解释执行,而C++是纯编译方式。所以后者执行速度快。

2.Java结构中立,字节码的中介方式,与运行平台无关。所以可移植性好。

3.Java的变量长度确定不变,与运行平台无关。如int类型都是四个字节。而C++不一样,跟平台有关。所以Java移植性比C++佳。

4.Java仅支持单继承,支持多接口(关键字interface)。C++支持多继承,甚至还可以虚拟继承。

本页共78段,3820个字符,7944 Byte(字节)