TIJ学习笔记(一)——OOP

版权声明:欢迎来到我的个人博客:https://blog.albumenj.cn/ https://blog.csdn.net/AlbumenJ/article/details/82954313
这是Thinging in Java学习笔记的第一篇,主要是写了OOP是什么。
第一次写肯定有许多不足的地方,欢迎斧正。

Object

        要了解什么是OOP(Object-oriented programming),首先需要了解什么是Object
下面引用甲骨文官方文档对Object的解释

Real-world objects share two characteristics: They all have state and behavior. Dogs have state (name, color, breed, hungry) and behavior (barking, fetching, wagging tail). Bicycles also have state (current gear, current pedal cadence, current speed) and behavior (changing gear, changing pedal cadence, applying brakes). Identifying the state and behavior for real-world objects is a great way to begin thinking in terms of object-oriented programming.

        翻译过来就是,Object和现实世界的东西一样有状态和行为

        基于这一概念,我更喜欢港台对Object的翻译——物件(即物件導向程式設計)

        但平时对OOP的翻译更多的是面向对象编程,可对象是什么呢,这里很容易就想到找对象或者和对象有关的事情,所以这个词很容易引起误会。而物件则可以很好地将显示世界的东西与编程世界的东西连接起来。但为了后文的易读性,我还是会选择“面向对象编程”来写完本文。

抽象的过程

        汇编语言是对底层机器的轻微抽象,接着出现了许多“命令式”语言(“imperative” languages)对汇编语言进行抽象。这些语言比汇编语言人性多了,但是它们仍要求在解决问题时基于计算机的结构,而不是所要解决问题的结构来考虑,即是我们所说的面向过程编程。

        在上世纪60年代,以simula为标志的面向对象技术开始被人熟知。

        Simula 是为了解决诸如“银行出纳员问题”这样的仿真程序所创建的。在银行出纳问题中,有出纳、客户、账户、交易和货币单位等许多“对象”,他们都符合上文提到的对象具有的两个特性,如账户中的存款金额,转账等。因为有了这些对象,开发者可以从问题出发、而不是从计算机出发,降低了开发成本。

        OOP这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题。因此,当在阅读描述解决问题方案的代码的同时,也是在阅读问题的表述。相比之前的面向对象编程,OOP是一种更灵活和更强有力的语言抽象。
Alan Kay曾经总结了第一个成功的面向对象语言、同时也是Java所基于的语言之一的Smalltalk的五个基本特性:

  • Everything is an Object.
  • A program is a bunch of objects telling each other what to do by sending messages.
  • Each object has its own memory made up of other objects.
  • Every object has a type.
  • All Object of a particular type can recive the same messages.

        上面都是很书面化的文字,通俗来说,面向过程和面向对象的区别是就是你在想一个问题的时候角度的不同。

        比如你要把一个苹果切开,面向过程的做法是:洗好刀、拿起刀、对准苹果、切下去;而面向过程的做法是:刀,你给我准备好、刀,把苹果切开。

        很明显可以对比出,前一种是站在具体执行的角度去思考问题,安排好每一个具体而微的动作;而后一种则是站在人(或者是刀)的角度去思考,去指挥刀去干活,而不是自己去一步一步干活。

        更通俗来说,面向过程是上帝自己干活,面向对象是上帝制造人类,指挥人类去干活。

封装(Encapsulation)

朕赐给你的才是你的,朕不给,你不能抢。

        上面这句话颇有封装的意味。

        public(朕赐给你的)谁都可以用,private、protect(朕不给)其他人都用不了。protect关键字和private关键字相当,差别在于继承的类可以访问protect成员,但不能访问private成员。

继承(Inheritance)

        对象(Object)可以使你通过概念很方便将数据和功能封装到一起,对问题空间的观念给出恰当的表示,而不受制于必须使用底层机器的语言,这些概念用关键字class来表示,它们形成了编程语言中的基本单位。

        可这样做还是有许多麻烦:比如你要画三种图形(圆形、正方形、三角形),创建完这三个类以后发现好多相似的代码啊,如果有一个类为基础,复制它加入每个图形那点特殊的地方形成一个新类该多好啊。

        如下图,通过继承 可以很好地做到这一点。

TIJ-1

多态(Polymorphism)

        在类型的处理结构层次时,你可以不把对象当仅仅当作所属的特定类型来看待,而是当作它的基本类型来看待。在上面几何的例子中,我们可以直接把圆形(Circle)等当作形状(Shape)来看待,直接控制它。

        由于添加新类型是拓展一个面向对象程序以处理新情况的最常用方式,将操作泛化(generic)无疑可以将添加的影响降到最低。

        但是,在试图将导出类型的对象当作其泛化基类对象来看待时,编译器并不知道哪一段代码需要被执行,draw()方法可以被应用到每一种图形。

        为了解决这一问题,面向对象程序设计语言使用了后期绑定的概念,即是当对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。

参考资料

《Thinking in Java》 Fourth Edition ——Bruce Eckel

What Is an Object? —— Oracle JavaTM Documentation

猜你喜欢

转载自blog.csdn.net/AlbumenJ/article/details/82954313
今日推荐