java和C++的区别总结
3个回答
2016-12-01 · 百度知道合伙人官方认证企业
尚学堂科技有限公司
北京尚学堂科技有限公司是一家从事JAVA、大数据、web前端、网络在线教育、互联网架构师、Android、ios技术开发、咨询为一体的软件公司。公司由海外留学人员和国内IT人士创建。
向TA提问
关注
展开全部
.从数据类型上
Java是一种强类型语言只有八种基本的数据类型,分别是四种整型byte、short、int、long,两种浮点型double、float,一种字符型char,一种布尔型boolean。java的数据类型具有平台无关性,这使得Java语言完美的解决了C++中饱受诟病的可移植性问题。
在字符串上
①Java中的字符串是不可变的
在Java中,字符串是不可变的,也就说不能单独修改字符串中的一个字符
②Java中不能使用==比较字符串
在C++语言中由于重载了==操作符,因此可以直接对字符串进行比较,但是Java中由于采用了不同的机制,这种做法得到的结果并不一定是正确的。
3.在数组上
①从声明方式
Java数组有两种常见的声明方式:
int[] a=new int[100];//Java程序猿熟悉这种风格
int b[];//数组的维度不必是确定的1212
相比而言,C++的声明方式则是这样的:
int *a=new int[100];//由程序猿负责内存管理
int b[10];//数组的维度必须是确定的1212
②Java可以进行数组拷贝,C++则是利用数组的引用或指针的形式实现类似的目的
Java中的是可以直接进行数组拷贝的,例如
int[] smallPrimes={2,3,5,7,11,13};
int[] copied=Arrays.copyOf(smallPrimes,smallPrimes.length);1212
③从数组遍历上
首先,C++不提供数组下标越界检查,但是Java提供。其次,在数组遍历中两者都提供了简单的数组遍历方法,Java中是for each循环,C++中是范围for语句。
//Java的for each循环遍历二维数组
for(double[] row:a)
for(double value:row)
do something with value;
//C++范围for语句遍历二维数组
for(auto &r:a)
for(auto value:r)
do something with value;1234567812345678
4.从作用域的嵌套规则上
在Java中不允许在嵌套的两个块中声明同名变量,我们还是通过具体实例来理解:
{
int k;
...
for(int k=0;k<10;++k){ //在Java中这种声明方式是错误的
}
}123456123456
C++中允许这种声明方式,内层块中的k会屏蔽外层块中的k。
5.Java中没有goto语句
Java中没有goto语句,但是由于Java语言的设计者认为适当使用goto能够为程序带来方便,因此Java语言拓展了原来break语句的功能,使之具有原来C++中类似的功能。
6.Java和C++声明对象上的区别
很多人,会误以为Java中的对象和C++中的引用类似,这样的认识是错误的,但是也是有根源的,我们来看一个例子,
public class EmployeeTest
{
public static void main(String[] args)
{
Employee staff1=new Employee();//注意这也是C++和Java在默认构造函数使用方法的不同之处
Employee staff2=staff1;
staff1.raiseSalary(0.3); //staff1和staff2的salary都将改变
}
}
class Employee
{
//constructor
...
public Employee(){...}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
private String name;
private double salary;
private Date hireDay;
}123456789101112131415161718192021222324123456789101112131415161718192021222324
其实Java中的对象更像C++中的指针,这样你对Java中对象的理解就更加方便了。Java中没有指针的概念,对象也并不具有C++中指针的全部特性。
staff1和staff2指向相同的内存区域,所以staff1的改变staff2会随之发生改变。
7.C++和Java在对象构造上的区别
①C++和Java在实例域上的区别
C++是不能直接初始化类的实例域(数据域),所有的域必须要直接通过拷贝构造函数进行,但是java是允许直接初始化实例域的,这是因为java中没有子对象,只有指向其他成员的指针。但是C++中有两种数据域是必须要进行直接初始化的,那就是引用和const常量。
②C++和Java在构造函数上的区别
首先,在构造函数的基本形式上,C++和Java是基本一致的,都要声明为共有,都没有返回值,函数名都要与类名保持一致。
在Java中我们有两个地方会用到委托构造的机制,一个是当一个类中存在多个构造函数的时候,我们往往喜欢利用参数少的构造函数来协助完成参数较多的构造函数,例如
public Employee(double s){
//calls Employee(String,double)
this("Employee #"+nextId,s);
nextId++;
}
//要使用C++实现同样的功能,表达形式应该是
public Employee(double s):Employee(String,s){
nextId++;
}123456789123456789
另一个用到delegate(委托)这种机制的是在类的继承中,子类用到父类(超类)的的构造函数,举个例子,假设Manager是继承自Employee,那么则有
public Manager(String n,double s,int year,int month,int day){
super(n,s,month,day);//注意与上面形式的区别
bonus=0;
}
//用C++实现同样的功能,则形式为
Managerr(String n,double s,int year,int month,int day):
Employee(n,s,month,day){
bonus=0;
}
//当然C++也可以直接对父类的每个数据域进行初始化,而不利用这种形式,但是不提倡。1234567891012345678910
8. C++和Java在虚函数上的区别
总体来说,C++和Java在虚函数上的区别更多的表现在外在形式上,例如Java中是通过在类名之前用abstract关键字来声明虚函数,而C++中如果类中函数virtual函数,那么virtual函数所在的类就会被自动声明为虚函数。
9.C++和Java在protected关键字含义上的区别
在Java中,protected关键字是对所有的子类以及同一个package中的所有的其他类可见;在C++中,protected关键字只对子类是可见的。这样看来Java中protected的保护的安全性,比C++要差。
Java是一种强类型语言只有八种基本的数据类型,分别是四种整型byte、short、int、long,两种浮点型double、float,一种字符型char,一种布尔型boolean。java的数据类型具有平台无关性,这使得Java语言完美的解决了C++中饱受诟病的可移植性问题。
在字符串上
①Java中的字符串是不可变的
在Java中,字符串是不可变的,也就说不能单独修改字符串中的一个字符
②Java中不能使用==比较字符串
在C++语言中由于重载了==操作符,因此可以直接对字符串进行比较,但是Java中由于采用了不同的机制,这种做法得到的结果并不一定是正确的。
3.在数组上
①从声明方式
Java数组有两种常见的声明方式:
int[] a=new int[100];//Java程序猿熟悉这种风格
int b[];//数组的维度不必是确定的1212
相比而言,C++的声明方式则是这样的:
int *a=new int[100];//由程序猿负责内存管理
int b[10];//数组的维度必须是确定的1212
②Java可以进行数组拷贝,C++则是利用数组的引用或指针的形式实现类似的目的
Java中的是可以直接进行数组拷贝的,例如
int[] smallPrimes={2,3,5,7,11,13};
int[] copied=Arrays.copyOf(smallPrimes,smallPrimes.length);1212
③从数组遍历上
首先,C++不提供数组下标越界检查,但是Java提供。其次,在数组遍历中两者都提供了简单的数组遍历方法,Java中是for each循环,C++中是范围for语句。
//Java的for each循环遍历二维数组
for(double[] row:a)
for(double value:row)
do something with value;
//C++范围for语句遍历二维数组
for(auto &r:a)
for(auto value:r)
do something with value;1234567812345678
4.从作用域的嵌套规则上
在Java中不允许在嵌套的两个块中声明同名变量,我们还是通过具体实例来理解:
{
int k;
...
for(int k=0;k<10;++k){ //在Java中这种声明方式是错误的
}
}123456123456
C++中允许这种声明方式,内层块中的k会屏蔽外层块中的k。
5.Java中没有goto语句
Java中没有goto语句,但是由于Java语言的设计者认为适当使用goto能够为程序带来方便,因此Java语言拓展了原来break语句的功能,使之具有原来C++中类似的功能。
6.Java和C++声明对象上的区别
很多人,会误以为Java中的对象和C++中的引用类似,这样的认识是错误的,但是也是有根源的,我们来看一个例子,
public class EmployeeTest
{
public static void main(String[] args)
{
Employee staff1=new Employee();//注意这也是C++和Java在默认构造函数使用方法的不同之处
Employee staff2=staff1;
staff1.raiseSalary(0.3); //staff1和staff2的salary都将改变
}
}
class Employee
{
//constructor
...
public Employee(){...}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
private String name;
private double salary;
private Date hireDay;
}123456789101112131415161718192021222324123456789101112131415161718192021222324
其实Java中的对象更像C++中的指针,这样你对Java中对象的理解就更加方便了。Java中没有指针的概念,对象也并不具有C++中指针的全部特性。
staff1和staff2指向相同的内存区域,所以staff1的改变staff2会随之发生改变。
7.C++和Java在对象构造上的区别
①C++和Java在实例域上的区别
C++是不能直接初始化类的实例域(数据域),所有的域必须要直接通过拷贝构造函数进行,但是java是允许直接初始化实例域的,这是因为java中没有子对象,只有指向其他成员的指针。但是C++中有两种数据域是必须要进行直接初始化的,那就是引用和const常量。
②C++和Java在构造函数上的区别
首先,在构造函数的基本形式上,C++和Java是基本一致的,都要声明为共有,都没有返回值,函数名都要与类名保持一致。
在Java中我们有两个地方会用到委托构造的机制,一个是当一个类中存在多个构造函数的时候,我们往往喜欢利用参数少的构造函数来协助完成参数较多的构造函数,例如
public Employee(double s){
//calls Employee(String,double)
this("Employee #"+nextId,s);
nextId++;
}
//要使用C++实现同样的功能,表达形式应该是
public Employee(double s):Employee(String,s){
nextId++;
}123456789123456789
另一个用到delegate(委托)这种机制的是在类的继承中,子类用到父类(超类)的的构造函数,举个例子,假设Manager是继承自Employee,那么则有
public Manager(String n,double s,int year,int month,int day){
super(n,s,month,day);//注意与上面形式的区别
bonus=0;
}
//用C++实现同样的功能,则形式为
Managerr(String n,double s,int year,int month,int day):
Employee(n,s,month,day){
bonus=0;
}
//当然C++也可以直接对父类的每个数据域进行初始化,而不利用这种形式,但是不提倡。1234567891012345678910
8. C++和Java在虚函数上的区别
总体来说,C++和Java在虚函数上的区别更多的表现在外在形式上,例如Java中是通过在类名之前用abstract关键字来声明虚函数,而C++中如果类中函数virtual函数,那么virtual函数所在的类就会被自动声明为虚函数。
9.C++和Java在protected关键字含义上的区别
在Java中,protected关键字是对所有的子类以及同一个package中的所有的其他类可见;在C++中,protected关键字只对子类是可见的。这样看来Java中protected的保护的安全性,比C++要差。
2016-12-01 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
1.指针
JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
2.多重继承
c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
3.数据类型及类
Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
4.自动内存管理
Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
Read r=new Read();
r.work();
语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c十十中必须由程序贝释放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
5.操作符重载
Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
6.预处理功能
Java不支持预处理功能。c/c十十在编译过程中都有一个预编泽阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与c十十预处理器的功能类似。
7. Java不支持缺省函数参数,而c十十支持
在c中,代码组织在函数中,函数可以访问程序的全局变量。c十十增加了类,提供了类算法,该算法是与类相连的函数,c十十类方法与Java类方法十分相似,然而,由于c十十仍然支持c,所以不能阻止c十十开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。
Java没有函数,作为一个比c十十更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
8 字符串
c和c十十不支持字符串变量,在c和c十十程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(strinR和stringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
(1)在整个系统中建立字符串和访问字符串元素的方法是一致的;
(2)J3阳字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
(3)Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;
(4)可对字符串用“十”进行连接操作。
9“goto语句
“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
l0.类型转换
在c和c十十中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在c十十中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c十十中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
11.异常
JAVA中的异常机制用于捕获例外事件,增强系统容错能力
try{//可能产生例外的代码
}catch(exceptionType name){
//处理
}
其中exceptionType表示异常类型。而C++则没有如此方便的机制。
JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
2.多重继承
c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
3.数据类型及类
Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
4.自动内存管理
Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
Read r=new Read();
r.work();
语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c十十中必须由程序贝释放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
5.操作符重载
Java不支持操作符重载。操作符重载被认为是c十十的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
6.预处理功能
Java不支持预处理功能。c/c十十在编译过程中都有一个预编泽阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与c十十预处理器的功能类似。
7. Java不支持缺省函数参数,而c十十支持
在c中,代码组织在函数中,函数可以访问程序的全局变量。c十十增加了类,提供了类算法,该算法是与类相连的函数,c十十类方法与Java类方法十分相似,然而,由于c十十仍然支持c,所以不能阻止c十十开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。
Java没有函数,作为一个比c十十更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
8 字符串
c和c十十不支持字符串变量,在c和c十十程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(strinR和stringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
(1)在整个系统中建立字符串和访问字符串元素的方法是一致的;
(2)J3阳字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
(3)Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;
(4)可对字符串用“十”进行连接操作。
9“goto语句
“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
l0.类型转换
在c和c十十中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在c十十中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c十十中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
11.异常
JAVA中的异常机制用于捕获例外事件,增强系统容错能力
try{//可能产生例外的代码
}catch(exceptionType name){
//处理
}
其中exceptionType表示异常类型。而C++则没有如此方便的机制。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、Java源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
2、C++源码一次编译,直接在编译的过程中链接了,形成了机器码。
3、C++比Java执行速度快,但是Java可以利用JVM跨平台。
4、Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
5、C++中有指针,Java中没有,但是有引用。
6、C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
7、C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
8、C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
基本上就是以上内容,回答中有什么遗漏欢迎网友们补充,希望对您有所帮助。
2、C++源码一次编译,直接在编译的过程中链接了,形成了机器码。
3、C++比Java执行速度快,但是Java可以利用JVM跨平台。
4、Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
5、C++中有指针,Java中没有,但是有引用。
6、C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
7、C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
8、C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。
基本上就是以上内容,回答中有什么遗漏欢迎网友们补充,希望对您有所帮助。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询