1、概述
面向对象是一种对现实世界理解和抽象的方法。万物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。
面向对象思想体现在软件开发中的各个方面。如, 面向对象的分析(OOA,Object Oriented Analysis
),结合常用的设计原则、模式对关键的问题域进行分析和抽象。面向对象的设计(OOD,Object Oriented Design
),对问题域的抽象建立产品的模型和结构;面向对象编程(OOP,Object Oriented Programming
),依据产品的模型和机构进行编程。
2、几个概念
- 对象,需要研究的一切事物。对象实现了状态和行为的封装。
- 类,具有相同的属性(状态)和方法(行为)的对象的抽象就是类。对象的抽象是类,类的具体化就是对象。
- 类的结构,类之间的结构关系通常有两种:
- 一般–具体结构关系(继承关系) :
“或”
关系,或者是“is a”
关系; - 整体–部分结构关系(聚合关系):
“与”
关系,或者是“has a”
关系。
- 一般–具体结构关系(继承关系) :
3、三大特性
(一)、封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
封装的优点:
- 良好的封装可以降低耦合、提高程序的可复用性和可维护性;
- 封装特性可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。
(二)、继承
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
继承描述的是 “is a”
的关系,如果有两个对象A和B,若可以描述为“A是B”,则可以表示A继承B,其中B是被继承者称之为父类或者超类,A是继承者称之为子类或者派生类。
继承的特点:
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类。
- 继承是一种强耦合关系(缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
- 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的(缺点)。
- 父类变,子类就必须变(缺点)。
什么时候使用继承:
问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。
(三)、多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
多态分为编译时多态和运行时多态:
- 编译时多态是静态的,主要是指方法的重载;
- 运行时多态是动态的,指程序中定义的对象引用所指向的具体类型在运行期间才确定
多态的优点:
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
运行时多态有三个条件:
-
继承
-
覆盖(重写)
-
向上转型
-
多态的实现方式:
- 接口:接口的引用指向该接口实现类的实例,在运行时,根据对象引用的实际类型来执行对应的方法。
- 重写:个子类对父类同一方法的重写可以表现出不同的行为。
- 抽象类和抽象方法:如果父类是抽象类,那么子类必须要实现父类中所有的抽象方法,这样该父类所有的子类一定存在统一的对外接口,但其内部的具体实现可以各异。
参考资料
- Java 编程思想
- 面向对象编程三大特性 ------ 封装、继承、多态