Java与C++在面象对象基本概念上的区分

一、引言

众所周知,C++和Java是当今两种主流的面向对象语言,对于两种语言的优劣比较,每个人都有自己不同的看法,比较一致的看法是C++是编译型高级语言而Java是解释型的,因此C++快速而Java兼容性好,C++适合底层控制而Java长于网络编程。不管怎么说,可以肯定的一点是两种语言还会在相当长的一段时间内并存下去,这要求我们在精通两者其一的同时,对另一个也应该至少清楚地掌握其框架结构。因为Java是从C++衍生出来的,所以两种语言在基本语法和概念上都有很多相似之处,然而它们之间也存在一些不可忽视的差异,本文试图通过比较其中在面向对象的基本概念上的一些区别,来谈一谈两者的特点。

二、最最基本的区别——Java是一种完全的面向对象语言

面向对象技术中的对象就是现实世界中某个具体的实体在计算机逻辑中的映射和体现,而类则是同种对象的集合与抽象。所有的Java程序都是由类或者说是类的定义组成的。在我们的学习过程中应该自始至终地牢记这一点,因为这意味着Java是一种完全的面向对象语言。Java中的所有东西都必须置入一个类。不存在全局函数、全局数据,也没有像结构、枚举或者联合这种东西,一切只有“类”!

然而C++则不同,比如C++的main方法是置于所有的类之外的,除此之外还可以在类外定义其它的函数。在C++中,全局变量、结构、枚举、联合等一些列源于C的概念仍然存在。对于在这个问题上的区别,不同的人会有不同的看法,C++的优点是灵活机动,而且比较利于C程序员接受,因为在C中成立的事情在C++中基本上不会出现差错,他们只需要了解C++多了哪些东西便可以了,然而也正因为如此,C++杂糅了面向对象和面向过程的双重概念,由此产生出的很多机制在强化某部分功能的同时破坏了程序的整体结构。

与此相比,Java语言去除了C++中为了兼容C语言而保留的非面向对象的内容,对于对C比较习惯的人来说不是十分友好,在很多问题的处理上也显得有些弃简就繁,但是它以此换来了严谨和可靠的结构,以及在维护和管理上的方便。

因此对两种语言的总体比较可以得出的结论是:C++更加灵活而Java更加严谨。

三、类定义和类方法的定义上的区别

Java中没有独立的类声明,只有类定义。在定义类和类的方法(C++中称为成员函数)上,让我们用一个C++的典型类定义的片段来说明两者的不同:

class score

{

score(int);

};

score::score(int x)

{

写下构造函数的具体定义

}

这个例子反映了C++和Java的三个不同之处:

(1)在Java中,类定义采取几乎和C++一样的形式,只不过没有标志结束的分号。

(2)Java中的所有方法都是在类的主体定义的而C++并非如此。在Java中我们必须将函数的定义置于类的内部,这种禁止在类外对方法定义的规定和Java的完全面向对象特性是吻合的。

(3)Java中没有作用域范围运算符“::”。Java利用“.”做所有的事情,但可以不用考虑它,因为只能在一个类里定义元素。即使那些方法定义,也必须在一个类的内部,所以根本没有必要指定作用域的范围。而对于static方法的调用,也是通过使用ClassName.methodName()就可以了。

四、类和对象的建立与回收机制上的区别

Java提供了与C++类似的构造函数。如果不自己定义一个,就会获得一个默认构造函数。而如果定义了一个非默认的构造函数,就不会为我们自动定义默认构造函数。这和C++是一样的。但是在Java中没有拷贝构造函数,因为所有自变量都是按引用传递的。

静态初始化器是Java的一个独特概念,与构造函数对每个新建的对象初始化相对的,静态初始化器对每个类进行初始化,它不是方法,没有方法名、返回值和参数列表,在系统向内存加载时自动完成。

另一方面,在C++中,对象的释放和回收是通过编程人员执行某种特殊的操作来实现的,像利用new运算符创建对象一样,利用delete运算符可以回收对象。但在Java语言中,为方便、简化编程并减少错误,对象的回收是由系统的垃圾回收机制自动完成的。Java的垃圾回收机制是一个系统后台线程,它与用户的程序共存,能够检测用户程序中各对象的状态。当它发现一个对象已经不能继续被程序利用时,就把这个对象记录下来,这种不能再使用的对象被称为内存垃圾。当垃圾达到一定数目且系统不是很忙时,垃圾回收线程会自动完成所有垃圾对象的内存释放工作,在这个过程中,在回收每个垃圾对象的同时,系统将自动调用执行它的终结器(finalize)方法。

finalize()方法与C++中的析构函数(Destructor)有类似的地方,但是finalize()是由垃圾收集器调用的,而且只负责释放“资源”(如打开的文件、套接字、端口、URL等等)。如需在一个特定的地点做某样事情,必须创建一个特殊的方法,并调用它,不能依赖finalize()。而在另一方面,C++中的所有对象都会(或者说“应该”)破坏,但并非Java中的所有对象都会被当作“垃圾”收集掉。由于Java不支持析构函数的概念,所以在必要的时候,必须谨慎地创建一个清除方法。而且针对类内的基础类以及成员对象,需要明确调用所有清除方法。

五、重载方面的区别——Java没有运算符重载

多态是面向对象程序设计的一个特殊特性,重载则是它的重要体现。在C++中,同时支持函数重载和运算符重载,而Java具有方法重载的能力,但不允许运算符重载。

六、继承方面的区别(一)——关于访问权限

