我不是知识的创造者,只是知识的搬运工....
![0ee58822f36757e27e4328dc3f0b2c64.png](https://i-blog.csdnimg.cn/blog_migrate/037858dd55b31df97cf110d9637f85d8.png)
Object-oriented Programming:
天上掉下来60k,于是我打算去创业卖包子。买原料,和面,剁馅儿,包包子,蒸包子,收钱...每件事情都自己亲手来,这个创业卖包子的过程就是面向过程;
后来因为我的包子大受欢迎,忙不过来了,于是我就开始招人。有专门和面的,专门剁馅儿的,专门包包子的,专门蒸包子的....我只负责调遣这些人就好了,我调度人手的卖包子的过程就是面向对象
Object-oriented Programming:
程序内部是一个个的block,block里承载了各种各样的功能。
和面向过程的区别:
OOP:当写了一个block(class)的功能之后,它是可以通过后续实例化用于不同的情况;
POP:子程序就算功能相同,在不同的情况下(如参数形式不同)也要写不同的子程序。
例:
设计一个游戏,游戏里有很多怪,每过段时间就刷出来个新怪。
在OOP中:我可以先定义一个class,在这个class里写出这个怪的各种特点(attributes,method),他如何袭击人,血量多少,受伤后会做什么动作,等等等等。
当要刷出来一个新怪时,在程序实现中就是按照这个class新实例化一个object(新怪)。这个新怪的object就能自动拥有独立的属性和功能,而旧怪与新怪之间的状态也能互相隔开,我搞死某个怪也就是删除掉那个怪的object。
OOP:class对标模具
POP:子程序对标工厂中已经搭好的machine
相比于直接操作内存C语言,OOP牺牲了一定的运行效率来换取更清晰的结构和较低的维护成本。
Class 和 对象(Object) :
Class描述的是事物的一个类型,而object是属于某个类型的一个东西。
class和object在抽象的程度上不同
例子:
- <电脑>:是一个class,描述的是一个类别物品的集体;
- “小狐狸的MacBook”:是一个object,是<电脑>这个class中的一个特定物品。
- <人类>:是一个class
- ”每个人“:是一个<人类>中的object。
So:
前者是一个class,后者是class中的一个实例化的object;
某个object属于某个class。
比如“小狐狸的MacBook”属于<电脑>,“小狐狸”属于<人类>。
Field/Properties/Attributes:
一类的事物有一些共有的特征,后面在实例化时会被赋常量值。
人类有身高,体重,性别等;电脑有重量,品牌,大小等。
这些特征在这类事物上都存在,例如每一个人都有身高和体重,尽管大家各不相同。
既然class描述一类事物,那由什么来描述这类事物共有的一些特性呢?这就牵出了实例变量(field)。每一个class都可以有一些field。属于这个class的所有object都会将这些field赋值。
假设<人类>class有两个field【身高】和【体重】。属于<人类>的object“小狐狸”会将这两个field赋值。那么就有:
- “小狐狸”的【身高】= 163 cm
- “小狐狸”的【体重】= 46 kg
同理,<电脑>class有两个field【品牌】和【重量】。
- “小狐狸的MacBook”的【品牌】= 苹果
- “小狐狸的MacBook”的【质量】= 1.4 kg
注意: 在class层面定义field/properties/attributes时,field/properties/attributes是没有具体值的,当一个class实例化object后,属于这个class的object的field/properties/attributes才被赋予具体值。
实例化:
有了field/properties/attributes的概念,就出现了constructor这个造物主一般的存在。某个object属于某个class,同理,根据某个class也可以创造一个object。
方法:
<人类>有【身高】和【体重】这两个field,所以直接指定这两个field的值就可以造出一个属于<人类>的新object
只需传入一些参数,一个class的constructor就能利用这些参数创建一个属于本class的object。如:
- “大狐狸”= <人类>(179cm,65kg)
- 即创建了一个属于<人类>class的新的object“大狐狸”
Method:
通过class不仅可以创造object,还可以改变已有的object的attribute,或是让它们交互。每一个class都有一些method供属于这个class的object使用。使用一个object的method可以输出信息,改变当前object的attributes,也可以跟其他object交流。
Method可以看成这个class中事物都可以做的一些行为。
假设<人类>class可以有method {获取身高}、{增加体重}、{发言}。那么所有属于<人类>的object都可以做这些method行为。
- “小狐狸”·{获取身高} = 163 cm
- “大狐狸”·{增加身高}
Method可以返回一个特定类型的信息,例如{获取身高},也可以不返回任何信息。
三大基本特性:
封装,继承,多态
封装
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用父类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态
Reference:https://zhuanlan.zhihu.com/p/149820907