0x000 概论
学java就逃不了谈面相对象,但是面相对象又是一个高深的哲学问题,一章两章是难以详述出来的。为什么说他是一个哲学问题呢,因为面相对象并不是编程中产生的,而是一种本来就存在的思想,只是被用在了编程之上,从而形成了面相对象编程,所以在这里只能浅薄的谈谈如何运用面相对象编程。
如果真的要说面相对象是什么的话,我更愿意称之为一种思想观,一种看待世界万物的角度,而面相对象编程,只能说是面相对象思想观在软件工程中的一种最佳实践,是一个方法论。
说实在,在学习面相对象编程的过程中,学习到最多的不是如何做出一个软件,而是如何运用面相对象的思维去解决更多超越编程的实际问题,比如如何用面相对象的思维去管理一个团队,管理一个项目,或者制作一个ppt、视频。
在使用面相对象编程实践的时候,我也发现面相对象编程不仅仅只是我们常说的多态、封装和继承这三个简单的特性,只能说这类似江湖中武功心法的六字真言,而其中的内涵却是浩瀚无比。
0x001 什么是面相对象编程
佛说:一花一世界,一叶一乾坤。如果我说这是面相对象的最佳范例你信不信?
这个世界是由碳组成的,众多的碳构成了众多的化学元素,众多的化学元素构成了众多的生物细胞,众多的生物细胞构成了众多的生物结构,而众多的生物结构构成了众多的生物类型,所以一朵花中有多少种结构、细胞
、化学元素呢?对我们而言,宇宙是广袤的,甚至地球就可以说是我们的世界,那如果把我们比作花中的一个细胞呢?那花不就是我们的世界?
我们学习java之前,通常可能学过其他的语言,一般是C,我就是先学C才学了JAVA,对于C面相过程的思维是浅显易懂的,这种思维就像在完成一个连线工作,但是面相对象是完全不同的,它像一个拼图,我们把一个拼图块随意放置(当然是在正确位置),当我们将所有的拼图块放置好,它俨然已成为一幅画(一个系统),没有像面相过程一般有一条清晰的故事主线,它靠的是拼图块之间的关系。
在人类研究这个世界的过程中,我们学会了抽象,什么是抽象呢,我的理解是将一个真实存在的物体抽象成不存在但是拥有该物体特性的东西,比如男人、女人,我们可以抽象出人类,特性是可以直立行走。那花男人女人是什么呢?他是对象。而抽象出来的人类是什么呢,是类。
所以可以得出一个结论:类是抽象的,对象是抽象的一个实例,是“真实”存在的。
类
类是具有相同特性和行为的对象的集合,比如男人、女人都是人类
/**
* 定义人类类
**/
class Human{
}
Human man=new Human();//新建一个男人对象
Human women=new Human();//新建一个女人对象
对象
每个对象都是唯一的,比如每个人都有自己的姓名。
/**
* 定义人类类,并且定义他们的特性
**/
class Human{
int age;
String name;
public Human(int age,String name){
this.age=age;
this.name=name
}
}
Human man=new Human(24,"John");//新建一个男人对象并且赋予她的特性
Human women=new Human(27,"Jane");//新建一个女人对象并且赋予她的特性
一个类中一共包含两个元素
- 属性
- 方法/行为
那这两个元素在对象中扮演什么角色呢?我们还是用一个人来举例
人自身拥有的特性:姓名,年龄,性别
人可以做什么:讲话,睡觉,吃饭
/**
* 定义人类类,并且定义他们的特性和行为
**/
class Human{
int age;
String name;
String sex;
public Human(int age,String name,String sex){
this.age=age;
this.name=name
this.sex=sex;
}
void speak(){}
void sleep(){}
void eat(){}
}
那类中的构造函数对于人来说以为着什么呢?可以说是人类在出生的时候自带或者外部赋予它的属性,例如出生日期,姓名等等,有些属性是随着他的成长是会变化的,例如年龄,而有些事固定不变得,例如出生日期。
面相对象的三个特性
- 封装
- 继承
- 多态
先说封装
如果将世间万物都看作对象,那么手机也可以看做一个对象,它由众多个零件对象组成,对于普通用户,我们并不知道手机是如何实现的,但是我们却知道如何使用它。也就是说,手机将实现的细节隐藏掉了,对我们来说,手机就是一个黑盒,只剩下输入输出的接口暴露给我们,这便称为封装。