一个小白眼中的“面向对象”

《Head First Java》是我学习计算机以来第一本坚持读下来的书,也是我见过的最有趣的编程语言教程。
不一样于其余的书,这本书,或者说整个《Head First》系列,最大的不一样之处,在于它们写的根本不像教程,而像小说...让读者能够在愉快的氛围中,不经意间就能明白不少课堂上老师怎么“填鸭”也填不懂的概念。ios

本文是一个小白眼中的面向对象。编程

做为某不知名院校的本科大学生,对于大学的计算机学习很有感悟,
对于非计算机专业的学生来讲,咱们惟一一门计算机课就是《VC程序设计》,表面上是C++,实际就是C,由于不涉及任何类和对象的知识,彻底就是面向过程。学习的内容,仅仅是输入输出、数据类型、简单的循环和判断罢了...学习的效果呢,大多数学生记得最最最深入的就是:服务器

#include<iostream>
using namespace std;
int main(){
    return 0;
}

而后写什么来着...不知道了...
就是这个水平!
C++++.gif编程语言

因此,和许多大学生同样,在学习Java以前根本不知道什么是面向对象,脑子里的思惟也都是面向过程。函数

1、面向过程

首先,面向过程是什么呢?
过程”,一想到这两个词,我大脑中的第一反应就是加工厂、生产流水线,也能够理解成数学中的函数。学习

“生产一杯咖啡须要怎么作?”
须要水和咖啡粉做为原料,先把水烧热,而后倒入咖啡粉中就实现了。那么咱们能够画这样一张图。
图片.pngspa

“过程”就是一个流水线,在面向过程设计程序的时候,咱们只须要考虑,从输入到输出是怎样实现的,经历了怎样的步骤,而后把这个实现方式拆分红一个一个的具体步骤,在程序运行时按顺序去执行就能够了。因而面向过程就能够抽象成下图:
图片.png设计

面向过程当中,全部的数据都是用变量来储存的,全部的步骤都是经过函数来实现的。
在面向过程时,大脑里面所想的都是流程,也就是工厂的每一道工序。code

2、面向对象闪亮登场

那么面向对象有什么区别呢?对象

面向对象的思惟,或许更接近与实际生活。
当我本身尝试去理解对象时,个人大脑中呈现出的,再也不是一个加工厂,而是一个生机盎然的公园,公园中有许多人和各类各样的小动物,孩子们在嬉戏玩耍,蜜蜂在花丛中采蜜,旁边还有一位做家坐在石凳上正准备打开电脑写文稿...

这副画面中,一个孩子、一只蜜蜂、一朵花、一位做家、以及它手中的电脑,一切的一切,都是对象
而在这些对象之间,正在经过某种方法,发生着相互影响。
因此,面向对象和面向过程最大的不一样是,面向对象再也不去关注完成某件事情须要怎样的步骤,而是更加注重事物之间发生着怎样的联系

对象包含两个重要的内容:一个是对象的属性、另外一个则是对象的方法
以刚才说到的做家手里的笔记原本举例:一台笔记本,必然有一个状态——开机或关机,那么它的状态就是一个属性;笔记本还有内存大小、硬盘容量、CPU型号等等等,这些也都是这台笔记本的属性。

简单来说:对象的“属性”,就是在面向过程当中提到的“变量”

“方法”又是什么呢?现实生活中,一个方法其实就是要实现一个功能,好比笔记本的“开机”方法,就是把这台笔记本的状态从关闭变成打开,那么“开机”就是这台笔记本的一个方法;笔记本还能够打开文档,而且显示出文档的内容,那么“打印文档信息”就是这台笔记本的另外一个方法,而且这个方法有输出值,就是文档信息的字符串。
那么到底对象的“方法”要怎么去解释呢?——能够理解成面向过程当中提到的“函数”。

图片.png

但这并不严谨,或者说不彻底正确,由于变量只是为了客观储存数据,而属性虽然也能够储存数据,但它是对象的一种特征变量能够脱离对象而存在,但属性不能够,若是没有对象,属性就失去了意义(若是没有电脑这个实体,你能想象“开机”是一个什么样的状态吗?)。
同理,函数表示一种数据处理的过程,而方法表示此对象和其余对象发生联系的一种方式,方法也是不能脱离对象而存在的(若是让一个从未见过电脑的人去关掉电脑,那也是很为难他呢!)。

