• 2004-06-18

    大头随笔(二)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/227618.html

    曾经下过几次决心学Java,但最终都是看了开头的一点东西就不再继续了。这次却因为项目需要,不得不学起了Java。

    截止到写这篇文章的时候,我用Java的时间也没多长时间,根本谈不上对Java有全面的认识。学习新的东西总是会有新的体会,只怕时间长了,自己忘记这种感觉。留下这种感觉,目的是如果自己日后真有一不小心成为高手的那天,回过头来看看,还能知道自己也曾有过今天,也算不曾忘本吧!

    之所以以前好几次学Java都没有结果,主要是因为我确实不知道我学了Java可以干点什么:桌面系统,Java编出来的太慢;Applet,我又很少做网页;分布式,离我太远。对于学习编程的人来说,没有实践确实是件很恐怖的事情,于是,我觉得自己进行不下去了。

    这次学Java的前提是项目需要,就算我不知道Java能做别的什么,起码还知道Java可以用来做我们的项目。:)

    还是说说自己学习Java的感受吧!下面的叙述中,不得已用Java和C++做了许多比较,毕竟C++是我最熟悉的,但这里没有让二者一较短长的意思。

    就目前的认识而言,Java确实是一个相当不错的语言。

    感觉上Java和广告说的差不多,和C/C++类似,但要简单了许多。

    单从OO的表达能力上来说,Java是很强大的。虽然大多数语法同C++类似,但改变或是添进来的东西,就很好地让Java表达能力得到了提升。眼下看了一些设计模式的东西,觉得很多东西用Java表述出来要比C++更为合适。设计模式里许多概念就是Java中Interface,如果用C++,感觉上就差了一些,它里面用到的那些概念更像是Java中抽象类。我得出的结论就是,在OO的表达上,Java>C++。但问题是,C++里还有个GP,那简直是个神奇的东西,了解得越多越是感觉如此。所有我又得出另一个结论,总体上,表达能力C++>Java。如果Java中能正式引进GP,简直太爽了。(我知道现在什么GJ,但毕竟那还没成为标准吧!1.4?我不清楚)

    了解Java,对于理解C++也是相当有帮助的。毕竟二者之间有太多的相似之处了。我就是通过Java,弄清楚了许多在C++中没有弄清楚的问题。尤其是在面向对象编程上,更是如此,因为Java中强调的就是面向对象。这方面最好的例子应该是多态的运用,再说明白一点,就是C++中的虚函数。《C++编程思想》里把虚函数称为基于对象和面向对象的分界线(注:见《C++编程思想》第14章引言部分),呵呵,也就是说如果没有运用虚函数这东西,编出来的C++程序,应该称为基于对象的,而非面向对象。事实上,好多人,包括我自己,在开始学C++的时候,都一直以为自己的程序中用到了类就是面向对象。在Java中,没有这么虚函数这么个概念,然而,它的函数上来就是和C++虚函数等价,也就是说,用Java写程序,不知不觉就开始面向对象了。:)

    Java的简单只是相对而言的,理解其中得内涵也不是那么容易的事,而且它正在变得越来越复杂,命苦啊!

    Java有个很强大的库,Java的库也是Java强于C++的地方,虽然C++也有各种各样的库,但与Java相比,最大的缺点在于标准,相对于Java,C++标准库中的东西实在是太少了。这也难怪,毕竟Java是由一个公司支持的,而C++不是。

    使用Java彻底改变了我的思维方式,以前遇到问题总是习惯于自己想解决办法,曾经就干过编写函数将数字转化为字符串的蠢事(很笨吧!)。刚开始学Java的时候,也曾冒过这样的傻气:因为项目的需要,我曾经用Java实现过SMTP协议,后来我才知道,实际上这东西用JavaMail API就可以搞定。对于编程的人来说,什么东西都从轮子开始打造绝对是个陋习,想想,不站在巨人的肩膀上,怎么能看得比巨人远呢?再说实惠点,拿一样的钱,少干活岂不很爽!

    幸而有高手指点,告诫我,不要什么指望什么都自己做,于是我有机会发现Java类库的强大。在Java里,遇到问题,尤其是比较通用的问题,比如前面提到过的字符串转化,一般要去Java标准类库里去寻找。即便不行,还有许多扩展API伺候着。现在比较名头叫得比较响的XML和SOAP,如果从头做起,呵呵,肯定可以,我不否定,只怕等到花儿也谢了,你就能完成了。实际上Java里都有相应的API,直接调用就可以了。再不行,还有许多人为你提供他们写的Java API,最好的例子就是Apache那个开源项目有太多的好东西了,当然,不只是Java API。事实上,Apache中提供的API对Sun的那套标准也有很大的影响,不说了,再扯就远了。

    唯一要说的是,Java这些编外API的用法有的可能不像字符串转换那么简单,这就需要找一些文档来读读,而实际情况是没有中文的,只有英文的,对人家高手来说,无所谓,对我们这样的低手来说,可能稍微困难了一点。不过,请相信我,这不是大学里四六级考试,写文章的人是希望你能看明白,所以,通常情况下,这样文章都是比较简单的英语,如果你不是打算“信、达、雅”地把它译成中文,看懂没有任何问题的。

    正是因为Java有这些特点,采用Java解决问题时,我们就更容易把精力集中于要完成问题的本身,而不是一些无关紧要的东西上。这样,我们就可以想办法使自己的程序做得更好一些:在结构上如何调整(吹得玄点叫重构),设计是否可以更好一些(有人说得懂设计模式)。

    当然,Java也有很多的不足,其中的最大问题,莫过于它那为人人诟病的效率问题。没办法,毕竟它和一般的编译语言相比,中间还隔了个虚拟机。编译原理带给我们的知识是,一般编译的语言,像C语言,都是直接生成相应的二进制代码,而Java编译出来的却是著名的bytecode(字节码)。二进制代码可以直接运行,而字节码却需要由运行在Java虚拟机上。Java虚拟机说起来很神,其实它就是一个模拟器,如果把它等同于我们常接触到的游戏的模拟器,比如任天堂模拟器,似乎它就不那么神秘了,不同的是,它模拟的是计算机——一种抽象的计算机(当然,如果做成Java芯片就成了具体的计算机了,^_^)。可以想象,Java程序执行的时候,先要执行在虚拟机上,而虚拟机仍要执行在真正的计算机上,显然,这中间多了一道手续。学过几何的人都应该知道两点之间线段最短,同样的速度,多走了一段路,难免会慢。同样的道理,如果开发Java编译器的工程师和开发C语言编译的工程师实力相当,Java程序就要吃亏了。由此也能看出一个问题,Java所谓的“一次编写,到处运行”根本就是一个谎话,如果相应的硬件平台上没有Java的虚拟机,就别指望Java程序能够顺利运行,即便它已经被编译成字节码了。

    接下来,谈谈与Java语言本身关系不那么大的东西。

    Java的IDE环境很多,小到记事本,大到有多少内存都不显多的JBuilder。不同于Pascal和C++,几大主流IDE占据大部分天下,Java的IDE大战正在精彩上演,大家各有各的优点,各有各的长处。之所以很难出来个一统天下或是多半统天下的IDE,我的看法是,优点多的都太慢,比较快的功能又太简单。如果哪位兄弟或是姐妹对这块蛋糕感兴趣,也可以下手哦!^_^如果只是初学Java,根本没有必要使用像JBuilder这样的大家伙,除非你的内存太多了,Editplus就可以。使用它,可以配置用户工具,这样就不必打开一个控制台窗口(就是很多人说的DOS窗口)来编译运行了。

    JUnit,一个用于单元测试的好东西。现在比较流行的XP(extreme programming,极限编程),其中很重要的一个观点就是强调单元测试。我的水平还不足以发挥出JUnit的大部分威力,但仅仅用它的一小部分就可以帮上我不少的忙。我现在基本上都是,写个小程序,编个小测试用例,跑一下,虽然不能保证所有的问题都能找出来,起码可以证明一下自己写的程序逻辑上是正确的,自我满足一下。

    提到IDE和JUnit的目的,主要因为是我觉得在学习Java的时候,工具还是挺重要的。而Java在工具上多得让人觉得有点不可思议,上面只是举个例子。

    一位高手给我的指点是,Java本身并不只一种语言,它是一种技术,换句话说,它是个大杂和体。所以,才会有Java 2 Enterprise Edition(J2EE)、Java 2 Standard Edition(J2SE)和Java 2 Mobile Edition(J2ME)等等。如果只研究Java语言本身,一套J2SE就够了,而事实上,现在只了解J2SE好像也干不了什么。所以,才有J2EE和J2ME。那两个东西就是Sun为大家提供的一套框架,让人干活时觉得更轻松。事实上,只有真正了解了,才能发挥出其威力,才可能感觉轻松。别指望前面的学习过程会很轻松。不多说了,我对这两个东西也不了解,再说就露馅了。

    回到前面提到过的“Java究竟能做什么”的问题。对初学者来说,恐怕依然存在很大的困惑。前面想到的那些问题对于现在的Java依然存在,而且看样子,短时间之内,没有上面好转的趋势。就我所知,现在Java主要应用于企业级开发和嵌入式开发中,这似乎离初学者的需求远了点。不过,我以为Java可以用来学习数据结构,用来理解面向对象,这倒是学习Java的一个很不错的理由。Java中的GUI虽然离真正应用起来还有很远(别跟Sun学,它打算让你把所有的钱都花在内存上),但学习其中的编程模式也是不错的想法。:)说来说去,怎么都觉得Java不适合作学编程的第一门语言。当然,如果哪位为了学Java而学Java,谁也管不了。

    最后要说的是,不要等着什么都学完再去编程。这是基于在论坛中看到一些帖子想到的,事实上,当我厚颜无耻的在这里论述Java的时候,很多的Java语法我都没搞清楚,但这并不影响我写程序。那些不清楚的东西,用到时候再去查,来得及。当然,一些太基本的东西都不知道的话,那就没办法了,还是先打个基础吧!

    祝编程愉快!

    分享到:

    历史上的今天:

    Hello, Modernizr 2011-06-18
    苍天作弄 2008-06-18
    引用地址: