1.语言类型
java是解释型语言
.java源代码经过编译会生成.class文件,由JVM虚拟机执行程序,执行过程加载需要的.class file
java是跨平台的,只要该平台系统能够执行相应的JVM虚拟机,则就可以对编译的class文件进行加载执行
C++是编译型语言
源代码编辑,然后编译器编译源代码,生成中间代码,然后由连接器把中间代码与各种库等进行链接,最终生成可执行的exe文件
2. 面向对象
java是纯面向对象的语言,C++ 因为要与c兼容,因此存在面向过程的编码方式
java里所有的东西都是对象,在编写类时,单个类文件里有且仅有一个public类,且该public类需与类文件名一致
java Object
java中所有的类默认都继承自Object类
而C++中没有根类,但每个指针可以转换成void*
3.初始化
java 类中的各个成员变量默认会被赋初值,且在java类中,成员变量也是可以赋值的
而在C++类中,成员变量必须通过构造函数来赋初值初始化,同时不能够对成员变量进行赋值
java中的初始化是类中的静态区先,然后非静态,静态部分只初始化一次
非静态代码区初始化然后构造器执行
c++中,按声明顺序对成员变量进行初始化,静态成员在类外初始化
4.垃圾回收
C++里没有垃圾回收的机制,程序员创建的对象保存在堆中,并且需要程序员自己去删除不用的对象
否则将会造成内存泄漏
而JAVA中有垃圾回收的机制,所创建的对象,最终会由JVM自动进行清理,不需要程序员进行考虑
同时java中没有析构函数的概念
5.访问权限
java中类只有public和包访问权限
java默认使用包的目录管理方式,亦即包的访问方式
即类跟类的成员,在没有限定访问权限的情况下为包访问方式
而C++则必须对类及类成员的访问权限进行限定
6.java中只有true或false,而c++中非0就为true,0为false
7.参数传递
java中总是采用值传递,对于对象引用,所传递的也是引用的拷贝
c++中有值传递和引用传递
8.java中可以在构造器中通过使用this调用另一个构造器
而c++中无法再构造方法里调用另一个构造方法,只能把公共的初始化代码编写成一个独立的方法
java中通过super调用父类的构造器,而C++中通过在初始化列表中,运用:加上父类构造器来调用
9.类
java中所有继承都是公有继承,没有C++中的私有继承和保护继承
java中使用super调用超类的方法,C++中通过超类名加上:来调用
java中,不需要将方法声明为虚拟方法,动态绑定是默认的处理行为
C++中,函数默认是静态绑定的,需要实现动态绑定则需要把相关方法定义虚函数,再通过指针的使用来实现
java中则需要把相关类或方法定义为final,才能解除动态绑定的特性
final类将阻止类被拓展,即继承
final方法阻止方法被覆盖
java中的方法调用需要搜索相匹配的方法来调用,因此虚拟机会构造一个方法表来提高效率
这类似于C++中的虚函数表
java中通过abstract定义抽象方法,拥有抽象方法的类即为抽象类
即使没有抽象方法,通过abstract也可以定义抽象类,抽象类也是可以有具体方法和具体数据
抽象类不能被实例化
C++的抽象类为拥有纯虚函数的类
java中没有C++的多继承
主要是为避免多继承的复杂和效率低的问题,并通过使用接口来实现多继承的大部分功能
10.常量修饰符
java中有final修饰符,类似于const
final变量:对于基本数据类型,其值不能改
对于对象引用,则是引用恒定不变
final方法:对方法锁定,不能进行修改。而且不能被覆盖
final类:类不能修改,不能被继承
11.多态
java中没有像C++中的虚函数定义,但是动态绑定的概念却是类似的
动态绑定的实现一样是需要基类的引用,对于java,通过基类引用实现
C++中是通过基类指针
12.异常
java中异常有两种:已检查异常和未检查异常
已检查异常,编译器将会检查是否提供了异常处理器
java中的异常均派生于Throwable类
Error和RunTimeException是未检查异常
C++中的throw和java中的throws类似
C++的throw在运行时执行,如果没有给定throw说明,程序可能会抛出任何异常
而java中,没有throws则不抛出任何已检查异常
java中只能抛出Throwable的子类对象,而C++中却能抛出任何类型的值
13.泛型
java泛型与C++模板
java泛型类似于C++模板,但java泛型没有template关键字
java泛型可以对类型变量进行限定,而C++的模板参数的类型不能进行限定
如java 中有类型变量T 可以限定T extends Comparable
java中定义泛型,会自动提供相应的原型类型。如果没有对类型变量进行限定,则会使用Object进行替换
而C++中会对每个模板实例化产生不同的类型,从而造成模板代码膨胀的现象,而java中不存在这个现象
java中泛型会自动提供相应原型类型,主要是虚拟机中没有泛型,只有普通的类和方法