面向对象概念介绍
过程式程序设计与OO程序设计
OO和过程式程序设计的区别
在OO设计中,属性和行为都包含在一个对象中,而在过程式程序设计中,属性和行为是分开的
适当的设计
可以断言,如果设计得当,OO模型中根本不会有诸如全局数据之类的东西。这一点保证了OO系统中高度的数据完整性。
对象不只是数据结构和基本数据类型,还包含方法。在一个对象中,方法用于完成数据操作和其他动作。更为重要的一点是,可以孔子对象成员(包括属性和方法)的访问。
数据隐藏
在OO术语中,数据表示为属性,行为表示为方法。限制对某些属性或方法的访问称为隐藏。
对象到底是什么
对象数据
存储在一个对象中的数据表示对象的状态,在OO程序设计中,该数据称为属性。
对象行为
对象的行为就是对象能够做什么,也就是在面对过程语言中,行为由过程、函数和子例程定义。在OO程序设计术语中,这些行为包含在方法中,要通过发送消息来调用方法。
获取方法和设置方法(set、get)
获取方法和设置方法的概念支持数据隐藏的概念。因为其他对象不能直接处理另一个对象内部数据,所以获取方法和设置方法提供了对对象数据的一种可控访问。有时也被称为访问方法和修改方法。
UML类图
UML类图
每个类图定义为3个不同部分:类名本身、数据(属性)和行为(方法)
创建一个对象时,称之为对象被实例化。例如这里你创了三个员工,实际上就会创建3个完全不同的Employee类实例。每个对象都包含其自己的属性和方法副本。
类到底是什么
简单的说,类就是对象的一个蓝图。实例化一个对象时,就是使用一个类作为构建这个对象的基础。应该先有类,如果没有类,对象就无法实例化。
属性
访问指示
当某个数据类型或者方法定义我public时,其他对象可以直接访问它。当某个数据类型或方法定义为private时,只有特定对象能够访问。还有一个访问修饰符protected,它允许相关对象访问。
方法
方法实现了一个类所需的行为。从这个类实例化的各个对象都有该类所定义的方法。方法可能实现其他对象(消息)所调用的行为,或者提供这个类内部的基本行为。内部行为是不允许其他对象访问的私有方法。除非是暴露了相应的set、get方法。
消息
消息是对象之家的通信机制。例如当对象A调用对象B的一个方法时,对象A就是在向对象B发送一个消息。当然,只有对象的公共方法能够被另一个对象调用。
封装和数据的隐藏
使用对象的主要优点之一,就是对象不需要公开它的所有属性和行为。在好的OO设计中,对象只应该公开其他对象与之交互所必须的接口。与对象设计无关的细节应当对所有的对象隐藏。
接口
接上文,接口定义了对象间通信的基本途径。每个类设计都要指定接口来正确地实现对象的实例化和操作。在大多数OO语言中,接口中的方法都指定为public
私有数据
要实现数据隐藏,所有属性都应该声明为private。因此属性不是接口的一部分。只有public方法才数据类接口。将属性声明为public会破坏数据隐藏的概念。
一个简单的例子,包含了私有属性、私有方法、公共接口
1 | class IntSquare { |
继承
OO程序设计中最强大的一个特性就是代码重用,你可以编写一个过程,然后根据需要使用多次。不过OO设计更近一步,允许通过组织类并抽取各个类的共性来定义类之间的关系,这不仅有利于代码重用,还可以实现更好的整体设计。
父亲类和子类
父类包含继承自该类的所有子类共同的属性和方法。
抽象
继承的强大之处就在于其抽象和组织技术。
在当前的多数OO语言中,一个类只能有一个父类;不过一个父类可以有多个子类。
一个类只能有一个父类叫单重继承(java、.net)、一个类只能有多个父类叫多重继承(如C++)
多态
字面意思是多种形状。问题引申,由于每个子类都是一个单独的实体,他们可能需要对同一个消息做出不同的响应。
多态是指类似对象可以采用不同的方式对相同的消息做出相应。
构造函数
如果一个方法与所在的类同名,而且没有提供任何返回类型,这就是构造函数。可以把构造函数当做类的入口点,这里非常适合完成初始化和准备工作。
小结
本章主要包含以下部分:
- 封装:将属性和方法封装到一个对象中
- 继承: 一个类可以从另一个类继承,并且可以利用父类定义的属性和方法
- 多态:对象可以采用不同的方式对相同的消息做出响应
- 组合:一个对象由其他对象构建而成
示例代码
定义一个类,直接实例化或者在另一个对象中实例化
1 | class Person { |