导读
- 面向过程、面向对象是什么、它们的优缺点、使用场景
- 类、对象、抽象类、接口
- 封装、继承、多态
面向对象概述
面向过程
定义:一种以“过程
”作为中心的编程思想,其中过程的含义就是“完成一件事的步骤”。
特点:流水线编程思想
(机器思维
),流水线一个阶段衔接另一个阶段,每个阶段都有自己的输入、处理、输出,而在流水线上流动就是原料或中间产品,每个阶段都有机械处理,最后输出产品。
面向过程程序流水线 = 程序划分不同阶段
+ 衔接规则
+ 各阶段的处理数据
面向过程程序 =算法
+ 数据结构
(算法 = 流水线,数据结构 = 原料/中间产品,程序 = 产品)
为什么面向过程是流水线式?
面向过程的发明是参照流水线模式,而机器思维指的是流水线机器做事的方式。
答:计算机本质是一台机器,其核心CPU处理的是指令流水(一整个执行流程有序指令集)。
面向对象
定义:面向对象是一种以“对象”作为中心的编程思想,其中对象的含义可以理解为“存在的东西”。
特点:人的思想(以人的思维观察、分析、设计系统),更侧重于对现实世界的模拟;设计了很多对象,指定了这些对象需要完成的任务。
面向对象程序
= 对象
+ 交互
对象是具体存在的事物,交互则是对象之间的作用、互动
为什么要面向对象
如:啤酒的生产线不能用于生产醋,如果改装成生产醋,则又不能生产啤酒。
面向过程:扩展性差
,适合比较稳定变化少
的业务(计算机系统)。
面向对象:核心是“可扩展性”,经常变化的地方就应用面向对象(用户需求)。
![](https://i-blog.csdnimg.cn/blog_migrate/5a489c2e2ee7a19205f9a0069d7ddac9.png)
软件质量属性图
质量属性:衡量软件质量优劣的参考属性点
![](https://i-blog.csdnimg.cn/blog_migrate/015749b9924d8231b81101346cb9e510.png)
面向过程 & 面向对象
面向过程 | 面向对象 | |
---|---|---|
应用业务 | 稳定、变化少 | 经常变化、不断扩展、快速响应 |
核心特点 | 流程化 | 可扩展性 |
编程思维 | 机器思维 | 人的思维 |
编程特性 | 程序 = 算法 + 数据结构 | 程序 = 对象 + 交互 |
编程语言 | C | Java、C++ |
*对于复杂业务系统,性能的好坏是由设计来决定,而不是语言来决定。
面向对象语言 != 面向对象编程
面向对象和面向过程都是一种编程思维,一种思考问题的方式,和具体语言无关。C语言可以进行面向对象开发,Java同样可以进行面向过程开发。
面向对象理论
类
定义:类是一组相似事物的统称
![](https://i-blog.csdnimg.cn/blog_migrate/25f07c504909d4e50660a0f828ca4dae.png)
一组
:多个,单个事物无法成为类
相似
:比较像,但不完全相同(牛、羊都吃草都是哺乳动物,但他们不是完全相同)
统称
:概括这多个事物(猫、狗、猪、牛统称动物)
如何定义(划分)类
有相似点的事物就是同一类
-
我和你是不是一类(都是人)
-
你和猪是不是一类(都是哺乳动物)
-
你和松树是不是一类(都是生物)
站在你观察角度,具有相似点的事物就是同一类。万法归一,所有的事物都可以归为一类(Java中的Class),但只有一个类无法满足要求,实际应用需要多种多样的类。
面向对象类
面向对象类由属性和方法组成
属性
:类具有的特性(人:头发、耳朵)
方法
:类具有的功能(人:说话、走路)
实际编码时,将名词作为属性,动词作为功能进行属性和方法划分。
属性设计原则
:属性最小化
原则,即不可再分(省市区,可以作为一个地址属性,也可分为三个属性)。
方法设计原则
:单一职责
原则,即“一个方法只做一件事”。
对象
对象是类的一个具体存在的事物。如:我是一个人的对象
问题:为什么有类还要有对象,它们的作用是什么?
答:现实中的类是人类出现文明后对现实事物的总结归纳,编程的类是程序员分析归纳总结的。无论是现实还是程序中,交互的都是对象,而且交互是跨类。
问题:现有类还是先有对象?
现实对象
:能看到的物体都可以叫对象
现实类
:对现实对象的归纳总结
软件对象
:软件实际运行过程中的对象
软件类
:软件设计过程中归纳总结出来的类
![](https://i-blog.csdnimg.cn/blog_migrate/3433c07851ffa4f572546515d7147900.png)
软件类来源于现实类,但高于现实类,是对现实类的抽象和扩展
如:领料类、补货类,现实中是一个功能
接口
接口定义:接口是一组相关交互功能点定义的集合
相关
:接口中的功能点事相关的,并非杂乱放在一起的
交互
:接口是用于不同对象之间交互的,如果只是自己玩的不能定义为接口
定义
:功能点都只是定义,并没有具体实现功能(定义了标准规范,如:参数、实现功能、返回值等),如:笔记本定义了各种接口(HDMI、USB、Type-C,但是具体的功能由其他厂商实现)
集合
:多个功能点的集合
public interface IAnimal {
/**
* Java的interface很好体现了我们前面分析的接口特征:
* 1. 是一组功能的集合
* 2. 接口的功能是用于不同对象交互,所有接口都是public,其他对象可调用
* 3. 接口只定义了函数,没有具体功能实现
* 4. 功能都是相关的,都是动物相关的功能,不相关的功能不能放在IAnimal里面
*/
public void eat();
public void run();
public void sleep();
public void speak();
}
接口只是对一类事物属性和行为的更高次抽象;对修改关闭
,对扩展开放
,可以说是java中开闭原则的一种体现。
抽象类
抽象类:特殊的类,只能用于继承
,不能被实例化
具体对象,包含抽象方法和普通方法。
问题:有了类为什么还要抽象类?为什么设计一种只能继承不能被实例化的类?
答:普通类在某些场景下不够用,如:买宠物,可以是猫、狗、蛇、猪等,但买不到具体的叫宠物的东西。
问题:接口和抽象类的区别?
答:抽象类本质还是类,是一组事物的相似性,包含属性和方法,而接口强调一组方法的相似性,且方法只有定义。
普通类由现实类抽象而来,抽象类是基于类的更高一层的抽象,抽象类介于普通类和接口之间。
抽象类作用:封装相似的属性和功能,使得复杂或共同的功能得以隐藏。
抽象
抽取比较像的部分,如:将类中相似的功能逻辑抽象出来可组成抽象类
![](https://i-blog.csdnimg.cn/blog_migrate/07be9615312cfa461687721597ed12b7.png)
上图分为两个层次抽象:
第一层次:将属性类似
的对象抽象为类
第二层次:将行为类似
的类抽象为超类(父类或更高一层的类)
父类
或更高层的类是包含相似的行为
的类(子类)的一个抽象
,抽象的层次不限,可根据业务需要或不同的观察角度抽出更多层。
抽象的作用:划分类
别(分类的目的是隔离关注点,降低复杂度),面向对象中通过抽象方式可从不同角度发现类。
三大核心特征
面向对象三大核心特征:封装、继承、多态,判断一种编程语言是否为面向对象语言,就看其是否支持这三大核心特征。
封装
问题:要封装什么?
答:封装是类的功能(封装具体在类中实现),可以对属性
或者方法
进行封装。
问题:为什么要封装?
答:保护隐私
,隔离复杂度
。
面向对象对类属性封装后,对属性的访问只能通过方法进行,这样还统一类属性的操作(保护隐私
)。
面向对象对类方法封装后,隔离了复杂度
,每个方法只需要关注自己的功能实现,如果需要其他类配合,直接调用其他类方法即可。
例1:面向过程无封装,程序 = 算法 + 数据结构,数据结构完全公开
Person.h
typedef struct Person{
char * name; //姓名
int money; //金钱数量
}Person;
money.c
int main(void) {
Person*me = (Person)malloc(sizeof(Person));
me -> name = "华仔";
me -> money = 1000;
//收银员收银
if(me -> money > 50) {
me -> money -= 50;
} else {
printf("%s 付款失败\n", me -> name);
}
//小偷偷钱,小偷可直接操作Person的money
me -> money = 0;
free(me);
return EXIT_SUCCESS;
}
//有多少钱导出炫耀
例2:面向对象 = 对象 + 交互
public class Person {
private String _name; //姓名
private int _money; //金钱
public String getName() {
return _name;
}
public boolean pay(int money) {
if(money > _money) {
return false;
}
_money = money;
return true;
}
}
//钱多少只有自己知道
封装的三种形式
public:不封装,对外公开
protected:对外不公开,但对子类公开
private: 对谁都不公开
继承
定义:继承 = 遗传,子类遗传了父类的属性和方法
生物学进化论,遗传会产生变异,而面向对象中,继承同样通过变异产生子类,同时自类会产生自己的新特性(属性/方法)。
![](https://i-blog.csdnimg.cn/blog_migrate/7141579b40ffdbe8ad5b3d740ae50ca1.png)
抽象是分析和设计过程的一个动作
、一个技巧、通过抽象得出类。
继承是实现过程的动作
,基于抽象的结果,完成对抽象图的模拟。
![](https://i-blog.csdnimg.cn/blog_migrate/558fbee1d4d894f5b53ee31aed5496e4.png)
多态
polymorphism
问题1:重载和重写是否属于多态的特性?
问题2:什么是多态?
定义:父类的指针或者引用,可以调用子类的对象(父类引用指向子类对象)
public abstract class Animal {
abstract String talk();
}
public class Dog extends Animal{
@Override
String talk() {
return "Dog ... wangwang.":
}
}
public class Pig extends Animal{
@Override
String talk() {
return "Pig ... ao ao.":
}
}
public class Cat extends Animal{
@Override
String talk() {
return "Cat ... miao miao.":
}
}
public class Test1{
public static void main(String[] args) {
Animal aninal = new Dog();
System.out.println(new Dog().talk());
System.out.println(new Pig().talk());
System.out.println(new Cat().talk());
}
}
作用:屏蔽差异
、应变
。屏蔽子类对象的差异、以不变应万变(新增子类无需修改)
面向对象总结
【参考文献】
李运华
著《编程的逻辑-如何运用面向对象方法实现复杂业务需求》