浅谈OOP与现实世界之间关系(面向对象的特征)

面向对象程序设计语言(Object-Oriented Programming ,OOP)是一种用计算机表达现实世界的方式。从现实世界到能用计算机表述过程中抽象无处不在。

  1. 对象

由于现实世界中基本组成的元素就是各种各样的object,所以object也成为了OOP语言基本组成的元素。可以这么说只要能想到的东西无论是抽象的还是具体得都是一个object,比如:狗,建筑,方法,类,服务等等。那么计算机如何表述object(对象)呢?从现实世界问题中抽象出一个模型,分析模型有那些object组成(中心名词),同时模型中存在着某一object的某些行为(动词),或者描述这个object的一些状态信息(形容词,副词,修饰语等)。为了让计算机更好的去表述给出的问题,那么我们就把这些对应于一个对象上的状态,行为封装在一起,形成一个object。这样计算机就会知道这个object在这个问题中有某某行为有某某状态。

比如:黄色毛发的狗啃猪的大腿骨。这样一看就会发现,虽然毛发、狗、啃、猪、大腿、骨头等都能看作object,但是狗和骨头才是这个现实问题的中心,所以抽象出狗和骨头是object,然后为了能让计算机更好的描述这个问题,就要找出狗的一些行为(啃)和特征(黄色毛发)和骨头的一些特征(猪的大腿骨)。这样计算机就能很好的表述了这个问题。可以看出,对象可以看作是一个“服务的提供者”。
2. 封装

上述例子中提到了封装的概念,所谓的封装,就是将对象的行为和状态等一系列有关的信息打包在一起,让我们乃至计算机仅仅考虑这些对象之间的逻辑性,而去除了一些修饰性的成分,连这些行为和状态的具体编程实现都不会去考虑。对象与对象之间的交流通过封装后提供外部的接口去实现交互,很显然封装简化了我们思考问题方式,同时提高了代码的可读性。同时在封装的某些行为和状态信息上还能加某些权限实现隐藏具体的实现,起到限制的作用。

其实可以这么讲,封装就是将一个实际问题提炼主干成分的过程。比如上述例子:黄色毛发的狗啃猪的大腿骨,简化之后就是狗啃骨头。所有的OOP程序都建立在封装之后,所以我们之后所有谈论的特征都在表述狗啃骨头,而不是黄色毛发的狗啃猪的大腿骨。
3. 组合

我们会发现,现实世界是一个高度抽象的世界,为什么会这么说呢?比如还是狗这个object,我们之所以将这个object称为狗不是桌子,原因很简单组成的成分不同并且他们的行为状态也不一样(这是上面的概念了)。它是由一些对象(四只腿、尾巴、舌头、耳朵等)组成了一个新对象之后,贴上个标签 “狗”。对应与计算机中,也就是说一个(服务)对象可能由多个小的服务组成的,只不过这个大的服务将这些小的服务包装在了一起加上一些行为和属性之后贴上一个“狗”的标签。

从设计角度说,在将一个问题抽象完了之后,对这个问题进行解剖,需要有很多服务去支撑这个问题,但是这些服务再细分之后发现,这个服务还由更小的服务组成,这样思考下去就会觉得代码实现这个问题变的简单,提高了代码的内聚性,这无不是代码复用的好处。
4. 继承

正如上述所说的,我们生活在一个抽象的世界中,“狗”是一种核心的概念,这个核心的概念可以有各种实现方式,比如:藏獒,沙皮等“狗”这个核心的类型与藏獒这些实现的类型之间有一种层次结构,这种层次结构表述了类型之间的相似性和差异性。

在计算机上实现来说,继承无疑是一种很好的代码复用的方式,从核心的类型(基类)那里获得共有的一些属性和行为,然后创建出一些实现类型(导出类),这些导出类的行为对继承而来的行为方式可能有所区别,所以就覆盖了原来的行为实现,重新实现该行为,另外的,还能在共有的行为基础上添加一些特有的属性和行为。但是总额来说发送给基类的信息对导出类同样适用,并且他们组合元素也相同 所以可以看出导出类的类型和基类的类型都属一类类型。
5. 多态

一开始就提到,现实世界导出充满了抽象,这些抽象接近于一种泛化的概念,比如狗啃骨头,我们不会说哪种类型的狗以这种类型狗啃骨头的方式啃一块什么类型的骨头。当我们指向一只土狗在啃骨头的时候,我们就会知道是那种类型的狗在以它的方式去啃这块猪的骨头。所以在一个场景确定的情况下,我们仅仅表述狗啃骨头就知道想表达什么意思了。同样的如果没有这个场景,我们都会任意的脑补出一个场景来。一个核心object(在现实世界是极度抽象的)具有的多种形态,并且使用时仅仅用这种核心的概念指带 实现这个核心的object就是多态(比如用基类带指导出类、一种行为可以用重载的方式多出实现)。

多态在java中存在这重要的地位,正是有了多态我们才能更好的表述这个现实的富有抽象具有概括性的世界,会发现,多态应用于各个方面,包括方法(重载行为)等,java 对它的支持就是动态绑定机制,这个机制是java的核心问题。

(原谅我初学java,出现错误多多指教 QQ:2110551525)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值