原创申明:本文内容为作者辛勤原创,未经允许,请勿转载,感谢您的理解。
对于初识Java的程序员来讲第一个难点不是Java的语法。而是为什么Java是一门面向对象的编程语言?笔者根据自己的经验,尝试为大家解释这个问题。
首先什么是对象?
这里的“对象”与我们中文概念上的“对象”是有差异的,我们中文普遍意义上的对象是指“标的物”,被翻译成英文是Target。但Java语言里的对象不是这个意思,而是指“任何物体”的一种统称,更接近于中文“东西”这个词,所以在英文里它被翻译成Object。
上面的一段解释,话糙理不糙,对象的的确确就是这个意思。如果你一定要一个高大上的解释,那么我也可以给你一个:Java中的对象是指任何物体的抽象,面向对象的设计过程即是事件的抽象过程。这句话的原话并不是我说的,只是以我自己的语言表达了出来。
面向对象的历史。
面向对象的英文原词是“Object-Oriented”,也可以理解为一切都基于对象,当然这个解释几乎没有任何意义,不理解的还是不理解,但回头你再来读读就别有意味。我们来谈谈程序语言的发展历史,面向对象这种语言出来之前,主流的是面向模块的程序设计,这种模块你可以理解为一个小模块也可以理解为一个子系统;再之前则是一种面向过程的程序设计方式,现在再谈这个,就有点惨不忍睹。
面向模块的程序设计的一些美中不足
面向模块的程序设计能满足绝大多数情况,极大的提高了代码的复用程度,即使现在在写Java代码时,有时也会用面向模块的思路,在代码的世界里,没有什么不可能的,符合场景即可,这点大家要记住。
但很快一些问题暴露了出来,我这里举几个例子大家就明白了。
例子一:程序运行久了,我们的内存怎么回收呢?能把整个模块回收吗?
例子二:一个超复杂的A模块已经被开发完成。但是项目中又需要开发一个B模块。但B模块有99%的功能都与A模块一致。难道我们要为这1%的功能重新写一个B模块吗?当然对程序员来说总是能找到各种方法来实现。但十个程序员能形成九种套路,这样模块如何维护呢?
面向对象的根本目的在于复用
可以说不止面向对象是为了复用,任何一种编程模式的提出或改进,都是为了提高程序的可复用性,最终提高程序开发的效率。面向对象其实也不例外,只是其中一种行之有效的实践方式。
在Java的世界里一切都是对象。
你写任何一行代码其目的无非是:
完善这个对象内部的结构;
实现某个对象一个特殊的功能;
申请某个对象具有什么能力(接口);
所以你在Java世界里,你所做的一切都是围绕对象的,甚至你看不到的内存回收,也是基于对象回收的。
上一段我主要回答了大家Java就是一种面向对象的语言,但我没有回答大家:Java为什么要设计成一种面向对象的语言?以及设计成面向对象的语言能为大家带来的好处。
面向对象的Java给大家带来的好处。
面向对象是一种对现实生活的抽象。
我们复杂的人类社会,其实也是一种面向对象的设计。如果上帝真的存在的话,他会告诉你,他就是用一种面向对象的方式把整个世界设计出来的。从理论上来讲,面向对象更能适应复杂的编程需求,因为人类世界自己已经证明了。
“承诺”与“封装”。
一个对象的类申明,方法申明,都体现的是一种承诺,即“对象明确地向外界承诺,自己能提供哪些功能”,之于实现的细节,都被封装在内部,调用者不需要了解实现的细节。当然,仅这个角度来讲,基于模块的编程也能实现相同的目的,但等下你马上就能看到差异了。
对象的功能可以被继承,并在此基础上演进。
这个功能在Java里称为继承与多态,或继承与重写。子对象能继承父对象所有的行为,且能按需要修改其中某一实现细节,仅仅修改某一细节,类似这种,面向模块编程很难实现。
对象可以作为参数返回值体现在方法调用中。
上文讲的继承大大提高了代码的复用程度,而本段讲的这种灵活的参数传递方式及返回值传递方式,则大大提高了代码组合的灵活性,继续与组合以及它两之间的选择问题,是将来你写代码时几乎最常遇到的问题,即使你没意思到,它们无所不在。通过这种灵活的组合方式,我们能轻松的实现一些复杂的逻辑代码。
好了,面向对象的概念我就给大家讲到这里。如果有什么不懂的,欢迎大家回复我,如果能解释的,我一定帮大家解释清楚。