古法编程秘籍(一):什么是面向对象?别背定义,把 JSON 看懂就够了

0 阅读3分钟

Hi!这里是 JustHappy 这是专为编程初学者准备的专栏,哈哈,AI 时代更需要我们返璞归真!

image.png

每个学编程的人,几乎都会遇到一个词:面向对象

然后就会看到三个经典概念:封装、继承、多态。 很多教材会告诉你:面向对象是一种编程思想。 但这句话其实和没说一样。 今天我们不用 Java,不用 C++,甚至不用代码。 只用 JSON,把面向对象彻底讲明白。

JSON 是一种用“键:值”的结构来表示和传输数据的通用文本格式,看起来像对象/字典,机器好解析、人也好读。

一、什么叫对象?

现实世界里有什么?人、汽车、手机、猫、狗……这些都叫对象。

因为它们都拥有两样东西:属性行为

例如一个人:

{
  "name": "张三",
  "age": 18,
  "gender": "男"
}

这里的 name、age、gender,就是属性。

如果给它增加行为:

{
  "name": "张三",
  "age": 18,
  "actions": [
    "eat",
    "sleep",
    "study"
  ]
}

那么这就是一个完整的人。

所以对象其实没那么神秘。一句话:

对象就是现实世界中的一个具体事物

二、什么叫封装?

很多教材会说:把数据和方法包装到一起。新手通常听不懂。

我们换个角度。

假设你的银行卡长这样:

{
  "cardId": "6222xxxx",
  "balance": 5000
}

理论上谁都可以改余额:

{
  "cardId": "6222xxxx",
  "balance": 999999999
}

那银行第二天就倒闭了。

所以真正的银行卡应该这样:

{
  "cardId": "6222xxxx",
  "balance": "private",
  "methods": [
    "deposit",
    "withdraw"
  ]
}

用户看不到余额的存储方式,只能通过存钱、取钱两个入口操作。

这就是封装。

封装不是为了炫技,而是为了保护数据。

所以封装的本质是:

不让别人乱改我的数据。

三、什么叫继承?

现实世界中很多东西都有共同特征。

例如:

{
  "type": "动物",
  "hasEyes": true,
  "canMove": true
}

猫是动物:

{
  "type": "猫",
  "hasEyes": true,
  "canMove": true,
  "sound": "喵喵"
}

狗也是动物:

{
  "type": "狗",
  "hasEyes": true,
  "canMove": true,
  "sound": "汪汪"
}

你会发现 hasEyes、canMove 重复出现了。

于是程序员说:这些公共部分抽出来。

变成:

{
  "Animal": {
    "hasEyes": true,
    "canMove": true
  }
}

然后:

{
  "Cat": {
    "extends": "Animal",
    "sound": "喵喵"
  }
}
{
  "Dog": {
    "extends": "Animal",
    "sound": "汪汪"
  }
}

这就是继承。

继承的目的只有一个:代码复用

四、什么叫多态?

这是最容易把人绕晕的概念,其实特别简单。

先看两个对象:

{
  "type": "Cat",
  "sound": "喵喵"
}
{
  "type": "Dog",
  "sound": "汪汪"
}

它们都有一个动作:speak(),但是结果不同。

猫执行会得到“喵喵”,狗执行会得到“汪汪”。

你会发现:虽然调用的是同一个动作,但表现不同。

这就是多态。

程序看到的是“动物.speak()”,实际执行时是“猫 -> 喵喵,狗 -> 汪汪”。

所以多态本质上是:

同一个命令,不同对象有不同表现。

五、面向对象到底解决了什么问题?

如果没有面向对象,代码会越来越像:一堆变量、一堆函数、一堆 if else,最后没人知道谁是谁。

而面向对象做的事情非常简单:按照现实世界组织代码。

人归人,车归车,动物归动物。每个对象管理自己的数据和行为。

于是代码世界开始变得有秩序。

所以面向对象最核心的一句话其实不是“封装、继承、多态”,而是:

用现实世界的思维管理程序世界。