
5.1 面向对象概述
面向对象技术最早是在编程语言Simula中提出的。1967年5月20日,在挪威奥斯陆郊外的小镇莉沙布举行的IFIP TC-2工作会议上,挪威科学家Ole-Johan Dahl和Kristen Nygaard正式发布了Simula 67语言。Simula 67被认为是最早的面向对象程序设计语言,是面向对象的开山祖师,它引入了所有后来面向对象程序设计语言所遵循的基础概念:对象、类、继承,但它的实现并不是很完整。
Smalltalk是第一个完整实现了面向对象技术的语言,由艾伦·凯于20世纪70年代初提出。Smalltalk引领了面向对象的设计思潮,对其他众多的程序设计语言的产生起到了极大的推动作用。C++、C#、Objective-C、Actor、Java和Ruby等,无一不受到Smalltalk的影响,这些程序语言中也随处可见Smalltalk的影子。
Java是目前使用最广的面向对象编程语言,拥有全球最多的开发者,常年稳居开发语言排行榜第一名,是简单、面向对象、分布式、解释性、健壮、安全、跨平台、可移植、高性能、多线程、动态的高级程序设计语言。
面向对象编程更加模块化,更加易于构建大型项目,而且有利于更新和维护,极大程度地简化了企业级编程的协同问题。面向对象的优点是项目可以做的更大、模块之间解耦、调用更简单、易于修改和维护、适合大型项目开发。然而,面向对象开发方法需要一定的软件作为支持,在大型项目的开发过程中,如果管理不好,极容易造成系统结构不合理、各部分关系失调等问题。
面向对象的编程思想是一种符合人类思维习惯的编程思想,它把要解决的问题按照一定的规则分为多个对象,然后通过调用对象的方法来解决问题,其主要特点可以概括为封装、继承、多态。下面针对这3个特点进行介绍。
1.封装
封装是面向对象编程的核心思想,具体是指把属于同一类对象的属性和行为封装起来,对外界隐藏其实现细节。例如,用户玩游戏时,只需要点击游戏人物就可以实现一些操作,无须知道游戏内部是如何工作的;你想知道朋友那边的天气如何,假设他或她在异国他乡,你只需要打开手机查看他或她所在地区的天气数据就可以,不用关注天气数据是如何被推送到你的手机上的。上述两个实例中,游戏人物的属性和行为的实现细节被封装了来,天气数据推送服务的实现细节也被封装了起来,这就是封装思想的具体应用。
2.继承
继承主要是指子类与父类之间在属性、行为等方面的某些传承关系,通过继承,每一个子类都可以从它的父类那儿继承所有的通用属性和方法,从而只需定义其独一无二的属性和行为即可,无须编写相同的代码,便能开发出新类,很好地实现了代码的重用,极大地降低了重复的代码量,能够大大缩短开发周期,降低开发费用。例如,牧羊犬类属于狗类,狗类又属于哺乳动物类,哺乳动物类又属于动物类。如果不使用继承,就不得不分别定义牧羊犬类、狗类、哺乳动物类、动物类的所有属性和行为,编写重复性的代码。在使用了继承后,可以先定义动物类,其中包含动物共有的属性和行为;接着定义哺乳动物类,使其在继承动物类的基础上新增哺乳动物特有的属性和行为;再定义狗类,使其在继承哺乳动物类的基础上新增狗特有的属性和行为;最后定义牧羊犬类,使其在继承狗类的基础上新增牧羊犬特有的属性和行为,这样就可以极大程度地减少代码编写量。
3.多态
多态是面向对象编程的又一特性,面向对象编程有两层意义上的多态。
第一层意义上的多态又称方法名多态,它具体是指向对象的名称相同的方法传递不同参数时,对象会根据不同参数而做出不同的行为反应。例如一条狗,当它闻到猫的气味时,会吠叫并且追着猫跑;当它闻到食物的气味时,会分泌唾液并向着食物跑去。这两种状况下,是同一种嗅觉器官在工作,但闻的气味不同,狗做出的反应也不同。如果要使用Java程序来模拟狗的上述反应,就可以采用多态的思想,在狗类中编写模拟狗的嗅觉器官的方法,该方法能够针对不同气味参数,实现狗的不同反应。
第二层意义上的多态则是与继承相关的,它具体是指相同的方法被不同对象引用时可能产生不同的行为。例如,羊和狼都都具有哺乳动物类相同的行为“叫”,但羊的叫声是“咩…”,而狼的叫声是“嗷…”。对于同类中的这种随具体对象的不同而有所不同的行为,Java程序中推荐在父类中定义统一风格的方法处理,然后在实例化对象或子类对象时通过传递实际参数来进一步完善。这样一来,整个行为的处理都只依赖于父类的方法,以后只要维护和调整父类的方法即可,从而降低了维护的难度,节省了时间。