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++结构混乱,其实作为比较成熟的面向对象语言,不论是哪一种,只要我们能掌握它的整套体系和思想并勤加练习,都是可以很得心应手地运用的。写下这篇文章,更多的意义在于讲述如果你真的要从一门语言转到另一门的学习中应该留意些什么,而不是怂恿你做出偏向某一门语言的选择。所以不管你选择了哪一种语言,记住一点,语言本身并无高下,只有运用语言的人才有高下。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。