今天是我开始Java编程的第三周,虽然勉强编出能跑的程序,但是感觉自己对Java的理解还是不够深入。尽管如此,我还是总结了一些关于Java的一些体会。
首先,我们都知道,Java是面向对象的编程语言,而c是面向过程的。在c语言中,但凡我遇到一些类似Java的相似对象时,我一般会首选结构体。利用结构体来大致模仿Java的类。但是这样也有非常大的弊端,例如:如果有两个相似但不完全相同的结构时,结构体往往会需要重新定义;对于Java中的多态数组,我目前还没有想到什么好办法在c语言里面再现它。
其实,我在开始学习的时候最不习惯的估计是没有指针的痛苦了。在c语言中,即使没有把变量设置为全局变量,我们仍旧可以通过传指针的方式,来改变变量的值。然而,Java中却没有给我们这种随意访存的权限,我们程序员,只能在函数间传值或者传引用,而没有办法去改变没有传递出来的值。其实关于这一点,我也进行了一些思考,为什么Java的设计者没有开放这一权限?
我觉得,原因大概有二:首先,我们知道,C语言是远远早于Java诞生并投入使用的编程语言,当时可能对于内存安全性等方面的问题尚未有太多的考虑;要知道,在早期Linux系统中甚至可能都不存在病毒等恶意程序的概念,因此C语言的开发者一开始就没有对这方面做很多工作;而后面,C语言格局已定的情况下,后来的版本虽然注意到了这一问题,但也只能进行小规模的修补,而无法从根本上解决。其次,Java这么设计应该考虑了面向对象的特性;因为作为一个个对象,我们很难对其地址所指向的值或状态进行直接解读,而传值,传引用的方式就不会带来此类问题。
===============================================================================================================================================================
下面是我对这三次作业的自己的完成情况进行的一些总结:
&第一次作业(多项式计算)
作为我的第一份Java作业,我所提交的结果可谓是100%伪面向对象风格的代码。由于对Java语言的不熟悉,我选择了从c程序开始做。在codeblocks中编完了C语言版的多项式计算后,我将其很生硬的套用到了Java程序中,虽然也考虑到面型对象的编程语言的特点,而分出了poly,polynomial等类,但是骨子里仍然透露出了浓浓的面向过程的风格。特点有三:
其一:完全不注意使用Java中自带的一些方便的库函数。例如正则表达式的pattern类,很多同学都采用了教程中推荐的正则表达式;而我由于不熟悉,生硬的手撸了一段字符串匹配的代码,说来也好笑,别人10行以内解决的问题,我愣是写了几十行。
其二:没有采用Java的独特的try catch结构,导致我的字符串匹配虽然写了老长,还是被揪出了bug,一出还就是个crash。
其三:就是前面所说的编程风格的问题,对于习惯于通过指针在程序间跳来跳去的我,一下子少了指针这一大杀器,极度不适应。无奈之下,我只好多定义了一个公共类来保存全局变量。
第一次作业结束后,我痛定思痛,回去好好学了面向对象的编程语言,正则表达式,try catch等结构也一一补习了一番。终于在第二次作业前初步掌握了相关内容。
&第二次作业(傻瓜电梯)
第二次作业,我就注意很多了,例如前面所说的第一次作业的一些教训,我都一一小心避开。但是正当我以为我将会交上一份令自己满意的答卷时,没想到天有不测风云,我虽然早早的将代码push到了git平台上,但是经验主义害死人,我误以为还是会和第一次作业一样,oj自动拉取git最新提交,万万没想到,oj的最终提交竟是我很早写的一份错误百出的老版本。通过与老师,助教们的沟通(这里非常感谢老师和助教们的耐心指导),我理解了oj为什么会判定我的老版本为最终提交,并认识到了我没有认真阅读要求的错误。如果说第一次作业是学到了技术,那么我从第二次作业中学到的就是血淋淋的教训了。最终成绩当然在意料之中,很不尽人意。但是吃一堑,长一智,这次的教训比什么教导都来得管用。所以,我从第二次作业中学到的就是宝贵的经验教训了。
&第三次作业(捎带电梯)
第三次作业的捎带电梯是在第二次的傻瓜电梯基础上的进阶版。这次我也有了一个比较严重的决策失误,对于算法,我沿用了第二次的算法,虽然理论上是可行的,但是却造成了代码的逻辑及其复杂,各种漏洞难以修补,直接造成了周二到周三的为期20小时的连续debug。所谓的“沉没成本”大概就是这样了,我一开始没有舍得将已经基本完成的复杂算法直接舍弃,从而造成了后面各种复杂的工作。这一次的作业可以说也是一个很好的教训吧。
总的来说,对于我自己这三次作业的表现,我个人是很不满意的,我也会将这些教训深刻地记住,并在以后的学习中多加注意。
2018.4.2