【java学习】java与C++的简单比较


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中泛型会自动提供相应原型类型,主要是虚拟机中没有泛型,只有普通的类和方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值