对于编程与面向对象的一些思考

前言

这一段时间在看Thinking in Java这本书,觉得受益匪浅,便想着将看书过程中所思所想记录下来,便有了这篇博文。其中引用部分均出自Thinking in Java。

正文

编程是什么?
编写程序。
怎么编写程序?
通过一些编程语言。

所有的编程语言的最终目的都是提供一种“抽象”方法。

所谓的抽象,其实就是将机器能懂的语言转换为人能操控的语言,也即所有编程语言的最终目的就是提供一种方法,让人能够自如的操纵机器。

一种较有争议的说法是:解决问题的复杂程度直接取决于抽象的种类和质量。

对于这种说法,笔者是持赞同态度的,在不同的编程语言上就可以看出一些端倪。汇编语言是一种对基础机器进行了少量抽象的语言,后来的很多“命令式”语言,比如FORTRAN,BASIC,C是对汇编语言的一种抽象,与汇编语言相比,这些语言已经有了很多进步——它们更加抽象,但是他的抽象原理仍然要求我们把很多的精力放在计算机的结构上,而非要解决的问题本身上。这样一来就会有很多的弊端,因为程序员必须在机器模型和要解决的问题模型之间建立一种联系,而这件事本身是在编程语言的范畴之外的,并且在不同的平台上机器模型与问题模型之间的冲突会尤为明显。
而面向对象的程序设计则在此基础上迈了一大步。对于问题模型而言,OOP的方式无疑更加灵活,因为程序员可以将问题模型抽象成为一个一个对象,而且对象之间可以进行灵活的配合与调整。传统的程序设计主张将程序看成是一堆函数的集合,或者直接就是对机器操作的一堆指令的集合,而面向对象的程序设计中所有的对象你都可以对他传递信息,可以让他根据信息作出某种响应,这些对象我们都可以将它看成是一个机器,所以解决方案往往会变得非常的人性化与友好,也许你会惊叹:呀,这不是我们在现实生活中的解决方式么!

这无疑是一种更加灵活,更加强大的编程方法。

总之,OOP允许我们根据问题来描述问题,而不是根据机器。那么,OOP到底是怎么一回事儿,它有哪些特征呢?
Alan Kay总结了Smalltalk的五大基本特征,Smalltalk被公认为历史上第二个面向对象的编程语言(第一门是Simula67,但它并不成熟),和第一个成功的面向对象编程语言,同时它也是Java的基础语言。通过这些特征也许我们能更好的理解面向对象编程是怎么一回事儿。

(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。理论
上讲,可从要解决的问题身上提出所有概念性的组件,然后在程序中将其表达为一个对象。
(2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。为了向对象发出请求,需向那个对象“发送一条消息”。更具体地讲,可将消息想象为一个调用请求,它调用的是从属于目标对象的一个子例程或函数。
(3) 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程序中却可达到任意高的复杂程度。
(4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?”。
(5) 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法,大家不久便能理解。由于类型为“圆”(Circle)的一个对象也属于类型为“形状”(Shape)的一个对象,所以一个圆完全能接收形状消息。这意味着可让程序代码统一指挥“形状”,令其自动控制所有符合“形状”描述的对象,其中自然包括“圆”。这一特性称为对象的“可替换性”,是OOP 最重要的概念之一。

其中第一点说可以将对象看成一种新的变量,它保存着数据,并可以有一些事件的响应动作,但是笔者以为,与其说可以将对象看成变量,不如说其实每一个变量就是一种对象,只是由于一些变量存在的必要性和使用的频率原因,出于在性能上的考量,将它设置成了主类型(在Java中,主类型的变量大小是确定的,所以将可以将主类型的对象实例存储在堆栈中,并且对它进行了享元的处理)。

结语

本篇博文主要讲了编程和面向对象编程中一些比较宽泛的东西,介绍了编程是什么,如何编程,以及在这个过程中面向对象的程序设计会给我们带来哪些好处等等,后续如果有时间的话也许会把更加详细的一些东西整理出来。

你可能感兴趣的:(java,编程,面向对象)