图片.png

3、类

咱们继续拿笔记本电脑来举例,小强、小达和小轩都有本身的笔记本电脑,而这些电脑都有共同的特色,因此就能够说,他们属于同一个“类”。

“类”是什么?
生活中的类是什么呢?用通俗的语言说就是一群有着共同特色的东西。因此类就是有着共同属性和方法的一群对象的模板、蓝图。若是几个对象属于同一个类,那么这个类就含有这些对象共有的属性和方法。而且,能够从这个类里面再建立新的对象,新建立的对象一样有这个类的特色。

或许初次接触类和对象时,咱们感觉不到它有什么用。咱们继续说,若是须要用变量来表示小强、小达和小轩三我的的电脑的信息,应该怎么作呢?

假设,每一台笔记本有三个信息:磁盘容量、内存大小、开关机状态。

若是在面向过程的思惟中,是这样的:

//小强的笔记本
int XiaoQiang_Disk;
int XiaoQiang_Memory;
bool XiaoQiang_Status;

//小达的笔记本
int XiaoDa_Disk;
int XiaoDa_Memory;
bool XiaoDa_Status;

//小轩的笔记本
int XiaoXuan_Disk;
int XiaoXuan_Memory;
bool XiaoXurn_Status;

须要定义 3 * 3 = 9 个变量。

若是是面向对象呢?

//定义一个笔记本类
class laptop{
    int disk;
    int memory;
    bool status;
}

//基于这个类建立三个对象
laptop XiaoQiang = new laptop();
laptop XiaoDa = new laptop();
laptop XiaoXuan = new laptop();

须要定义 3 + 3 = 6 个变量。

或许这也没关系,不就是少写了几个变量嘛?但是试想,若是须要表示的笔记本增长到10000个呢?
在面向过程的世界中,须要定义 10000 * 3 = 30000个变量;而使用面向对象的思惟,只须要定义10000 + 3 = 10003个变量。

准确的讲,若是经过某个类来新建一个对象,这个对象就会把这个类的全部非静态属性和非静态方法复制一份,只要新建了这个对象,就至关于一次性把这个类的全部属性都新建了一次。所以,面向对象有一个最简单的好处,就是把原本须要新建指数个变量才能表示的信息,变成只须要新建线性级别的变量就能表示了。

4、继承

面向对象的另外一个好处就是继承。
“继承”这个词用的十分形象,让人能够瞬间想到生活中父母把本身的财物交给儿女,儿女接受财产的这个动做就是继承,继承也能够说是“下一代”从“上一代”的手中获取了一些东西。“获取”的到底是什么呢?——属性和方法

被继承的类叫作父类(给东西的类),执行继承的类叫作子类(索取东西的类)。继承这个动做能够理解成“以类为模板,又新建了一个类”。

仍是说计算机,计算机分为不少种:PC机、笔记本、服务器...他们都是计算机,有许多共有特色,都有磁盘、内存、CPU...因此能够创建一个“计算机”类,表示全部计算机的模板。然而它们又有各自的特色,全部的笔记本都有电池,全部的服务器都有ECC校验内存,全部的PC都有显示器...因此,能够基于三者的特色分别创建这三个类,都从“计算机”类继承,这样他们既保留了公共属性又有本身的特色。

图片.png

5、多态和接口

还有更厉害的——那就是多态和接口...因为目前能力有限,所以留到下次再写。

6、总结

在我这个小白看来,面向对象比面向过程更贴近实际生活,由于一个对象能够是生活中的实物,因此只须要把这些物品的共有属性抽象出来,就是一个类。面向对象的思惟更容易去理解,也有许多优点(继承、接口、多态...)。

去年,在我初学计算机时,上来就被“面向过程”和“面向对象”这两个词给搞懵了,老师讲课时的解释模棱两可,致使我根本不明白老师在说什么,后来查了一些帖子,发现他们说的也不是很清楚...直到如今学习了PHP和Java,真正的作过了项目,才对这两个词语有了较深的理解。对于上述概念若是有表达错误或者不许去的地方,欢迎指出。

相关文章
相关标签/搜索