编程随想 关系图_入门篇——解析C++与Java在面向对象编程中的异同

 一、类与对象

      面向对象编程(Object Oriented Programming, OOP)是近年来十分流行的一种程序设计方法,本质上就是对现实世界中客观存在的事物进行抽象建模,从而试图用程序去解决现实问题的一种编程思想。现实世间万物皆对象(Object),例如,一个具体的人就是一个对象。再将人的共同属性抽象出来就形成了“类”,也就是“人”这个类,它既有静态属性,比如姓名、年龄和性别等,也有动态行为,比如吃饭、睡觉和看电影等。因此,类是一个抽象建模的概念,是封装了同一类对象的所有属性和行为的载体,而对象则是类的具体实例。例如,“人”这个类的一个对象就是指一个具体的人,其关系如图1所示。

8c37bbfb6e341c38df42cf111257a481.png

图1    类与对象之间的关系

      面向对象编程的三大特性分别是封装性、继承性和多态性。在面向对象编程中,封装性是基础,继承性是关键,而多态性是补充。接下来,就C++程序设计语言和Java程序设计语言在面向对象编程的三大特性方面的异同进行阐述。

      C语言是美国贝尔实验室在B语言的基础上上开发出来的,1972年在一台DEC PDP-11计算机上实现了最初的C语言。当时设计的C语言是为了编写UNIX操作系统,到了1980年贝尔实验室对C语言又进行了改进和补充,最初被称为“带类的C”,在1983年被正式提议命名为C++(C Plus Plus),由于“++”是对变量进行增值运算,那么C++的寓意是对C语言进行了“增值”。

   Java语言是于1995年由Sun公司推出的,Java最初的名字是OAK,1995年被重命名为Java后正式发布于大众。Java语言的语法规则和C++类似,与C++不同的是,Java语言简洁的多,而且提高了可靠性。

二、类的主函数

      任一程序有且只有一个主函数(也称为main函数),它是程序流程的主控函数,程序必须从主函数开始执行。C++的主函数是类外函数,不能写在某一个类体内,这一点在java中有所不同,主函数在Java中被称为类的主方法,是类的入口点。因此Java的主函数是类内函数,需要写在类体内。如图2所示,左边为C++主函数的一种形式,右边为Java的类TestMain中的主函数。   

3930fd3deb2415ad9478d795519d1d44.png

                   图2    C++和Java主函数的差别

三、类的封装性

     封装是面向对象编程的核心思想,对象的属性和行为均被封装在这个类中。这一点上C++和Java并没有差异。例如,顾客到一家餐馆吃饭,下单的是服务员,上菜的也是服务员,厨师被封装在餐馆中,顾客是无法正面接触厨师的。

      但是C++中每个类是由两个文件组成,其中后缀名为.h的文件是头文件,用来存放这个类中的变量和函数声明,后缀名为.cpp的文件是源文件,用来存放这个类所有函数的函数体,也就是函数的具体实现。然而,Java与此完全不同,java中的类只需要存放在一个后缀名为.java文件中即可。如图3所示,上边两个文件分别为C++类的头文件和源文件,下边为Java类的源文件。

      从这个例子可以看出,先有顾客和服务员交流,再有服务员和厨师交流。整个过程中,顾客和厨师没有交流。作为顾客,不知道自己吃的美食是由哪位厨师、用何种方法烹饪出来的,这种编程方法就是封装。

4a2754687810c2c2fac8da2c841bc8aa.png

              图3     C++类和Java类的封装性差别

四、类的继承性

     继承是面向对象编程的最重要的特性,其基本思想是基于某个父类进行扩展形成一个新的子类,子类可以继承父类原有的属性和行为,也可以增加原来父类所没有的属性和行为或者直接重写父类中的某些行为。例如,平行四边形类继承了四边形类,那么平行四边形类在保留四边形类所有属性和行为的同时,还扩展了平行四边形类所特有的属性和行为。

      在继承性方面,C++和Java有些许差异:

  1. 继承的语法不同

     C++的继承语法如图4左边,Java的继承语法如图4右边。其中C++继承中有三种继承方式,分别为公有制继承public,私有制继承private,保护性继承protected。不同的继承方式影响的是父类属性在子类中的访问权限,例如,公有制继承中,保持父类的public成员和protected成员的原有访问权限;私有制继承中,将父类的public成员和protected成员的原有访问权限均变为私有的;保护性继承中,将父类的public成员变成了保护成员,而protected成员仍然保持其原有访问权限。

33c460f320f71f84fca1eaa64c09861f.png

          图4    C++和Java继承语法的差别

2.继承的方式不同

       C++是可以支持多重继承的,也就是说一个子类可以由多个父类进行派生,然而Java仅支持单继承,即一个子类只能有且仅有一个父类。如图5所示,C++中先定义“点”类Point和“半径”类Radius,再由Point类和Radius类进行多重派生出“圆”类Circle是完全合法的,然而在Java中多重继承就是不合法的。

2a580afc4a0f46109fbfffd7c48f07bf.png

          图5    C++和Java继承方式的差别

3.对父类属性和行为的调用方式不同

      不论是C++还是Java,继承并不只是扩展父类的功能,还可以重写父类的行为。所谓重写(也称为覆盖)就是在子类中将父类的行为名称保留,重新编写父类行为的实现内容、返回值和输入参数等。其中,最特殊的重写方式就是重构,也就是子类与父类的某一个行为名称、返回值、参数类型和个数完全相同,唯一不同的就是行为的实现内容。不论是在C++还是Java中,对同名行为进行重写之后,在子类中进行访问时,优先访问的便是子类重写之后的行为以及子类本身的属性。如果还想调用父类的同名行为或属性时,这两种语言就显示出差异了。其中,C++是通过作用域运算符(::)来进行解决的,而Java是增加了super关键字来解决这一问题的。如图6所示,左边为C++中通过作用域运算符来调用父类属性,右边为Java中通过super关键字来调用父类属性。

1b85c713103095f651f5f82c164f0ba1.png

      图6    C++和Java对父类属性调用方式的差别

五、类的多态性

      多态在面向对象编程中是指“一种定义,多种实现”,本文主要从两个方面来展现C++和Java中的多态性:一是类中行为方法的重载,二是类的上下转型。方法的重载是在同一个类中允许同时存在多个同名方法,只要这些方法的参数个数或类型不同即可。就这一点来说,C++和Java并无不同。如图7所示,左边用C++在类中编写add()方法的多个重载形式,右边用Java在类中编写add()方法的多个重载形式。

7e9059666697db5cb459f25771499803.png

               图7    C++和Java中类的多态性

      但是,在类的上下转型中,C++和Java略有不同。例如,平行四边形类继承了四边形类,常规的继承图大都是将最底层的父类放置在页面的顶部,然后自上而下进行依此继承,所以如果将子类对象平行四边形看作是父类对象四边形的话,则称作向上转型,如图8所示。

cd494d20d3e44210412a8cd62fa6f207.png

                   图8    父类与子类的关系

       由于向上转型是从一个较具体的类到较抽象类的转换,所以向上转型是安全的,在这一点上两种编程语言也还是保持一致的,然而在进行向下转型的话,两者是不同的。在C++中,根据赋值兼容原则,向下转型是不允许的,也就是说在C++中是不允许将父类对象四边形转换为子类对象平行四边形;而在Java中,通过显式类型转换是可以将父类对象四边形强制转换为子类对象平行四边形的,如图9所示。

3f3807d922aef625df4cb623bc84edb6.png

                   图9    Java中类的上下转型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值