在C++中存在三种继承模式——公有继承、私有继承和保护继承。其中公有继承使基类中的非私有成员在派生类中的访问属性保持不变,保护继承使基类中的非私有成员在派生类中的访问属性都降一级,而私有继承使基类中的非私有成员都成为派生类中的私有成员。在Java中,只有公有继承被保留了下来,Java中的继承不会改变基础类成员的保护级别。我们不能在Java中指定public,private或者protected继承,这一点与C++是不同的。此外,在衍生类中的优先方法不能减少对基础类方法的访问。例如,假设一个成员在基础类中属于public,而我们用另一个方法代替了它,那么用于替换的方法也必须属于public(编译器会自动检查)。

七、继承方面的区别(二)——关于多继承

所谓多重继承,是指一个子类可以有一个以上的直接父类。C++在语法上直接支持多继承,其格式为:

class 派生类名:访问控制关键字 1 基类名1,访问控制关键字 2 基类名2,...

Java出于简化程序结构的考虑,取消了语法上对多继承的直接支持,而是用接口来实现多重继承功能的结构。这样一来,对于仅仅设计成一个接口的东西,以及对于用extends关键字在现有功能基础上的扩展,两者之间便产生了一个明显的差异。不值得用abstract关键字产生一种类似的效果,因为我们不能创建属于那个类的一个对象。一个abstract(抽象)类可包含抽象方法(尽管并不要求在它里面包含什么东西),但它也能包含用于具体实现的代码。因此,它被限制成一个单一的继承。通过与接口联合使用,这一方案避免了对类似于C++虚基类那样的一些机制的需要。由此而来的,Java中没有virtual关键字。

八、其它方面的区别及结语

以上我们介绍的,只是Java和C++在和面向对象的基本概念联系比较紧密的一些方面的比较,除了这些比较重要的基本区别之外,它们还在很多地方有着或多或少的不同,比如指针与引用的问题,异常机制的问题,流程控制的问题等等。通过两种语言在种种方面的差异我们可以很明显地感觉两者在风格上的差异。喜爱C++的人会说Java功能贫乏,喜爱Java的人则会说C++结构混乱,其实作为比较成熟的面向对象语言,不论是哪一种,只要我们能掌握它的整套体系和思想并勤加练习,都是可以很得心应手地运用的。写下这篇文章,更多的意义在于讲述如果你真的要从一门语言转到另一门的学习中应该留意些什么,而不是怂恿你做出偏向某一门语言的选择。

所以不管你选择了哪一种语言,记住一点,语言本身并无高下,只有运用语言的人才有高下。

时间: 2024-08-06 11:34:52

Java与C++在面象对象基本概念上的区分的相关文章

辨析:Object与Instance都是对象,概念上没有区别。

Object与Instance有重要的区别:Object是客观世界中存在的实体:Instance是将Object虚拟到计算机世界的实例,它的生存方式是可运行的代码,它的生存环境是计算机中的内存资源,生存周期可能是短暂的. 由于同学们接受对象的概念是从面向对象的编程建立的.而在软件工程中要解决的是把Object如何正确地映射到计算机世界,就是把Object映射成Instance.因此,在软件工程课中要解决好Object与Instance的概念区分,更好地理解面向对象的开发全过程. 原文地址:htt

java类(Class)的概念;对象的概念,声明类的属性 和方法,

类(Class)的概念 类是对一组具有相同特征和行为的对象的抽象描述. 理解: [1] 类包含了两个要素:特性和行为 => 同一类事物具有相同的特征和行为. [2] 类是一个群体性概念.例如:网红.明星.草根.宅男.萝莉.沙雕 [3] 类可以理解为现实生活中所说的 “类型” 为什么会有类的概念? 现实生活中为了更好的区分事物,把事物进行归类,进而更好的认识事物. 在程序中,引入类的概念,就是为了快速生成更多的具有相同特性和行为的事物 对象的概念 对象是类的具体实现,表示一个独立的.唯一的个体.

Java新手入门的30个基本概念

Java新手入门的30个基本概念 在我们学习Java的过程中,掌握其中的基本概念对我们的学习无论是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基础,所以有必要对其中的基本概念做以归纳,以便大家在以后的学习过程中更好的理解java的精髓,在此我总结了30条基本的概念. Java概述: 目前Java主要应用于中间件的开发(middleware)---处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载

深入理解Java:注解(Annotation)基本概念

转自 竹子-博客:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据. Annotation(注解)是JDK5.0及以后版

[1] 注解(Annotation)-- 深入理解Java:注解(Annotation)基本概念

转载 http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html 深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法.Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据. Ann

java基础面向对象之类与对象

java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 ?封装性:保护内部结构的安全性 ?继承性:在已有的程序结构上扩充新的功能 ?多态性:在某一个该娘范围内满足 2)面向对象开发分为以下几个步骤: OOA(面向对象分析) OOD(面向对象设计) OOP(面向对象编程) 2.类与对象 1)了解类与对象的关系 ?认识类与对象 类与对象是整个面向对象之中最基础的组成单元,类是共性的一个集合,而对象是某一

OC中对象拷贝概念

OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议:<NSCopying>.<NSMutableCopying>从名字上我们可以看到,一个协议是用于不可变对象的,一个协议适用于可变对象的 首先来介绍一下对象的拷贝的概念吧:为什么要由对象的拷贝这么一个概念呢?看一个场

javascript必知必会:面象对象编程

面象对象编程技术的核心理念:封装.继承.多态:在一些主流的高级编程语言中,比 如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接和容易了,因为 javascript并不是面向对象的语言,所以我们只能通过javascript的一些特性,比如:闭包.原型链等来模拟出面向对象编程,我认为这些是 作为熟练掌握与灵活运用javascript的基础,园子里已有很多的javascript高手对于这方面都有介绍与分析,而我仅以作为一个项目

java synchronized类锁,对象锁详解(转载)

觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的