C眼看J - 初窥JAVA

 

最近一直在学习JAVA,出发点并不是像当初学C++那样,而只是想把JAVA作为下学期参加比赛的工具,带着这种“浮躁”的心态,使得我总是在想“这个用看么?”、“那个用看么?”。

这是第一次在掌握了一门语言(C++)后学习另一门,而这两门语言又很有可比性。于是我体会到了比较两门语言异同的乐趣。

C++放荡不羁,做每一件事都提供多种途径来完成,不同途径之间又有所区别,从而使得语言特性极为丰富。外人看C++书籍,他一定会觉得C++的程序员吝啬得近乎古怪,多一个拷贝构造函数的代价都不愿意付出,想方设法地向语言特性要效率,这是因为C++的优势即在于此,如若不善加利用实在是妄用C++啊!JAVA则非常严谨,每件事情都只提供不多的做法,而且语法规则极其工整,这带来的直接好处就是易学,但是选择范围小就意味着程序优化的空间不大,当然,效率对JAVA来说从来不是主要目标。

C++要向后兼容C,因此面向对象很不纯正,属于混合型语言,允许全局函数这样明显的过程语言成分的存在,但由于先入为主,C++的不正宗反而让我觉得JAVA很别扭。JAVA基本可以算是一个纯面向对象的语言,非面向对象部分只剩下基本类型,还都提供了外包类用于适应对象接口,但是JAVA将main()放在一个随机(因为放在哪里关系并不大)的类中这一点让我比较不喜欢,我觉得这是设计上的不合理,为什么程序一定要百分之百的由类定义组成呢?既然main()这么特殊为何不把它单独拿出来呢?不过这也无伤大雅了,只是给人的感觉别别扭扭的。

其实我曾经思考过这个问题,究竟人类的思维方式是面向对象的还是面向过程的?面向过程的思想就像是:我们接到一个问题后先将其划分为几个解决步骤,其中有共性的抽象出来作为函数可以重复使用,然后按步骤执行。面向对象的思想就像是:我们接到一个问题先分析其场景和场景中的要素,将其抽象为类,然后思考为解决这个问题场景中的各个要素分别应该承担那些任务或者说具备哪些功能,然后程序员所需要做的就是将这些要素组织起来、协调好工作关系,最后启动这一工作即可。总的来说,在面向过程的思想中,编程者像是一个独裁者,一个执行者,他对一起都说的算,周围的一起都像是它的工具――自动化很低的工具,他一一拿起来完成自己心中的计划;而面向对象的思想中,编程者更像一个组织者,一部电影的导演,他组织剧组里的成员,交代分工和工作时的互相配合,然后在启动拍摄后退居到幕后,具体工作由手下按照他早已做好的安排来完成。

那么究竟人类的思维方式是怎样的呢?面向过程还是面向对象?人们解决问题是更愿意扮演操控者还是组织者?这就是因人而异的问题了,说的玄乎点就是思想境界的问题了。人天生的思维方式肯定是面向过程的,就像“把大象放冰箱分三步”一样是分step one two three的,但是随着面对的问题越来越复杂凭借一己之力越来越难以掌控,人就得学着放权,学着合作,学着组织,这就很自然地过渡到了面向对象的思想。所以说,我认为人的原始思维方式是面向过程的,面向对象思想是人对问题复杂性的一种妥协。

C++非常注意效率,这是从C继承的优点,但是效率意味着安全性的缺失,所以很多本应该高级语言本身做的事情它留给了程序员,很多错误对C++编译器来说只会给出一个警告,需要程序员非常全面了解语言的特性才能完全避免此类错误。JAVA则注重安全而忽视效率,据说早期的JAVA执行速度比C/C++要慢上20-100倍!当然现在已经大幅度提高,但是效率仍然是JAVA的罩门;不过安全性就好多了,JAVA是一门真正的高级语言,高级语言就应该离机器远一些,离人类近一些,JAVA编译器为程序员默默地做很多事,比如Class类对象的内嵌,比如toString()的调用,等等,一切都是为了给程序员提供方便,帮助程序员了却一切不应理会的烦恼,而只让其集中精神于用语言解决问题。

C++更像是一个修修补补的作品,它妄图提供所有人们可能用到的武器,但是人们的需求是随着时间变化的,所以C++就不断增加自己的语言特性来适应时代,但是由于是20多年前的语言,某些方面实现地颇为踉跄,比如解决多线程的方案,比如多重继承。而JAVA更加年轻,在它出生之时就知道自己应该具备哪些本领来满足这个时代,因此它的一些特性看起来要比C++自然得多,比如继承体系中的Object,比如Thread类,比如接口和内部类的配合来实现多重继承。

这两门语言产生的背景不同,背负的使命也自然不同。C++来自洪荒,像宝剑,带着浓烈的英雄主义气息,应该为能力卓群的独行侠所佩,它更适合被主人用来完成一些惟其才能胜任的任务――斩妖除魔,而对于一般性的任务,则有杀鸡用牛刀之嫌,并无优势可言;JAVA来自现代实验室,严谨而又整齐,像工具箱,浑身散发着匠人的熟练,不是用来斩妖除魔的,虽能力有限不能杀敌,但是日常生活中林林总总的问题,都可以用它轻易解决,而且上手快好掌握。C++产生的时代,软件开发还是一个小众产业,编程人员更多是和系统啊底层啊之类的概念打交道,所以更注重效率而不注重易用性和接口性。JAVA产生的时代,软件开发已经成为一个必须要很多人通力合作才能完成的工作,而计算机硬件技术的进步也让效率的重要性降低,所以JAVA更注重接口性易用性从而使它的使用者合作起来更容易也就是很自然的事了。

C++和JAVA,无论是语法还是功能都比较接近,两者的不同点很有意思地体现出了两者各自的使命。

胡言乱语一通,其实我在C++和JAVA方面都是菜鸟,只是学习这两种语言的机会让我体会到了很多有意思的事,不记下来实在说不过去,故乱述于此。

 

 

 

posted @ 2012-11-12 14:57  huhu0013  阅读(198)  评论(0编辑  收藏  举报