“上帝创造了人,并给了人思想,而思想是决定万物的根本尺度” ——引
面向对象的概念
面向对象指面向客观规律之间的关系,人类平常的思维方式就是面向对象的,自然界的事物与事物之间是对象与对象之间的关系。我们要解决一个问题时,这个问题就变成了对象,而这个过程就变成了面向对象。
一切都是对象
(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己 该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”( Class )是“类型”( Type )的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5) 同一类 所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”( Circle )的一个对象也属于类型为“形状”( Shape )的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是 面向对象最重要的概念之一。
面向对象给我们带来了极大的灵活性,面向对象编程中我们更加关注的是对象与对象的关系,整体的架构也就是各个对象之间的关系。
面向对象语言的主要特性
这里用java语言来描述
【1】封装性
封装体现的是软件的内部有更好的模块性基础,
强调的是“高内聚、低耦合”,防止程序因相互依赖性而带来的变动影响。面向对象封装的基本单位是对象,它比传统的语言更为清晰,封装的主要内容是对象的属性以及行为。在一个类中,对象的属性用变量或常量来表示,行为用方法来定义,方法可以直接访问对象中的一个或多个属性。把对同一个对象的进行操作的方法和相关的方法放在同一个类中,把同一个对象的操作和数据放在同一个类中。
例如:一个女孩想用手机进行自拍然后分享出去 这个过程就涉及到女孩、手机、自拍照几个对象,而女孩本身是不能直接生成照片的 拍照是手机里面的功能 所以女孩是使用手机去拍照的 拍照以及分享照片的功能就相当于手机里面封装的方法,女孩不需要知道它是怎么实现的,而是直接调用手机→拍照这个对象的方法来实现自拍。
这就是面向对象的封装性。这个例子应该比较形象了……
【2】抽象性
抽象就是找出一些事物的相似和共性之处,然后把它们归类到一类事物中去,只考虑这些事物
的共性之处,忽略与这些事物无关的东西。
例如:每个人都有自己的年龄、名字和生日 这些东西是人共同拥有的。
如: 定义一个Person类
class Person{
String name;
int age;
String birthday;
}
人是有多个方面属性的事物,而当前只需了解人的这些最基本的信息,就把它们归到一个类中,
这就是一种抽象。当我们需要时,就根据不同的对象来传入对应的参数,而不需要为每个对象都去重新定义属性。抽象就是根据当前需要的东西去将他们归类,而不必考虑与它无关的事情。
【3】继承性
在定义和实现一个类时,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并且可以继续添加新的内容,或者根据自己的需要进行修改,这就是继承。
举个很简单的例子:
定义一个父类
class Father{
public abstract void property();
}
然后 定义一个子类
class Son extends Father{
public void property();
}
这里定义了一个父类和一个子类,儿子在父亲死后要继承父亲的财产。因为不是和父亲做同一种行业,所以可以把继承的财产用来自己做生意。
面向对象中的继承类似于此。
【4】多态性
多态(也称作动态绑定、后期绑定或运行时绑定)是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才能够确定。多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序——即无论在项目最初创建时还是在需要加新功能时都可以“生长”的程序。多态方法调用允许一种类型表现出与其它类型相似的区别,只要他们都是从同一个父类导出的。不修改原程序代码,就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,极大的增强了程序的灵活性。
例子:假设在节假日,和朋友聚在一起,这时突然有人提出一个抽牌游戏。……于是我们多态性就开始了,首先拿来一副扑克牌,你和朋友一人抽一张牌,然后把抽出的牌摊开来比较大小。
先看看如下代码
Board play=playfactory.getBoard();
player.openBoard(player1);
我们抽扑克牌时是随机的,调用getBoard方法抽取到牌后我们并不知道这张牌数字是多大。每个人抽到的牌都是不一样的,也就是说这个过程所得到的对象是不一样的,而每个人抽牌以及摊开牌的流程都是一样的,最后在使用openBoard方法分别翻开抽到的牌时才知道自己抽到的牌真正的数字……(这就类似于动态绑定 运行时才知道结果)
从世界的角度来看,不同对象之间的相互作用与通信构成了完整的世界,世界因本孤立的对象的相互影响而变得丰富,对面向对象的理解也是对现实世界的理解,只有这样才能更好地与现实世界结合。
从面向过程到面向对象主要改变与提升的是人的思想与思考方式,因此应该用面向对象的本质去看世界,面向对象的思想、技术能帮助我们构建与现实世界相适应的问题模型,并保持着他们的结构、关系和行为模式。