面向对象编程
在面向对象编程的世界里,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为对象,对象可以接收消息,解决问题的方法就是创建对象并向对象发出各种各样的消息;通过消息传递,程序中的多个对象可以协同工作,这样就能构造出复杂的系统并解决现实中的问题
面向对象编程:把一组数据和处理数据的方法组成对象,把行为相同的对象归纳为类,通过封装隐藏对象的内部细节,通过继承实现类的特化和泛化,通过多态实现基于对象类型的动态分派。
类是对象的蓝图和模板,对象是类的实例,是可以接受消息的实体
在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类。对象的属性是对象的静态特征,对象的行为是对象的动态特征。
现在举个例子,比如现在由一辆汽车,汽车的外观是红色,并由发动机、方向盘、轮胎等组成,并且汽车可以行驶在马路上。如果将汽车搬到Java语言中,汽车就是一个对象,外观、发动机、方向盘、轮胎都属于汽车对象的属性,行驶的动作就是汽车对象的方法。
综上所述,对象的特征分为静态特征和动态特征两种。静态特征指对象的外观、性质、属性等,动态特征指对象具有的功能、行为等。
人们将对象的静态特征抽象为属性,用数据来描述,在Java语言中称之为变量;人们将对象的动态特征抽象为行为,用一组代码来表示,完成对数据的操作,在Java语言中称之为方法。一个对象由一组属性和一组对属性进行操作的方法构成。
以传感器为例:
1、静态特性:指传感器本身具有的特征特点。
研究的几个主要指标有:线性度、精度、重复性、温漂等,通俗讲就是:非线性误差大小、线性误差大小如何、多次应用好坏、受温度变化误差大小等等;
2、动态特性:指传感器在应用中输入变化时,它的输出的特性。
常用它对某些标准输入信号的响应来表示,即自控理论中的传递函数。实际工作中,便于工程项目中的采集、控制。
写在类里面的函数我们通常称之为方法,方法就是对象的行为,也就是对象可以接收的消息
在很多场景下,面向对象编程其实就是一个三步走的问题。
第一步定义类
第二步创建对象
第三步给对象发消息。
当然,有的时候我们是不需要第一步的,因为我们想用的类可能已经存在了。之前我们说过,Python内置的list
、set
、dict
其实都不是函数而是类,如果要创建列表、集合、字典对象,我们就不用自定义类了。当然,有的类并不是Python标准库中直接提供的,它可能来自于第三方的代码,如何安装和使用三方代码在后续课程中会进行讨论。在某些特殊的场景中,我们会用到名为“内置对象”的对象,所谓“内置对象”就是说上面三步走的第一步和第二步都不需要了,因为类已经存在而且对象已然创建过了,直接向对象发消息就可以了,这也就是我们常说的“开箱即用”。
在面向对象的世界里,一切皆为对象,我们定义的每一个类其实也是一个对象,而静态方法和类方法就是发送给类对象的消息。
那么,什么样的消息会直接发送给类对象呢?
举一个例子,定义一个三角形类,通过传入三条边的长度来构造三角形,并提供计算周长和面积的方法。计算周长和面积肯定是三角形对象的方法,这一点毫无疑问。但是在创建三角形对象时,传入的三条边长未必能构造出三角形,为此我们可以先写一个方法来验证给定的三条边长是否可以构成三角形,这种方法很显然就不是对象方法,因为在调用这个方法时三角形对象还没有创建出来。我们可以把这类方法设计为静态方法或类方法,也就是说这类方法不是发送给三角形对象的消息,而是发送给三角形类的消息,代码如下所示。
即,某些属性与class相关,但与具体的class实例无关。
类和类之间的关系可以粗略的分为
is-a关系(继承)
has-a关系(关联)
use-a关系(依赖)